javascript - Digger 游戏中的敌人需要自行移动,代码被破坏,我不知道为什么

标签 javascript multithreading compiler-errors artificial-intelligence

在我的 CSSE 类(class)中,我们正在制作 Digger 游戏 http://www.futrega.org/digger/ ,到目前为止我们已经为我们的游戏完成了这些功能 • 从文件加载关卡 • 可以拾取祖母绿获取积分并移动的英雄 • 使用U 和D 在加载级别之间切换。 现在我正在努力让霍宾自行移动(它是吃掉泥土和其他元素的敌人)向英雄移动并改变英雄的生活,这是我迄今为止的移动功能代码。

public void move(){
    int Hero_x = Level.hero.myLocation.getX();
    int Hero_y = Level.hero.myLocation.getY();
    int X = this.myLocation.getX();
    int Y = this.myLocation.getY();
    int speed = 2;
    int x_distance =  Hero_x - X;
    int y_distance = Hero_y - Y;
    double distance = Math.hypot(x_distance, y_distance);
    this.x_velocity = (int) ((speed/distance) * x_distance);
    this.y_velocity = (int) ((speed/distance) * y_distance);
    while(Level.map[X + this.x_velocity][Y + this.y_velocity] instanceof Hero == false) {
        Level.map[X][Y] = new Tunnel(new Coordinate(X, Y));
        if ((X + this.x_velocity) < 0 || (X + this.x_velocity) > this.MAP_WIDTH - 1) {
            this.myLocation.setCoordinate(X, Y);
            Level.map[X][Y] = this;
        } else if ((Y + this.y_velocity) < 0 
                     || (Y + this.y_velocity) > this.MAP_HEIGHT - 1) {
            this.myLocation.setCoordinate(X, Y);
            Level.map[X][Y] = this;
        } else {
            this.myLocation.setCoordinate(X + this.x_velocity, Y + this.y_velocity);
            Level.map[X + this.x_velocity][Y + this.y_velocity] = this;
        }
    }
    if(World.lives == 0) {
        new Main().launch();
    }
    World.lives = World.lives - 1;
    Level.hero.myLocation.setCoordinate(Level.hero.myLocation.getX(),
                                             Level.hero.myLocation.getY());
    Level.map[Level.hero.myLocation.getX()][Level.hero.myLocation.getY()] = Level.hero;
    this.myLocation.setCoordinate(this.Location.getX(), this.Location.getY());
    Level.map[this.myLocation.getX()][this.myLocation.getY()] = this;
}

基本上它的作用是获得 X 和 Y 速度(我在谷歌上搜索,这是关于如何让敌人跟随玩家的答案,但我不知道这是否正确),然后它检查敌人的下一个位置是否是英雄的实例,如果不是,那么我实现的代码只是让它移动,如果它超出了屏幕的边界,那么它就不会移动。然后,如果 while 语句被破坏(Hobbin 的下一个位置是 Hero 的实例),那么它会检查生命是否 = 0,如果是,则重新启动,但如果不是,则减去生命,然后将英雄和霍宾设置回原来的位置,但保持泥土和板上的其他所有东西相同。我把

new Thread(hobbin).start();

在关卡的构造函数中,我认为这应该使 hobbin 在创建新关卡时正确运行。 但是,当我运行代码时,我收到此错误,

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Hobbin.draw(Hobbin.java:71)
    at Level.paintComponent(Level.java:82)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JLayeredPane.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    at java.awt.Container.paint(Unknown Source)
    at java.awt.Window.paint(Unknown Source)
    at javax.swing.RepaintManager$3.run(Unknown Source)
    at javax.swing.RepaintManager$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1100(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

有人能解释一下吗?如果我的代码错误,有人可以解释一下吗?谢谢。

最佳答案

这可能有帮助:

我注意到您担心 AI 代码会破坏您的程序,但错误报告中的情况似乎并非如此。请注意,您收到的空指针异常出现在游戏图形调用阶段的 PaintComponent 调用期间的 hobbin.draw 函数中。

实际错误的可能性是相对路径字符串(如“/mycoolpictures/hobbinframespritesheet.png”)被错误引用或拼写错误......因此您的图像加载器从文件未找到错误中获取空图片,但无论如何都会尝试将其传递到您的游戏中...然后霍宾就完蛋了。

希望这有帮助。

关于javascript - Digger 游戏中的敌人需要自行移动,代码被破坏,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28510334/

相关文章:

java - 公共(public)方法中的 indexOf() java 无法编译

javascript - 使用 PHP、MySQL 和 jQuery 自动填写输入表单

javascript - HighCharts:创建股票图表时出现奇怪的错误

windows - Win32 Event 对象是递归互斥体吗?

c++ - Pthread 程序运行速度随着线程的增加而变慢

c++ - 解密 C++ 模板错误消息

C++ - '(' 标记之前的预期主表达式和 ‘(’ 标记之前缺少的模板参数

javascript - 将相机捕获的图像转换为 base64 - Ionic

Javascript 关闭不起作用

java - 线程池执行器具有优先任务并避免饥饿