TLDR: I将数据传递给暴徒的实例化。该实例化过程的一部分涉及为暴徒实例化AI。我希望我传递给暴民的数据被传递给暴民的人工智能。这是很困难的,因为除了其他之外,还有一个强制的Super()调用。
的故事:,我是在游戏中创建自己版本的怪物。
我编写了自己的pathFinders (实体用来导航世界的人工智能目标)。然后,我拿了一个现有的暴民(在这个例子中是一头牛),抹去了它正常的人工智能,用我自己的: PathFinderGoalRpgMeleeAttack代替了它。
我想要创建我的牛的新实例(即RpgCow rpgCow =新的rpgCow(损坏,回扣))。
问题是,当我实例化一个新的暴徒(它扩展了另一个类--记住)时,我被迫调用super()。超级方法调用r()方法(我重写该方法以添加自己的AI)。由于超级()调用r(),损伤和回扣的值仍然是0.0和0.0 (默认的java值为double),因为损坏和回扣还没有被设置的机会。
对于如何绕过这一问题并将传递给牛的数据插入到PathFinder创建中,有什么想法吗?
我听说抽象或反思可能是一件很好的事情,但是仅仅阅读关于这两个主题的文档,似乎对我没有任何帮助。
编辑,因为我想我不是那么清楚:问题是,当我将它们传递到PathFinder中时,损伤和回扣的值仍然是0,这意味着以后当我在我的pathFinder中执行this.getDamage时,不管我在创建时传递给暴民的是什么值,伤害和回扣总是为0。
代码:
public class RpgCow extends EntityCow
{
private double damage;
private double knockback;
public RpgCow(World world, double damage, double knockback)
{
super(world);
this.damage = damage;
this.knockback = knockback;
this.bukkitEntity = new CraftRpgCow(this.world.getServer(), this);
}
@Override
protected void r()
{
this.goalSelector.a(3,new PathFinderGoalRpgMeleeAttack(this,damage,knockback));
}
private static class CraftRpgCow extends CraftCow
{
private CraftRpgCow(CraftServer server, EntityCow parent)
{
super(server, parent);
}
}
}发布于 2017-11-30 19:45:31
如果在超类中对r()进行方法定义,那么r()的任何调用都将使用实例的实现,即使它是在超类的构造函数中调用的。
这可能是一个比在超级()调用之后在子类(RpgCow)的构造函数中调用r()更好的解决方案,根据您的实现,该调用应该覆盖在super()调用中设置的`cow.goalselector‘。
这将要求您的超类是抽象的,但是当您正在用实体/群体编写游戏时,拥有抽象基类是您可能想要的功能。
编辑:另一种方法是将你想要的AI传递给超类的构造函数和r(),如果它是空的,那么执行基类的功能,否则就分配新的AI。接口将是一个方便的方式,使人工智能对象的多形性。
https://stackoverflow.com/questions/47581281
复制相似问题