java - 在通过 super() 调用实例化对象后,如何将变量传递到对象中?

标签 java minecraft

TLDR:我将数据传递到生物的实例化中。该实例化过程的一部分涉及为暴徒实例化人工智能。我希望将我传递给生物的数据传递给生物的人工智能。由于强制 Super() 调用等原因,这很困难。

故事: 我正在游戏中创建我自己的怪物版本。

我已经为自己编写了pathFinders(实体用来导航世界的AI目标)。然后我拿了一个现有的生物(在本例中是一头牛)并删除了它的正常 AI 并用我自己的替换它:PathFinderGoalRpgMeleeAttack

我想创建我的牛的新实例(即RpgCow rpgCow = new rpgCow(damage,knockback))。

问题是,当我实例化一个新的生物(记住它扩展了另一个类)时,我被迫调用 super()。 super 方法调用方法 r() (我重写该方法以添加我自己的 AI)。由于 super() 调用了 r(),damageknockback 的值仍然是 0.0 和 0.0(double 的默认 java 值),因为damage 和 knockback 没有尚未确定的机会。

关于如何解决这个问题并将我传递到奶牛创建中的数据插入到 PathFinder 创建中,有什么想法吗?

我听说抽象或反射可能是一件值得研究的好事情,但仅仅阅读有关这两个主题的文档似乎都对我没有帮助。

编辑,因为我想我不太清楚: 问题是,当我将伤害和击退传递到路径查找器时,它们的值仍然为 0,这意味着稍后当我在路径查找器中执行 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);
        }

    }
}

最佳答案

如果您在父类(super class)中将 r() 方法定义为抽象,则对 r() 的任何调用都将使用它的实例实现,即使它是在父类(super class)的构造函数中调用的。

这可能是比在 super() 调用之后在子类 (RpgCow) 的构造函数中调用 r() 更好的解决方案,根据您的实现,这应该覆盖在中设置的 `cow.goalselector'你的 super() 调用。

这将要求您的父类(super class)是抽象的,但是当您使用实体/生物编写游戏时,拥有抽象基类是您可能想要的功能。

编辑:另一种方法是将您想要的 AI 传递到父类(super class)的构造函数和 r() 中,如果它为 null,则执行基类的功能,否则分配新的 AI 。接口(interface)将是一种使 AI 对象多态化的便捷方法。

关于java - 在通过 super() 调用实例化对象后,如何将变量传递到对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581281/

相关文章:

java - 无法放置墙标或编辑其文本

java - Android 计时器更新 TextView (UI)

java - 这个 JSF EL 语句有什么问题?

java - 我的 SQL 使用 java 程序插入值

java - 如何测量在 ubuntu 上运行的 java 应用程序的 I/O 时间?

velocity - 如何在 Spigot 中逐渐应用速度?

java - JSF 在绑定(bind)时抛出参数类型不匹配

java - Shell 脚本不作为 crontab 运行,而是手动运行

java - 通过串行连接将minecraft插件连接到arduino

c - 为什么inotify不更新?