子弹没有上行! Java游戏

时间:2017-09-28 07:53:56

标签: java keypress bullet

我是Java的新手,我试图让一艘船发射子弹。只要空格键按钮被按下,我想要的实际上是让船发射子弹。 我成功地使这艘船在这里和那里移动并且还发射了子弹。然而,子弹刚刚上升。这是我的代码 -

package learningPackage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class Draw extends JFrame implements Runnable {

    //Variables for the x and y coordinates, xDirection for modifying the values of x only.
    int x, y, xDirection;
    int bx, by;

    Image dbImage;
    Graphics dbGraphics;

    boolean shot;

    Rectangle bullet;


    //Thread run
    public void run() {
        try {
            while (true) {
                move();
                shoot();
                //Setting sleep to 0 will make it light-speed!
                Thread.sleep(5);

            }
        }
        catch (Exception e) {
            System.out.println("Error!");
            }
    }



    //Ship move
    //Ship moves only in one direction, x - axis
    public void move() {
        x += xDirection;

        //Collision detection
        if (x <= 10) {
            x = 10;
        }
        if (x >= 415) {
            x = 415;
        }
    }

    //KeyListeners
    public class AL extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if (keyCode == e.VK_LEFT) {
                xDirection = -2;
            }
            if (keyCode == e.VK_RIGHT) {
                xDirection = 2;
            }
            if (keyCode == e.VK_SPACE) {
                shot = true;

            }
        }

            public void keyReleased(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if (keyCode == e.VK_LEFT) {
                    xDirection = 0;
                }
                if (keyCode == e.VK_RIGHT) {
                    xDirection = 0;
                }
                if (keyCode == e.VK_SPACE) {
                    shot = false;
                }
            }
        }


        //Constructor for the game frame
        public Draw() {
            super("Game");
            setSize(500, 500);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setResizable(false);
            addKeyListener(new AL());

            x = 200;
            y = 465;


            setVisible(true);
        }

        //Double - buffering
        public void paint(Graphics g) {
            dbImage = createImage(getWidth(), getHeight());
            dbGraphics = dbImage.getGraphics();
            paintComponent(dbGraphics);
            g.drawImage(dbImage, 0, 0, this);

        }

        //All the graphics
        public void paintComponent(Graphics g) {

            bullet = new Rectangle(bx, by, 10, 10);
            g.setColor(Color.RED);
            //Ship rectangle
            g.fillRect(x, y, 75, 25);
            //Gun rectangle
            g.fillRect(x + 32, y - 15, 10, 15);

            //Setting the same values for bx and by as x and y so that the bullet will start from the Gun rectangle
            bx = x + 32;
            by = y - 15;

            if (shot == true) {

                g.setColor(Color.BLACK);
                g.fillRect(bx, by, bullet.width, bullet.height);

            }

            repaint();

        }


        public void shoot() {
            if (shot == true) {
                by = by - 2;
            }
            if (by <= -5) {
                //Resetting values
                bx = x + 32;
                by = y - 15;
                bullet = new Rectangle(bx, by, 10, 10);
                shot = false;
            }
        }

        //Main method
        public static void main(String[] args) {
            Draw gameTry = new Draw();
            Thread t1 = new Thread(gameTry);
            t1.start();

        }
    }

Here's what happens when I just move the ship, working perfectly fine -

Here's what happens when I hold down space -

(很抱歉由于无法在帖子中嵌入图片,我也是Stack Overflow的新手!)

我实际上正在从教程中处理这段代码,但由于教程代码没有成功,我决定自己做,但我也不能自己做! 帮助肯定会被赞赏!

1 个答案:

答案 0 :(得分:1)

当您比较shoot()方法和paintComponent方法时,子弹不移动的原因会变得更加明显。

拍摄检查是否设置了shot布尔值,如果是,则将子弹位置向上移动2

当子弹离开屏幕顶部时,它会重置&#34; bullet&#34;。 这一切都很好,它完成了它应该做的事情。

 public void shoot() {
        if (shot == true) {
            by = by - 2; //this is fine, it moves the bullet up
        }
        if (by <= -5) {
            //Resetting values
            bx = x + 32;
            by = y - 15;
            bullet = new Rectangle(bx, by, 10, 10);
            shot = false;
        }
    }

然后来paintComponent,这是你的游戏被执行的时间&#34;画&#34;到了屏幕。

它为子弹在当前位置定义了一个矩形, 划船,

然后覆盖子弹的x和y位置,使其位于船顶。 这就是你的问题

    public void paintComponent(Graphics g) {
        bullet = new Rectangle(bx, by, 10, 10);
        g.setColor(Color.RED);
        g.fillRect(x, y, 75, 25);
        g.fillRect(x + 32, y - 15, 10, 15);

        //you are messing with bx and by here.
        //probably because you wanted the bullet to be in the
        //same position as the ship.

        //this means they will be put back into the same position
        //for every time your game is painted to the screen.
        //my advice is, do *not* do this here.
        bx = x + 32;
        by = y - 15;

        if (shot == true) {
            g.setColor(Color.BLACK);
            g.fillRect(bx, by, bullet.width, bullet.height);
        }
        repaint();
    }