Java 使用接口实现预先编码的功能

Java 使用接口实现预先编码的功能,java,Java,我正在做一个游戏,里面有不同类型的暴徒。还有一个接口列表,每个接口代表一个暴徒可以拥有的能力。假设我有100个对象扩展了mob类,每个对象都包含不同的mob适用能力列表(摆动、爆炸、跳跃等)。实现这些接口所要做的就是向类中添加空白方法。如果该技能在所有怪物之间的使用是恒定的,我该如何使它如此稳定 预先编写,这样我就不需要为每个实现它的暴徒再次编写它了 我知道默认方法,但它们是静态的,并且不能访问mob的任何变量,除非我将“this”作为参数传递,这是我不想做的 我也知道,如果要用接口解决问题,那

我正在做一个游戏,里面有不同类型的暴徒。还有一个接口列表,每个接口代表一个暴徒可以拥有的能力。假设我有100个对象扩展了mob类,每个对象都包含不同的mob适用能力列表(摆动、爆炸、跳跃等)。实现这些接口所要做的就是向类中添加空白方法。如果该技能在所有怪物之间的使用是恒定的,我该如何使它如此稳定 预先编写,这样我就不需要为每个实现它的暴徒再次编写它了

我知道默认方法,但它们是静态的,并且不能访问mob的任何变量,除非我将“this”作为参数传递,这是我不想做的

我也知道,如果要用接口解决问题,那么这些接口只能由一群暴徒来实现


谢谢。

如果我理解正确,一个可能的解决办法是组合技能,而不是继承它们

interface Ability {
    void doAbility();
}

class Firebending implements Ability {
    private Mob mob;

    public Firebending(Mob mob) {
        this.mob = mob;
    }

    void doAbility() {
        // mutate mob's state to spit fire, and attack the world
    }
} // repeat this for each ability you have, flying, x-ray vision, doing taxes etc

class Mob {
    private Ability[] abilities;

    public Mob(Ability[] abilities) {
        this.abilities = abilities;
    }
}

有了这样的东西,你可以在飞行中建立不同的怪物,每个都有不同的能力,适合当怪物种类超过能力数量时使用。是的,这将涉及到将你的暴民类设计成灵活的,可以通过这种方式进行变异。

这是一个很酷的问题,也是我反复思考的问题。事实证明,您可能会陷入代码陷阱,这主要是由于严格的面向对象设计方法。在编写了许多游戏引擎之后,我可能会提出另一种思考过程

想象一下,如果你有一个需要盾牌和剑的骷髅,但在任何时候都可能没有盾牌,你可能会把它扔了,或者反过来把剑扔了(或者两者都扔了)。要仅使用面向对象设计编写此代码,我们将尝试从骨架中进行子类划分,并扩展类,使其具有带有剑实例的骨架,但是使用盾牌、剑盾或两者兼而有之,或者两者都不存在,如何处理。为了实现这一点,你可以猛击它并强制OOP设计,但与所有事情一样,最终游戏设计师会要求你以某种方式更改骨架,这将导致重大的代码更改,你可以忘记松散耦合的对象共享(比如骨架放下剑,骑士拿起剑)

在处理了这个问题并了解了你现在的处境后,我建议研究一个新的方法

在这里,游戏资产分为实体、组件和系统

实体:是一个简单的整数列表,其中每个整数都是一个组件id。这允许在任何其他组件之间共享组件,如SwardComponent。将实体视为系统可用于执行某些游戏操作的组件集合

组件:组件是一个简单的类,只包含数据字段,从不包含实现。每个组件都获得一个唯一的ID和定义组件所需的特定字段。在这里,我发现可以使用OOP对组件类进行子类化,因此我实际上使用了两种方法的混合

系统:系统是事物变得有趣的地方。虽然实体只是组合组件的列表,组件只是数据和状态信息,但系统对组件数据进行操作以使实体工作。在这里,您可以传入一个实体,并对数据执行一些游戏逻辑操作。系统是您放置代码的地方,代码使每个实体打勾

下面是我们的框架示例的概要:

Component[0]: Skeleton Mesh 
Component[1]: Idle Animation  
Component[2]: Walk Animation 
Component[3]: Run Animation 
Component[4]: Collision 
Component[5]: Sound 
Component[6]: Sword 
Component[7]: Shield 
Component[8]: Clown Suit
骨架实体:

Entity[0] = new int {0,1,2,3,4,5,6,7,8} // Defines all the components above into one character
可能的系统:

System[0] = Collision system handles polygon collisions, using all entities collision components.
System[1] = Animation system uses idle, walk, and run animation components and can be shared across entities.
System[2] = Render system is used to render the mesh using your render engine. 
System[3] = Sound system is used to handle sound start, end, tween...
System[4] = ...

现在,如果设计师希望骨架能够长出翅膀并飞翔,我不担心更改任何以前的代码,我只需创建一个新的WingsComponent,将其添加到我的entities component列表中,并对新系统进行编码,使骨架飞翔。现在我可以自由扩展我的组件和系统池,而不用担心破坏更改

使用继承并为可以访问私有属性的基本mob类创建getter和setter。然后将启用特定mob功能的方法重写或添加到重写类中。我想你可能也会对静态方法和继承方法感到困惑。这是我最初打算做的,但后来我意识到这会有多痛苦。如果我有100种不同的能力,而且由于任何怪物都可以实现任意数量的能力,我必须创建大量的子类,每当我添加一个新的怪物时,我必须完全改变继承树以进行优化。这正是我想要做的。非常感谢。嗯,有一个循环依赖关系。。。但我认为这是可以不费吹灰之力解决的。很高兴能帮忙!我可能在游戏中实际使用了组件的概念。例如,我有一个名为“资产”的类,它包含游戏中每个图像的静态列表。为了让对象获得图像,它需要在图像添加到图像库时设置ID。这是一个组件的示例吗?另外,您在这里说的是让每个实体完全由控制其每个动作的组件列表组成吗?如果需要将传统信息存储在某个地方怎么办?(位置、进攻阶段等)读读这里,比约恩阶级是他的实体。