当前位置: 首页 > 知识库问答 >
问题:

子弹不会自行脱落

刘丰羽
2023-03-14

我目前正在尝试做一个小游戏。目的是飞来飞去拍摄和收集物品。我已经想出了如何射击我想要的。然而,我的子弹在出界后不会被移除,这给了我一个java.lang.NullPointerExc0019错误。任何帮助将不胜感激!

public class Hero extends Player {

    public int bulletCount = 0;

    public void act() {
        checkFire();
        bulletCount++;
    }

    public void checkFire() {
        if (bulletCount % 10 == 0) {
            bulletCount = 0;

            if (Greenfoot.isKeyDown("space")) {
                int x = getX(), y = getY();
                Bullet bullet = new Bullet(x, y, rotation);               
                getWorld().addObject(bullet, getX(), getY());            
            }
        }
    }
}



public class Bullet extends Player {

    private int speed = 10;

    public Bullet(int x, int y, int rotation) {
        setLocation(x,y);
        setRotation(rotation);
    }

    public void act() {
        move(speed);
        checkBoundaries();
    }

    public void checkBoundaries() {
        if (getX() > getWorld().getWidth() - 10) 
            getWorld().removeObject(this);
        else if (getX() < 10) 
            getWorld().removeObject(this);

        if (getY() > getWorld().getHeight() - 10) 
            getWorld().removeObject(this);
        else if (getY() < 10) 
            getWorld().removeObject(this);
    }
}

public class Enemy extends Actor{

    public void killHero()
{
    Actor hero1 = getOneIntersectingObject(Hero.class);
    if(hero1 != null) {                  
        World world;
        world = getWorld();
        LivesCounter livescounter = new LivesCounter();
        this.setLocation(Greenfoot.getRandomNumber(world.getWidth()), Greenfoot.getRandomNumber(world.getHeight()));
        hero.lives--;
    }
}


public class GameScreen extends World
{

public GameScreen()
{    
    super(600, 400, 1); 
    prepare();
}

private void prepare()
{
    Hero hero = new Hero();
    addObject(hero,114,197);
    Enemy enemy = new Enemy();
    Asteroid asteroid = new Asteroid();
    addObject(asteroid,150,72);
    Girl girl = new Girl();
    addObject(girl,285,72);
    Alien alien = new Alien();
    addObject(alien,503,191);
    Boy boy = new Boy();
    addObject(boy,477,75);
}

}

子弹可以击中并摧毁我的小行星,但不能摧毁我的外星人,因为某些奇怪的原因,但我会在我的子弹消失后弄明白这一点。如果我的子弹击中了世界的边缘。如果我在拍摄时接近世界边缘,我会出错。

共有1个答案

叶展
2023-03-14

你不能调用getX()或getY()后,你把自己从世界。如果子弹向左或向右离开,它仍在检查其垂直边界。有两种方法可以解决这个问题。最简单的方法就是用ther把你的两个if连在一起:

public void checkBoundaries() {
        if (getX() > getWorld().getWidth() - 10) 
            getWorld().removeObject(this);
        else if (getX() < 10) 
            getWorld().removeObject(this);
        else if (getY() > getWorld().getHeight() - 10)  // <--- Now an else here
            getWorld().removeObject(this);
        else if (getY() < 10) 
            getWorld().removeObject(this);
    }

这样可以避免在从世界中删除后调用getY()。

 类似资料:
  • 你好,所以我只能看到子弹,当我关闭我的游戏的窗口,但我没有看到错误。导入py游戏,数学,随机,操作系统pygame.init()时钟=pygame.time.时钟()宽度=800高度=608屏幕=pygame.display.set_mode((宽度,高度))运行=真正的游戏结束=假水平=假水平=0费迪格=假跳转=假

  • 首先,我要用大炮射击一架飞机。我已经设定了弹道的时间线,但我没有看到子弹在我的现场。很可能我的轨迹代码不正确。我试着在网上看关于抛射运动的公式,但我对物理一无所知;

  • 问题内容: 我有一个swing应用程序,在其中可以在JPanel中显示图像。如果应用程序无法生成图像,我想从JPanel中删除前一个图像,并用JTextField和消息替换它。我可以添加文本字段,但是它是在先前内容的顶部绘制的,该内容本身是JPanel的子类。这是我所拥有的: 如何获得cdPanel完全重绘自身? 问题答案: 您可以简单地尝试致电: 代替

  • 问题内容: 我有要并行处理的元素的集合。当我使用时,并行性有效。但是,当我使用时,它不会并行运行。 我写了一个代码样本来说明问题: 这是我在Windows 7上获得的输出 我们可以看到中的第一个元素必须在处理第二个元素之前完成。对于,第二个元素在第一个元素结束之前开始。 您能否告诉我是什么原因导致此问题,以及如何使用集合避免发生此问题? 问题答案: 我可以重现您看到的行为,其中并行性与您指定的fo

  • 所以我知道碰撞组和过滤器等。但是我需要一种方法来检查子弹是否来自同一个玩家。如果这只是在客户端上,那很容易,因为我可以为玩家自己的子弹创建一个碰撞组,为敌人的子弹创建一个冲突组,但是由于服务器是检测碰撞的服务器,因此没有“客户端”玩家,每个玩家和子弹都被视为相同,除了附加到子弹的用户数据有一个uid。 所以基本上我想要这样的东西-

  • 子弹图用作衡量标准或指标以显示措施的表现。它可以使用子弹图比较两种测量方法。 子弹图也是条形图的变体。在子弹图中,我们在找到第一个度量和第二个度量之间的差异的上下文中将一个度量的值与另一个度量进行比较。 它就像是两个相互绘制的条形图,用于在图形中的相同位置指示它们的值。它可以用作将两个图组合为一个以容易地查看比较结果。 例如,考虑数据源:Sample-Superstore,要将Estimated