phina.js の小ネタです。
以前に調べて知っていたはずなのに、久しぶりにまた引っかかったので記事に残しておきます。
実のところタイトルがほぼ全てなのですが、それでは寂しいので少し解説を書いてみます。
origin について
Object2D を継承している各クラスは origin で座標の基準を指定することが出来ます。
(0.0, 0.0) で左上が、(0.5, 0.5) で真ん中が、(1.0, 1.0) では右下が基準になります。
0.0 ~ 1.0 の範囲外を指定することで図形の外に基準を置くことも出来ます。
ちなみにデフォルトは (0.5, 0.5) です。
参考: [phina.js-Tips] Shapeの原点を変更する
Shape の origin
ここからが本題です。
RectangleShape などの各 Shape も Object2D を継承していますので、もちろん origin を指定できます。
ただし Shape を継承したクラスの場合は origin による座標の計算時に width や height だけでなく padding も考慮されます。
例えば RectangleShape の場合 origin の (0, 0) は矩形の左上ではなく矩形からさらに padding 分左上の位置になります。
こんな感じです。
phina.globalize();
phina.define('MainScene', {
superClass: 'DisplayScene',
init: function(params) {
this.superInit(params);
// シーンの背景を赤にしておく
this.backgroundColor = "red";
// シーンと同じ大きさの矩形を左上に合わせて追加(したつもり)
var rect = RectangleShape()
.setOrigin(0.0, 0.0)
.setPosition(0, 0)
.setSize(this.width, this.height)
.addChildTo(this);
},
});
phina.main(function() {
// 結果を見やすくするためにゲームサイズを小さくする
GameApp({
width: 100,
height: 100,
startLabel: 'main'
}).run();
});
コードだけ見るとシーン全体を矩形で埋め尽くしそうな気がしますが、実際には padding 分右下にずれて描画されました。
ちなみに padding のデフォルトは 8 です。
padding について
上の例では padding を 0 にすることで矩形がシーンにぴったり重なるようになります。
しかし padding のデフォルトがなぜ 0 ではないのか? あるいはそもそも padding の役割は? といった話はググっても全然ヒットしませんでした。
なので、元の話題からちょっと派生して padding についても簡単に書いておきます。
Shape の派生クラスでは stroke と strokeWidth で枠を描画することが出来ます。
そしてこの枠は strokeWidth の半分の幅で元の図形の外側に描画されます。
例えば、
var rect = RectangleShape({
width: 100,
height: 100,
stroke: "red",
strokeWidth: 10
});
と指定すると、縦横 100px の矩形の外側に幅 5px の赤い枠が描画されます。
ここでもし padding を 0 にしてしまうと、この赤い枠が描画されなくなります。
なぜなら RectangleShape では、width および height で指定された範囲 + padding 分の領域だけシーンに描画される仕組みになっているためです1。
padding のデフォルトは 8 でしたので、strokeWidth が 16 を超えると、それ以上いくら数字を大きくしても枠は太くなりません2。
この場合 padding をその分大きくすることで描画されるようになります。
なお shadow と shadowBlur を指定する場合も同様です。
