Container
Containerは、複数のノードをグループ化して管理するためのノードです。階層構造を形成し、子ノードの変形(位置、回転、スケール)を一括で制御できます。ゲーム内のオブジェクト、UI要素、エフェクトなどの管理に不可欠なノードです。
コンテナの作成と子ノードの追加
public class GameScene : Scene{ public override void OnStart() { // コンテナを作成 var gameObjectGroup = new Container();
// 子ノードを追加 var sprite = new Sprite(playerTexture); var healthBar = new Text("HP: 100", Font.GetDefault(), Color.Red);
gameObjectGroup.Add(sprite); gameObjectGroup.Add(healthBar);
// 複数のノードを一度に追加 gameObjectGroup.AddRange(sprite, healthBar);
// シーンに追加 Root.Add(gameObjectGroup); }}階層構造と変形の継承
親子関係
子ノードは親ノードの変形(位置、回転、スケール)を継承します:
// 親コンテナvar parent = new Container() .Location(200, 100) .Scale(2.0f) .Angle(30);
// 子ノード(親からの相対座標で配置)var child1 = new Sprite(texture) .Location(50, 0); // 親から右に50ピクセル
var child2 = new Sprite(texture) .Location(0, 50); // 親から下に50ピクセル
parent.AddRange(child1, child2);Root.Add(parent);
// 結果:// child1の実際の位置: (200 + 50*2, 100 + 0*2) = (300, 100)// child2の実際の位置: (200 + 0*2, 100 + 50*2) = (200, 200)// 両方とも2倍のスケールで30度回転絶対座標と相対座標
var container = new Container().Location(100, 100);var child = new Sprite(texture).Location(50, 50);
container.Add(child);
// 相対座標(コンテナ内での位置)var relativePos = child.Location; // (50, 50)
// 絶対座標(画面上の実際の位置)var absolutePos = child.AbsoluteLocation; // (150, 150)コレクション操作
IEnumerableサポート
ContainerはIEnumerableを実装しているため、様々なコレクション操作が可能です。
var container = new Container();
// ノードを追加container.AddRange(sprite1, sprite2, sprite3);
// foreach文で反復処理foreach (var child in container){ child.IsVisible = true;}
// LINQを使用var sprites = container.OfType<Sprite>().ToList();var visibleNodes = container.Where(n => n.IsVisible).ToList();
// インデックスでアクセスvar firstChild = container[0];var childCount = container.Count;
// 特定のノードの存在確認bool hasSprite = container.Contains(sprite1);ノードの管理
var container = new Container();
// 追加container.Add(newNode);container.Insert(0, firstNode); // 先頭に挿入
// 削除container.Remove(specificNode);container.RemoveAt(0); // インデックスで削除container.Clear(); // 全削除
// 検索var nodeByName = container.FirstOrDefault(n => n.Name == "PlayerSprite");var allSprites = container.OfType<Sprite>();