子弹没有飞起来!Java游戏

m4pnthwp  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(126)

我是一个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当我只是移动飞船时会发生什么,工作得很好-][1]
[Here当我按住空格时会发生什么-][2]
我实际上是从一个教程中复制这些代码的,但是由于教程代码不起作用,我决定自己做,但是我也不能自己做!

ecfdbz9o

ecfdbz9o1#

当比较shoot()方法和paintComponent方法时,项目符号不移动的原因就很明显了。
Shoot检查是否设置了shot布尔值,如果设置了,则将子弹的y位置向上移动2
当子弹离开屏幕顶部时,它会重置“子弹”。这一切都很好,它做了它应该做的事情。

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,这是执行时间您的游戏是“画”到屏幕上。
它在子弹的当前位置定义一个矩形,绘制船,
然后重写子弹的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();
    }

相关问题