2016-01-18 7 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, by, который, как я предполагаю, является позицией x и y пули. Однако координаты прямоугольника никогда не обновляются. Вместо увеличения bx и by, обновите прямоугольник (вы также захотите перерисовать прямоугольник).

+0

Спасибо, что нашли время, чтобы ответить, но я инициализируюсь мой прямоугольник пули в моем методе doDrowing() – user3500147

+0

да, что это правильно. Я также создал axn xpost() и ypost() unction, которые возвращают положение координаты x и y корабля и устанавливают их равными пуле, которые заставляют пулю перемещаться относительно движения судна. – user3500147

+0

Каждый раз, когда вы вызываете doDrawing, вы повторно инициализируете его. Вы должны инициализировать его в своем конструкторе public panel() вместо этого. – 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

ОК, я удаляю bullet = новый Rectangle (bx, by, 10,10), чтобы конструктор казался чтобы заставить его двигаться, но 1 пиксель eveytime я нажимаю кнопку. – user3500147

+0

Да один пиксель, потому что bullet.y--; если вам нужна более высокая скорость, добавьте больше, например. bullet.y- = 10 – gpasch

+0

перемещает один пиксель и останавливается. так как у меня есть bullet.y-- это не значит, что вы продолжаете двигаться – user3500147

Смежные вопросы