0

私は、エンティティ コンポーネント ベースの小さなゲーム フレームワークを自分で書こうとしています。基本クラス システムでロジックの問題が発生しました。

問題は、エンティティ (他のエンティティとコンポーネントを含むことができる) とコンポーネント (特定のエンティティにアタッチされている) の 2 つがあることです。

だから私は2つのインターフェースを作りました:

interface IEntity
interface IComponent

そして、それぞれの抽象クラスを作成しました

public class Component implements IComponent
public class Entity extends Sprite implements IEntity, IComponent

問題は、IEntity インターフェイスに関数があることです。

function addComponent( e:Entity )

引数のタイプ i Entity の理由は、Component で Sprite から継承するエンティティ関数を参照する必要があるためです (IEntity タイプではそれを行うことができません)。

しかし、Flash Develop ではエラーとして扱われているようです (Entity クラスでのこの関数の実装)。私は何か間違ったことをしていますか?

編集 :

これはインターフェイスです:

public interface IComponent
{
    function get parentGameObject() : IEntity;
    function set parentGameObject( v:IEntity ) : void;
    function init() : void;
    function dispose() : void;
}

public interface IEntity
{
    function addComponent( c:IComponent ) : IComponent;
    function removeComponent( c:IComponent ) : Boolean;
    function getComponent( type:Class ) : IComponent;
    function hasComponentOfType( type:Class ) : Boolean;
    function addGameObject( child:Entity ) : void;  
}

次に、私の抽象エンティティ クラスは、このインターフェイスの両方を実装し、DisplayObjectContainer から拡張します。これは、各エンティティがそれ自体とその子エンティティをレンダリングする機能を必要とするためです。

問題はそれです :

public function addGameObject( e:Entity ) : void {
    m_components.push( v );

    this.addChild( v );
    v.gameObject = this;
    v.init();
}

無効のようで、エラーは次のとおりです。インターフェイス IEntity のインターフェイス メソッド addGameObject は、クラス Entity の互換性のないシグネチャで実装されています

また、e:IEntity ではなく e:Entity を使用する理由は、DisplayObjectContainer に属する this.addChild( v ) を使用しているためです。

それが私の質問をクリアすることを願っています。

4

2 に答える 2

0

これが私が今のところこの問題を解決した方法です:

各ゲームオブジェクトの機能に対する 3 つの基本的なインターフェース:

public interface IComponent
{
    function get gameObject() : IGameObject;
    function set gameObject( v:IGameObject ) : void;
    function init() : void;
    function dispose() : void;  
}

public interface IDisplayObjectContainer
{
    function get displayContainer() : DisplayObjectContainer;
}

public interface IEntity
{
    function addComponent( c:IComponent ) : IComponent;
    function removeComponent( c:IComponent ) : Boolean;
    function getComponent( type:Class ) : IComponent;
    function hasComponentOfType( type:Class ) : Boolean;    
}

そして今のところ、私の複合 GameObject インターフェイスは、このすべての機能を拡張しています。

public interface IGameObject extends IEntity, IComponent, IDisplayObjectContainer
{
        function addGameObject( g:IGameObject ) : void;
}
于 2013-09-03T18:17:18.743 に答える
0

このエラーがスローされる理由はまだわかりません。 の実装はaddGameObjectこれまでのところ問題ないように見えます ( の使用法はサンプル コードに存在する問題だと思いますか?)。 ただし、パラメーター名は代わりにvあるインターフェイス定義とは異なります。childofeですが、これは AS3 で有効ですが、インターフェイスで定義されている名前を使用してみてください。

実際の質問に関しては、もちろん答えは異なります。一般に、インターフェイスで好きなクラスを参照できますが、ここでの唯一の問題は設計パターンです。

インターフェイスに対するプログラミングを続けたい場合は、次のaddChildように、メソッドの実装を強制するゲーム オブジェクト インターフェイスを作成するだけです。

import flash.display.DisplayObject;

public interface IGameObject extends IComponent, IEntity
{
    function addChild(child:DisplayObject):DisplayObject;
}

IEntityそれに応じてインターフェイス、addGameObjectおよびEntity実装を変更すると、準備が整います。

public interface IEntity
{
    ...
    function addGameObject( child:IGameObject ) : void;  
}
public function addGameObject( child:IGameObject ) : void {
    ...
}
public class Entity extends Sprite implements IGameObject 

混乱を避けるために、名前Entityを次のように変更することをお勧めします。GameObject

于 2013-09-02T22:06:40.133 に答える