当我按空格键时,我的子弹没有被解雇

时间:2016-01-18 16:02:54

标签: java

我正在教自己用java编程,我决定制作一个太空入侵者游戏。我让我的船朝任何方向移动,但我的子弹被解雇了我的问题。现在我知道,每当我的船移动时,子弹的y坐标都会被更新,但它没有发射。如果可能的话,我需要有人来帮我解决问题。欢迎任何帮助。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Panel extends JPanel implements KeyListener, ActionListener{
    private int x;
    private int y;
    private int dx;
    private int dy;
    int bx;
    int by;
    Rectangle bullet;
    Timer timer;
    private Image image;

    public Panel() {
        timer = new Timer(30, this);
        setBackground(Color.black);
        addKeyListener(this);
        setFocusable(true);
        timer.start();
        x=130;
        y=430;
         bx=xPost()+55;
         by=yPost();

    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        ImageIcon ii= new ImageIcon("C:\\Users\\TriZam\\workspace\\LearningSprite\\ship.png");
        image=ii.getImage();
        g.drawImage(image, x, y, this);
        doDrawing(g);
    }

    public void move(){
        // thhis method will be placed inside the interferance ActionPerformed in order to move the ship and bullet
        x += dx;
        y += dy;
        bx += dx;
        by += dy;

    }


    public void keyPressed(KeyEvent e){
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = -3;
            if (x<=-25){
                dx=0;
            }
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 3;

            if (x>=380 ){
                dx=0;
            }
        }

        if (key == KeyEvent.VK_UP) {
            dy = -3;
            if (y<=0 ){
                dy=0;
            }
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 3;

            if (y>=430 ){
                dy=0;
            }
        }

        if(key ==KeyEvent.VK_SPACE){
            // bullet shooting and as you can see the y coordinate updates but bullet not moving.
            bullet.y--;
            System.out.println(bullet.y--);
        }
    }

    public void keyReleased(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_UP) {
            dy = 0;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 0;

        }
    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        move();
        repaint();

    }

    int yPost(){
        return y;

    }

    int xPost(){
        return x;

    }


    void doDrawing(Graphics g) {
        bullet = new Rectangle(bx, by, 10, 10);
        g.setColor(Color.white);
        g.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);

    }

}

这是主要的课程

import javax.swing.JFrame;
public class MainClass extends JFrame {
    private int FrameWidth;
    private int FrameHeigh;
    private Panel panel;

    public MainClass(int width, int height ) {
        panel= new Panel();
        this.FrameWidth=width;
        this.FrameHeigh=height;
        setSize(FrameWidth,FrameHeigh);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(panel);
        setVisible(true);
    }
    public static void main(String[] args) {
        MainClass m= new MainClass(500, 600);

    }

}

2 个答案:

答案 0 :(得分:1)

创造一次子弹;不在绘画和绘图中 - 在构造函数内部;

将其移出

void doDrawing(Graphics g) {
    --> remove this from here and into the constructor --> bullet = new Rectangle(bx, by, 10, 10);

当你更新子弹的位置时也不要使用bx,by和单独的变量;只是做

bullet.x=....new location
bullet.y=....new location

答案 1 :(得分:0)

在按键空间事件中,您应该创建一个项目符号实例。截至目前,您有一个成员变量Bullet;但它是空的,因为它从未被初始化。话虽这么说,你也想要移动你的子弹 - 这应该在你的移动功能中完成。

我看到你有一个bx,by我假设它是子弹的x和y位置。但是,矩形的坐标永远不会更新。而不是增加bx和by,更新矩形(你还要重新绘制矩形)。