|
1 | 1 | # CreateJS の表示オブジェクトの親子構造 |
2 | 2 |
|
3 | | -シェイプやテキスト、ビットマップなどの表示オブジェクトは、親子構造を使うことでまとめて管理することができます。 |
| 3 | +シェイプやテキスト、ビットマップなどの表示オブジェクトは、親子の入れ子関係をつくり、その**階層全体を「表示リスト」(ディスプレイ・リスト)としてまとめられます**。表示リストはアニメーションやインタラクションを扱うのに便利な仕組みで、多くのプログラム言語で採用されています。 |
4 | 4 |
|
5 | 5 | 親子関係を構築すると、親の位置、角度、スケール、カラー、ブレンドなどの設定が、子孫にも継承されるようになります。表示オブジェクトは親のプロパティーによって、子の表示も影響を受けるので、グループ化して表示の制御を行いたい場合に便利です。 |
6 | 6 |
|
7 | | -`createjs.Container`クラスを使うことで表示オブジェクトの親子構造を作ることができます。`createjs.Container`のインスタンスの中に、別の`createjs.Container`インスタンスを追加することもできるので、何重にもネストすることが可能です。 |
8 | 7 |
|
9 | | -`createjs.Container`(およびそのサブクラス)が子の表示オブジェクトを管理する仕組みをディスプレイリストと呼ばれます。 |
| 8 | +## 使い方 |
| 9 | + |
| 10 | +`createjs.Container`クラスは次のようにして利用します。`createjs.Container`インスタンスの`addChild()`メソッドで、任意の表示オブジェクトを追加できます。 |
10 | 11 |
|
11 | 12 |
|
12 | 13 | 書式 |
| 14 | + |
| 15 | +```js |
| 16 | +var コンテナ = new createjs.Container(); |
| 17 | +stage.addChild(コンテナ); |
| 18 | +コンテナ.addChild(表示オブジェクト); |
| 19 | +``` |
| 20 | + |
| 21 | +このクラスを使うことで表示リストを作れるのですが、上記のコードの場合、表示リストは次の構造になります。 |
| 22 | + |
| 23 | +``` |
| 24 | +□ stage |
| 25 | + └□ コンテナ |
| 26 | + └□ 表示オブジェクト |
| 27 | +``` |
| 28 | + |
| 29 | +## サンプルで表示リストを理解しよう1 (シンプルな移動) |
| 30 | + |
| 31 | +赤と青の2つの円を、右方向に移動させるサンプルを試してみましょう。同時に2つの円を動かしたい場合、赤と青のそれぞれの円の`x`座標を変更する必要がありました。しかし、`createjs.Container`を使うことで、親の座標を変更することで、同時に赤と青の2つの円を、右方向に移動させています。 |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +- [サンプルを再生する](https://ics-creative.github.io/tutorial-createjs/samples/container_simple.html) |
| 37 | +- [サンプルのソースコードを確認する](../samples/container_simple.html) |
| 38 | + |
| 39 | + |
| 40 | +このサンプルの場合、表示リストは次の構造になります。 |
| 41 | + |
| 42 | +``` |
| 43 | +□ stage |
| 44 | + └□ container |
| 45 | + ├□ shape1 (赤い円) |
| 46 | + └□ shape2 (青い円) |
| 47 | +``` |
| 48 | + |
| 49 | + |
| 50 | +コードを読み解きながらサンプルを理解していきましょう。まずは、親となる入れ物(`container`インスタンス)を用意します。 |
| 51 | + |
13 | 52 | ```js |
| 53 | +// Stageの作成 |
| 54 | +var stage = new createjs.Stage("myCanvas"); |
| 55 | + |
| 56 | +// コンテナー(グループの親)を作成 |
14 | 57 | var container = new createjs.Container(); |
15 | | -container.addChild(表示オブジェクト); |
16 | | -stage.addChild(container); |
| 58 | +container.x = 0; |
| 59 | +container.y = 0; |
| 60 | +stage.addChild(container); // 画面に追加 |
| 61 | +``` |
| 62 | + |
| 63 | + |
| 64 | +そこに2個の`createjs.Shape`オブジェクトを上下に配置するように`addChild()`メソッドを使って追加しています。2つの円を直接`stage`インスタンスに追加するのではなく、`container`インスタンスに追加していることがポイントです。 |
| 65 | + |
| 66 | +```js |
| 67 | +// 1つ目の円を作成 |
| 68 | +var circle1 = new createjs.Shape(); |
| 69 | +circle1.graphics.beginFill("DarkRed").drawCircle(0, 0, 50); |
| 70 | +circle1.y = 100; |
| 71 | + |
| 72 | +// 2つ目の円を作成 |
| 73 | +var circle2 = new createjs.Shape(); |
| 74 | +circle2.graphics.beginFill("Blue").drawCircle(0, 0, 50); |
| 75 | +circle2.y = 300; |
| 76 | + |
| 77 | +// 2つの円を親に追加 |
| 78 | +container.addChild(circle1); |
| 79 | +container.addChild(circle2); |
| 80 | +``` |
| 81 | + |
| 82 | +`tick()`関数では`container`インスタンスの`x`プロパティーのみ変化させます。そうすると、`container`インスタンス内に追加した`createjs.Shape`オブジェクトがまとめて右方向に移動することが確認できます。親となる`container`インスタンスだけしか制御していませんが、このように子供の表示オブジェクトも、まとめて移動制御ができるのです。 |
| 83 | + |
| 84 | +```js |
| 85 | +createjs.Ticker.addEventListener("tick", handleTick); |
| 86 | +function handleTick() { |
| 87 | + // 親だけを移動 |
| 88 | + container.x += 1; |
| 89 | + if (container.x > 960) { // 画面端まで移動したら、元に戻す |
| 90 | + container.x = 0; |
| 91 | + } |
| 92 | + stage.update(); |
| 93 | +} |
17 | 94 | ``` |
18 | 95 |
|
19 | | -サンプルでは、親となる入れ物(`container`インスタンス)を用意して、そこに10個の`createjs.Shape`オブジェクトを円周上に配置するように`addChild()`メソッドを使って追加しています。`tick()`関数では`container`インスタンスしか`rotation`プロパティーを変化させていませんが、`container`インスタンス内に追加した`createjs.Shape`オブジェクトがまとめて移動しています。このように表示オブジェクトをネストさせることで、まとめてオブジェクトの移動や回転、拡縮の制御が容易にすることができます。 |
| 96 | +## サンプルで表示リストを理解しよう2 (回転挙動) |
20 | 97 |
|
| 98 | +`createjs.Container`でグループ化できるのは座標だけではありません。角度やスケールなど、表示に関するほとんどの属性を継承します。次のサンプルで角度に対して表示リストが適用されていることを確認していきたいと思います。複数のShapeオブジェクトが円周上を移動しています。 |
21 | 99 |
|
22 | 100 |  |
23 | 101 |
|
24 | 102 | - [サンプルを再生する](https://ics-creative.github.io/tutorial-createjs/samples/container_nest.html) |
25 | 103 | - [サンプルのソースコードを確認する](../samples/container_nest.html) |
26 | 104 |
|
| 105 | +サンプルのコードを読み解きながらサンプルを理解していきましょう。まずは、親となる入れ物(`container`インスタンス)を用意します。画面の中央に配置されるように、`x`と`y`座標のみを設定します。 |
27 | 106 |
|
28 | | -複数のShapeオブジェクトが円周上を移動している |
| 107 | +```js |
| 108 | +// コンテナー(グループの親)を作成 |
| 109 | +var container = new createjs.Container(); |
| 110 | +container.x = 300; |
| 111 | +container.y = 300; |
| 112 | +stage.addChild(container); // 画面に追加 |
| 113 | +``` |
29 | 114 |
|
| 115 | +次に親となる入れ物(`container`インスタンス)に、10個の`createjs.Shape`オブジェクト(子供)を`addChild()`メソッドを使って追加しています。円周上に配置するように、`for`文を利用しつつ、子供の座標は三角関数を使って計算しています。 |
30 | 116 |
|
31 | | -※`createjs.Container`クラスの詳しい使い方は「[公式ドキュメント(英語)](http://createjs.com/docs/easeljs/classes/Container.html)」を確認ください。 |
| 117 | +```js |
| 118 | + |
| 119 | +// ループ分で10回 |
| 120 | +for (var i = 0; i < 10; i++) { |
| 121 | + // 円を作成し |
| 122 | + var ball = new createjs.Shape(); |
| 123 | + ball.graphics |
| 124 | + .beginFill("DarkRed") |
| 125 | + .drawCircle(0, 0, 50); |
| 126 | + // 円周上に配置 |
| 127 | + ball.x = 200 * Math.sin(i * 360 / 10 * Math.PI / 180); |
| 128 | + ball.y = 200 * Math.cos(i * 360 / 10 * Math.PI / 180); |
| 129 | + // グループに追加 |
| 130 | + container.addChild(ball); |
| 131 | +} |
| 132 | +``` |
| 133 | + |
| 134 | +この処理によって、表示リストは次の構造になります。 |
| 135 | + |
| 136 | +``` |
| 137 | +□ stage |
| 138 | + └□ container |
| 139 | + ├□ ball (0個目) |
| 140 | + ├□ ball (1個目) |
| 141 | + ├□ ball (2個目) |
| 142 | + ├□ ball (3個目) |
| 143 | + ├□ ball (4個目) |
| 144 | + ├□ ball (5個目) |
| 145 | + ├□ ball (6個目) |
| 146 | + ├□ ball (7個目) |
| 147 | + ├□ ball (8個目) |
| 148 | + └□ ball (9個目) |
| 149 | +``` |
32 | 150 |
|
33 | | -[次の記事へ](displayobject_remove.md) |
34 | 151 |
|
| 152 | +`tick()`関数では`container`インスタンスの`rotation`プロパティーのみを変化させます。`rotation`プロパティーしか制御していないにも関わらず、`container`インスタンス内に追加した`createjs.Shape`オブジェクトがまとめて移動します。 |
35 | 153 |
|
| 154 | +```js |
| 155 | +createjs.Ticker.addEventListener("tick", handleTick); |
| 156 | +function handleTick() { |
| 157 | + // 親だけを回転 |
| 158 | + container.rotation += 1; |
| 159 | + stage.update(); |
| 160 | +} |
| 161 | +``` |
| 162 | + |
| 163 | +このように表示リストにまとめることで、まとめてオブジェクトの移動や回転、拡縮の制御が容易にすることができます。 |
36 | 164 |
|
| 165 | +## 補足 |
| 166 | + |
| 167 | +- `addChild()`メソッドで後に追加されたものほど上に表示されます。子オブジェクトはインデックスで管理され、インデックス `0` が最背面のオブジェクトになります。 |
| 168 | +- `createjs.Container`のインスタンスの中に、別の`createjs.Container`インスタンスを追加することもできるので、何重にもネストすることが可能です。 |
| 169 | +- `createjs.Container`(およびそのサブクラス)が子の表示オブジェクトを管理する仕組みを表示リスト(ディスプレイ・リスト)と呼ばれます。 |
| 170 | +- `createjs.Container`クラスの詳しい使い方は「[公式ドキュメント(英語)](http://createjs.com/docs/easeljs/classes/Container.html)」を確認ください。 |
| 171 | + |
| 172 | +[次の記事へ](displayobject_remove.md) |
37 | 173 |
|
38 | 174 | <article-author>[池田 泰延](https://twitter.com/clockmaker)</article-author> |
39 | 175 | <article-date-published>2015-11-22</article-date-published> |
40 | | -<article-date-modified>2015-12-27</article-date-modified> |
| 176 | +<article-date-modified>2016-10-24</article-date-modified> |
0 commit comments