0

最近、Greenfoot を使っていて、シンプルなトップダウン/弾幕シューティング ゲームを作りたいと思っていました。いくつかの動きを試すまで、すべてが順調に進んでいました。古き良き「矢印キーで移動、スペースで撃つ」というシンプルなものですが、斜め上下左右に移動しながら同時に撃とうとすると問題が発生します。一度にできることは 1 つだけです。道順は、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

コードのわずかに変更されたバージョンは、私のマシンで正常に動作します。私が考えることができる2つの可能性があります:

  1. setImage 呼び出し (これらの画像がないため、コメントアウトしました) が例外をスローしている可能性があります。その場合、fire() メソッドに到達しません。ただし、これは斜めの動きがなくても発生する可能性があり、ターミナルで例外が表示されるため、可能性は低いと思われます。したがって、より可能性が高い:

  2. お使いのキーボードは、これらの特定の 3 つのキーの組み合わせを登録できない場合があります。これをテストする 3 つの方法:

    a. このキーボード ゴースト デモ(ページ上部のキーボードをクリック) を試して、すべてのキーを登録できるかどうかを確認してください。

    b. 本の例から小惑星のシナリオを読み込んで、加速およびステアリングしながら弾丸を撃つことができるかどうかを確認してください。

    c. コード内の「スペース」を「x」などに変更して、そのキーで機能するかどうかを確認できます。

そうでなければ、シナリオのどこかに問題を引き起こしているコードがない限り、途方にくれます。

于 2015-10-03T21:18:39.123 に答える