私のゲームのエンティティ システムは、テンプレートを使用してエンティティの作成方法をレイアウトします。何かのようなもの:
EntityTemplateManager.register("zombie",
new PhysicsComponent(10), // speed
new SpriteComponent("zombie"), // graphic
new HealthComponent(100) // health
);
システムのこの部分が気に入っているのは、パラメーターを見逃したり、型を台無しにしたりしないようにするためです。
次に、次のような新しいエンティティを作成できます。
entity : Entity = EntityTemplateManager.create("zombie");
かなり簡単です。
エンティティを実際に作成するために、EntityTemplateManagerにデフォルトとして使用するエンティティを1つ作成させてから、エンティティでclone()を呼び出し、そのすべてのコンポーネントを通過してclone()し、結果を返します.
実際のコード:
public function clone() : Entity
{
var components : Vector.<Component> = new Vector.<Component>();
var length : int = _components.length;
for (var i : int = 0; i < length; ++i)
components.push(_components[i].clone()); // copy my local components to the new entity
return new Entity(_name, _type, components);
}
問題は、新しいコンポーネントを作成 (設計) するたびに、その内部に clone() メソッドを記述 (設計) し、コンストラクターで呼び出されたすべてのパラメーターを追跡して、新しいデフォルトを作成する必要があることです。記載されているコンポーネント。
だから私はこのようなジャンクになってしまいます:
public class ComponentX
{
protected var _defaultName : String;
protected var _defaultStartingAnimation : String;
protected var _defaultBroadcastAnimationEnded : Boolean;
protected var _defaultOffsetX : Number;
protected var _defaultOffsetY : Number;
// other stuff hidden
public function ComponentX(name : String, startingAnimation : String, broadcastAnimationEnded : Boolean = false, offsetX : Number = 0, offsetY : Number = 0) : void
{
super();
_defaultName = name;
_defaultStartingAnimation = startingAnimation;
_defaultBroadcastAnimationEnded = broadcastAnimationEnded;
_defaultOffsetX = offsetX;
_defaultOffsetY = offsetY;
}
public function clone() : Component
{
return new ComponentX(_defaultName, _defaultStartingAnimation, _defaultBroadcastAnimationEnded, _defaultOffsetX, _defaultOffsetY);
}
// other methods
}
私はこれが本当に好きではありません - それは無駄が多く、エラーが発生しやすいです。
EntityTemplateManager.register() 関数のパラメーター (コンポーネントのコンストラクターのパラメーターを含む) を保存し、代わりにその新しいストレージを使用してエンティティを作成するにはどうすればよいでしょうか?
ByteArray や describeType() などの一般的な clone() メソッドをいくつか試しましたが、保護された変数やプライベート変数では機能しません。
アイデア?