【问题标题】:Array elements not being set correctly未正确设置数组元素
【发布时间】:2013-03-01 15:22:23
【问题描述】:

您好,我有一个子弹对象数组。我将子弹对象 isAlive var 设置为 false。 如果我在不单击空格按钮(触发子弹)的情况下运行代码并打印出数组对象 isAlive var 并将它们全部打印为假(应该如此)。

如果我在项目符号出现在屏幕上并正确移动后单击空格按钮,但是当我打印出显示 isAlive var 的项目符号数组时,它们都设置为 true,具有相同的 x/y 位置。如果我单击空格按钮两次 2 个项目符号出现并正常行进,但是当我打印数组时,它再次显示前十个元素是活动的,具有相同的 x/y 位置(屏幕上的第一个项目符号),接下来的十个元素也具有相同的 x/ y 位置(屏幕上的第二个项目符号)

再按空格键不会添加新的项目符号。 这里;是 fireButton() 的代码

public void fireBullet(){
    if(currentBullet > BULLETS -1){
        currentBullet = 0;
    }
    if(bullet[currentBullet].isAlive()==false){
        bullet[currentBullet].setAlive(true);
        bullet[currentBullet].setxPos(ship.getxPos());
        bullet[currentBullet].setyPos(ship.getyPos());
    }
    currentBullet ++;
}

这是在 KeyPressedMethod 中调用的

case KeyEvent.VK_SPACE: 
        fireBullet();
        break;

任何人都可以看到我哪里出错了吗?现在一直在搞乱代码,这让我很头疼:)

编辑:如果可以的话,我会回答所有问题 :) 1)currentBullet 是一个私有类成员,首先初始化为0,然后在fireBullet() 方法中为每个发射的子弹递增到20,然后重置为0。

2)当我初始化子弹数组时,我为每个元素分配一个新的 Bullet()。每个子弹构造函数都将 isAlive 设置为 false

3) 子弹变量 isAlive 在离开屏幕时被设置回 false 4)这是完整的keypressed方法

public void keyPressed(KeyEvent k) {
    int keyCode = k.getKeyCode();

    switch (keyCode) {

    case KeyEvent.VK_A:
        //move ship left
        if(ship.getxPos()<20){
            ship.setxPos(20);
        }else
        ship.setxPos(ship.getxPos()-1);
        break;
    case KeyEvent.VK_D:
        if(ship.getxPos()>1260){
            ship.setxPos(1260);
        }else
        ship.setxPos(ship.getxPos()+1);
        break;
    case KeyEvent.VK_SPACE: 
        fireBullet();
        break;
    }


}//end keypressed event

我认为渲染没问题,因为它正在绘制项目符号,但将其中的 10 或 20 个相互叠加,因此当运行代码时,您只会看到两个项目符号在屏幕上移动,

问题在于,每次按下空格键时应该只有 1 个活着的子弹,但是一旦所有 20 个子弹都被设置为活着,就按下它!

第二次编辑:我在游戏循环结束时打印出当前子弹,它似乎正在正确递增,这表明每次按下空格键时都会调用 fireBullet() 方法,只是似乎为每个数组填充了活动子弹按

【问题讨论】:

  • 您能否完整地向我们展示您的keyPressed 方法?
  • 另外,尝试在fireBullet() 的开头打印一条消息,并查看每次按空格键时是否正确调用该方法。
  • 你如何设置currentBullet?
  • 'bullet' 数组中的每个项目符号都是独立的对象,对吧?
  • 并没有真正帮助您解决问题,但假设isAlive() 返回一个布尔值,您无需测试它是否为==false。你可以做if (! bullet[currentBullet].isAlive() ){ 这是更好的恕我直言

标签: java arrays logic


【解决方案1】:

谢谢大家让它工作了!就像上面建议的 NPE 一样,我在 fireBullet() 方法和其他 2 个按键中放入了一个小 println。发生的事情是当我在代码中加载'命中'。原来我的paint方法中有addKeyListener(this)而不是JFrame构造函数,老实说不知道它是如何放入paint方法的:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2014-01-16
    • 2020-10-19
    • 2021-11-27
    相关资源
    最近更新 更多