【enchant.js】ver. 0.6でのGroupの注意点【実験】

先日、enchant.js 0.6がリリースされましたね。
twitterを眺めていると、色々な方の悲鳴が聞こえてきます(笑)。

今回のバージョンアップの目玉は、やはりCanvasベースの描画でしょうか。
というわけでその影響を受けるもののひとつ、Groupについて探ってみました。
まずは以下の2つのコードをご覧下さい。

  • パターン1
// 子ノードを追加した後にGroupのプロパティを操作
var g1 = new Group();
game.rootScene.addChild(g1);
var b1 = new Sprite(32,32);
b1.image = game.asstes['chara1.gif'];
b1.x = b1.y = 160 - 16;
g1.addChild(b1);
g1.originX = g1.originY = 160;
g1.rotation = 45;


  • パターン2
// Groupのプロパティを操作した後に子ノードを追加
var g2 = new Group();
game.rootScene.addChild(g2);
g2.originX = g2.originY = 160;
g2.rotation = 45;
var b2 = new Sprite(32,32);
b2.image = game.asstes['chara1.gif'];
b2.x = b2.y = 160 - 16;
g2.addChild(b2);

違いが分かるでしょうか。
パターン1では、子ノードを追加した後にGroupのプロパティを操作しています。一方、パターン2ではプロパティを操作した後に子ノードを追加しています。
この2つ、感覚的には同じ結果が得られると考えるのですが……なんと! パターン1ではプロパティの操作結果に従って子ノードも回転するのですが、パターン2ではプロパティの捜査結果に子ノードが追従していません! この結果から分かることは、Groupのプロパティ操作の結果は、操作された時点で保持している子ノードに対してのみ有効、ということです。正直、この仕様はどうかな~と思います。

それでは、この仕様に対する方策は何かあるのでしょうか。ベタなところでは、下のパターン3のようにaddChild後に必ずプロパティ操作をする、ですか。

  • パターン3
// Groupのプロパティを操作した後に子ノードを追加、さらにGroupのプロパティを操作
var g3 = new Group();
game.rootScene.addChild(g3);
g3.originX = g3.originY = 160;
g3.rotation = 45;
var b3 = new Sprite(32,32);
b3.image = game.asstes['chara1.gif'];
b3.x = b3.y = 160 - 16;
g3.addChild(b3);
g3.x = g3.x;

マニアックなやり方だと、Groupのハックですね。

  • パターン4
// addChild関数の中でGroupのプロパティを操作
var g4 = new Group();
g4.addChild = function(node) {
    enchant.Group.prototype.addChild.call(this,node);
    this.x = this.x;
};
g4.originX = g3.originY = 160;
g4.rotation = 45;
var b4 = new Sprite(32,32);
b4.image = game.asstes['chara1.gif'];
b4.x = b4.y = 160 - 16;
g4.addChild(b4);

addChild関数の中でプロパティを操作するようにしてしまえば楽ちんです。