0

最近,我一直在使用Greenfoot,我想做一个简单的自上而下/弹幕射击游戏。一切都很顺利,直到我尝试了一些动作。使用旧的“箭头键移动,空间射击”很简单,但是当我尝试沿对角线左上角或右下角移动并同时射击时,问题就出现了。我一次只能做一个。我注意到方向与它们在 else-if 调用中的位置相关,但这让我无处可去。我也尝试过移动代码,替换 fire() 调用;完全使用 if 检查,但没有任何改变。

    import greenfoot.*;

    /**
     * Write a description of class PlayerShip here.
     * 
     * @author (your name) 
     * @version (a version number or a date)
     */
    public class PlayerShip extends SmoothMover
    {
        private int stepSize = 4;
        private boolean tiltLeft = false;
        private boolean tiltRight = false;
        private int tiltFrame = 1;
        private int flameFrame = 0;
        private final int COOLDOWN = 20;
        private int armsCool = 0;
        public PlayerShip()
        {
        }
        /**
         * Act - do whatever the PlayerShip wants to do. This method is called whenever
         * the 'Act' or 'Run' button gets pressed in the environment.
         */
        public void act() 
        {
            setImage();
            if(Greenfoot.isKeyDown("left") && Greenfoot.isKeyDown("right"))
            {
                tiltFrame = 1;
            }
            move();
            fire();
            armsCool ++;
        }

        public void setImage()
        {
            if(Greenfoot.isKeyDown("up"))
            {
                setLocation(getX(), getY() - stepSize - 2);
            }
            else if(Greenfoot.isKeyDown("down"))
            {
                setLocation(getX(), getY() + stepSize + 2);
            }
            if (Greenfoot.isKeyDown("left")) { 
                setLocation(getX() - stepSize, getY());
                tiltLeft = true;
                if(tiltFrame == 1)
                {
                    setImage("LeftTilt1.png");
                    tiltFrame ++;
                }
                else if(tiltFrame == 2)
                {
                    setImage("LeftTilt2.png");
                    tiltFrame++;
                }
                else if(tiltFrame == 3)
                {
                    setImage("LeftTilt3.png");
                    tiltFrame++;
                }
                else
                {
                    if(flameFrame == 1)
                    {
                        setImage("LeftTilt.png");
                        flameFrame --;
                    }
                    else
                    {
                        setImage("LeftTiltAlt.png");
                        flameFrame ++;
                    }
                }
            }
            else if (Greenfoot.isKeyDown("right")) { 
                setLocation(getX() + stepSize,getY());
                tiltRight = true;
                if(tiltFrame == 1)
                {
                    setImage("RightTilt1.png");
                    tiltFrame ++;
                }
                else if(tiltFrame == 2)
                {
                    setImage("RightTilt2.png");
                    tiltFrame++;
                }
                else if(tiltFrame == 3)
                {
                    setImage("RightTilt3.png");
                    tiltFrame++;
                }
                else
                {
                    if(flameFrame == 1)
                    {
                        setImage("RightTilt.png");
                        flameFrame --;
                    }
                    else
                    {
                        setImage("RightTiltAlt.png");
                        flameFrame ++;
                    }
                }
            }
            else
            {
                tiltFrame = 1;
                tiltLeft = false;
                tiltRight = false;
                if(flameFrame == 1)
                {
                    setImage("PlayerShip2.png");
                    flameFrame --;
                }
                else
                {
                    setImage("PlayerShip.png");
                    flameFrame ++;
                }
            }
        }

        private void fire()
        {
           if(Greenfoot.isKeyDown("space") && (armsCool >= COOLDOWN))
            {
                getWorld().addObject(new PlayerBasicBullet(new Vector(12, 5), 251), this.getX(), this.getY());
                Battleground.bulletsOnScreen ++;
                armsCool = 0;
            }
        }

}

移动();方法和 Vector 类是分开的,只是为了更平滑的移动。我也可以提供这些,但那里不应该有任何与控件混淆的东西。

4

1 回答 1

0

稍加修改的代码版本在我的机器上运行良好。我能想到的有两种可能:

  1. 您的 setImage 调用(我已将其注释掉,因为我没有这些图像)可能会引发异常,在这种情况下将无法访问 fire() 方法。不过,这似乎不太可能,因为即使没有对角线移动也会发生这种情况,并且您会在终端中看到异常。所以,更有可能:

  2. 您的键盘可能无法注册这些特定的三键组合。三种测试方法:

    一个。试试这个键盘重影演示(单击页面顶部的键盘),看看它是否可以注册所有键。

    湾。从书中的示例中加载小行星场景,看看您是否可以在加速和转向时发射子弹。

    C。您可以将代码中的“空格”更改为“x”,然后查看是否可以使用该键。

否则,我会不知所措,除非场景中的其他地方有代码导致问题。

于 2015-10-03T21:18:39.123 回答