如何用Java编写可靠的Pure Aggregation(组合)游戏对象?

Rob*_*oli 9 java interface composition game-engine

所以我刚开始用Java编写游戏,我正在编写我的游戏对象.现在我已经在Evolve Your Hierarchy中读到,你应该将游戏构建为组合而不是大类层次结构.由于上一个链接中的图像显示:

在此输入图像描述

但是,当实际开始实现时,我有一个关于在哪里应用接口的小问题.

假设你有一个叫做Player的类,接口是Moveable和Renderable.您是使用公共接口变量实现的:

class Player {
    public Moveable moveable;
    public Renderable renderable;
}

class GenericMoveable implements Moveable {
    // Function implementations
}

class PlayerRenderable implements Renderable {
    // Function implementations
}   
Run Code Online (Sandbox Code Playgroud)

或者您尝试通过将接口直接应用于对象来执行此操作:

class Player implements Moveable, Renderable {
    private GenericMoveable genericMoveable;

    // Non-direct Implementation of Moveable
    void someMoveFunc(double x, double y) {
        genericMoveable.someMoveFunc(x, y);
    }

    // Direct implementation of Renderable
    void someRenderableFunction() {
        // Player class specific code
    }
}

class GenericMoveable implements Moveable {
    // Function implementations
}
Run Code Online (Sandbox Code Playgroud)

现在我觉得第二种方法更好.主要原因是因为我可以创建以下列表:

List<Renderable> renderObjects; // use this to draw all of the objects to the screen
List<Moveable> moveObjects; // use this to move all objects at once
Run Code Online (Sandbox Code Playgroud)

我真的只是想确认我是在正确的轨道上.我很确定在通过Java游戏合成创建游戏对象时,您希望将接口直接应用于相关游戏对象,然后在需要时使用私有接口,并为其余部分直接实现这些功能.它是否正确?我正在做的事情的积极和消极是什么?

虽然,虽然我们在这里,但在Java中的Compositional Game Objects的实现中还需要注意什么?我该怎么办?感谢您提前做出的任何回复,感谢您的帮助.

Ted*_*opp 2

这是一个有趣的链接。我猜你对你的类的想法Player就是那篇​​文章所说的组件容器。为此,在我看来,将接口应用到类中似乎是一种可行的方法。这是引导您获得纯聚合结构的唯一途径(您的系统中不再有Player本身

顺便说一句,您提出的结构基本上是委托设计模式的应用。APlayer依赖将Movement所有移动操作委托给对象,并且它不关心Movement它必须使用哪种特定类型的对象。