2

私のゲームのエンティティ システムは、テンプレートを使用してエンティティの作成方法をレイアウトします。何かのようなもの:

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() メソッドをいくつか試しましたが、保護された変数やプライベート変数では機能しません。

アイデア?

4

1 に答える 1

0

数か月前、私も独自のエンティティ コンポーネント マネージャーを作成しました。私はこのようなことをしました(あなたの場合):

EntityTemplateManager.register("zombie", [
    {type: PhysicsComponent, attr: {speed: 10}},
    {type: SpriteComponent, attr: {graphic: "zombie"}},
    {type: HealthComponent, attr: {health: 100}}
]);

新しいテンプレートの登録は次のように機能します。

private static var definitions:Dictionary = new Dictionary();

public static function register(templateName:String, componentDefinitions:Array):void
{
    definitions[templateName] = componentDefinitions;
}

このcreate関数は、指定されたコンポーネント テンプレートを取得し、次のようにコンポーネントを作成します。

var components:Vector.<Component> = new Vector.<Component>();

// Create all components
for each (var definition:Object in componentDefinitions) {
    var componentClass:Class = definition.type;
    var component:Component = new componentClass();

    // Set default parameters
    for (var prop:String in definition.attr) {
        component[prop] = definition.attr[prop];
    }

    components.push(component);
}

// Then create the entity and attach the freshly created components.
// ...
于 2012-07-10T10:31:14.697 に答える