【问题标题】:Java Game Object DesignJava 游戏对象设计
【发布时间】:2011-09-01 07:52:03
【问题描述】:

所以我在使用简单的 RTS 设计时遇到了问题。

基本上我想要一个模型和一个控制器,人们可以在其中编写自己的 AI 来玩游戏,所以我需要某种形式的接口,它位于模型和控制器之间,允许玩家控制他们的单位而无需能够“设置”单位中的内容,例如单位统计信息。

所以我想减少代码重用我会使用分层结构来创建一个在 OO 中执行不同操作的单元:

玩家拥有的对象 -> 具有统计数据的对象(健康,攻击) -> 可以攻击的对象 -> 可以移动的对象 -> 单位

所以一个单位是一个对象:玩家拥有,有统计数据,可以攻击,可以移动

我的问题是:如何创建某种形式的接口来处理所有这些继承?因此,如果对象继承了“具有统计信息的对象”以及该单元的其他“属性”,则接口返回统计信息。这种继承可能吗?还是我应该以不同的方式这样做?

我希望这是有道理的! 谢谢

【问题讨论】:

    标签: java oop


    【解决方案1】:

    我认为层次结构不是您所需要的。

    您设置具有统计数据的对象的方式继承自可以攻击的对象。这意味着每个具有统计数据的对象都可以攻击 - 这就是您的意思吗?纯粹的防御对象呢?

    我认为相反,您有许多功能接口,并且某些对象实现了其中的某些功能:

     Monster implements Attacker, Mover, StatProvider, HurtReceiver
    
     TreasureChest implements Attacker, StatProvider, Movable, HurtReceiver
    
     Map implements Movable
    

    【讨论】:

    • 这听起来像是一个危险的宝箱!
    • 是的,你真的不想满足内容;-)
    • 是的,我最终使用了与此非常相似的东西,从处理我的游戏循环的方式(以及通过尝试从不重用代码)我最终使用了抽象处理程序 -> 一个 AttackHandler, MoveHandler,这些处理程序被附加到对象上(因此每当对象被循环更新时都会更新),效果很好!
    【解决方案2】:

    根据你的问题,我假设你有这样的事情:

    public interface Unit extends Owned, StatsProvider, Attacking, Moveable {
      // ...
    }
    

    还有一个具体的实现,比如

    public class Knight implements Unit {
      // ...
    }
    

    现在,例如,如果我们想移动玩家的所有可移动对象,我们可以说

    List<Owned> playerOwnedObjects = getObjectsFor("Carl");  // you know what I mean...
    for (Owned playerOwnedObject:playerOwnedObjects) {
      if (playerOwnedObject instanceof Moveable) {
        ((Moveable) playerOwnedObject).moveTo(getTargetLocation());
      }
    }
    

    希望我没有误解你的问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2011-09-21
      • 2011-04-26
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多