0

我正在尝试为自己编写一个基于实体组件的小游戏框架。我刚刚遇到了我的基类系统的逻辑问题。

问题是我有两个东西,实体(可以包含其他实体和组件)和组件(它们附加到某个实体)。

所以我做了两个接口:

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:Entity 而不是 e:IEntity 的原因是因为我使用的是 this.addChild(v),它属于 DisplayObjectContainer。

希望这能解决我的问题。

4

2 回答 2

0

这就是我现在解决这个问题的方法:

每个 GameObject 功能的三个基本接口:

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存在的问题?),尽管参数名称与它所在的接口定义不同childe,但是 AFAIK 这在 AS3 中是有效的,但是尝试使用接口中定义的名称。

关于实际问题,答案当然取决于。通常,您可以在接口中引用您喜欢的任何类,这里唯一的问题应该是设计模式。

如果您想继续针对接口进行编程,那么您可以简单地创建一个强制实现该addChild方法的游戏对象接口,如下所示:

import flash.display.DisplayObject;

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

相应地更改您的IEntity界面,您的addGameObjectEntity实现,您应该很高兴:

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 回答