2016-01-18 27 views
0

我在教自己用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); 

    } 

} 

回答

0

裏面你按下鍵事件的空間,你應該創建子彈的實例。截至目前,你有一個成員變量Bullet;然而它是空的,因爲它從來沒有被初始化過。話雖如此,你還需要移動你的子彈 - 這應該在你的移動功能中完成。

我看到你有一個bx,我假設它是子彈的x和y位置。但是,矩形的座標永遠不會更新。而不是遞增bx,並更新矩形(您還想要重新繪製矩形)。

+0

感謝您抽出時間來回答,但我初始化我的長方形子彈在我doDrowing()方法 – user3500147

+0

是這是正確的。我還創建了axn xpost()和ypost()函數,它們返回船的x和y座標的位置,並將它們設置爲等於子彈,使子彈相對於船的運動移動。 – user3500147

+0

每次您調用doDrawing時,都會重新初始化它。您應該在公共面板()構造函數中初始化它。 – mattsap

1

創建子彈一次;不在油漆和繪圖內 - 在構造函數內部;這一點的

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

也當您更新子彈的位置

舉動不使用BX,通過和獨立變量;只是做

bullet.x=....new location 
bullet.y=....new location 
+0

ok我刪除了bullet = new Rectangle(bx,by,10,10)to the constructor使其移動,但1個像素eveytime我按下按鈕。 – user3500147

+0

是一個像素,因爲bullet.y--;如果你想要更高速度,可以添加更多bullet.y- = 10 – gpasch

+0

它移動一個像素並停止。因爲我有子彈.y--它不是假設繼續移動 – user3500147