2014-09-22 4 views
0

У меня возникли проблемы с этим в течение довольно долгого времени Я пытаюсь сделать космический шутер, но безуспешно, я пытаюсь сделать пулю перемещаться по экран, как в космических захватчиках и т. д. , когда игрок нажимает пробел, должна появляться пуля, где находится позиция X игрока и перемещается прямо по экрану.Java help: сделать изображение перемещаться по экрану

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
public class game extends JFrame{ 

boolean run = true; 
boolean fired = false; 

Image player; 
Image bullet; 

int playerX = 100; 
int playerY = 200; 

int bulletX; 
int bulletY; 


public game(){ 
    //Load Images: 
    ImageIcon playerI = new  ImageIcon("C:/Users/Dan/workspace/shooterProject/bin/shooterProject/ship.png"); 
    player = playerI.getImage(); 
    ImageIcon bulletI = new  ImageIcon("C:/Users/Dan/workspace/shooterProject/bin/shooterProject/bullet.png"); 
    bullet = bulletI.getImage(); 
    //Set up game 

     addKeyListener(new AL()); 

     addMouseListener(new Mouse()); 

     init(); 

} 

private Image dbImage; 
private Graphics dbg; 


public static void main(String[] args) { 
    new game(); 
} 


//When the program runs, thins are initialised here 

public void init(){ 
    windowManager(); 
} 
public void paintComponent(Graphics g){ 

    if(run == true){ 
     g.drawImage(player, playerX, playerY, this); 
    } 
    if(fired == true){ 
     g.drawImage(bullet, bulletX, bulletY, this); 
    } 

    repaint(); 

} 

public void paint(Graphics g){ 
    dbImage = createImage(getWidth(), getHeight()); 
    dbg = dbImage.getGraphics(); 
    paintComponent(dbg); 
    g.drawImage(dbImage,0,0,this); 
} 


public void bullet(){ 
    bulletX = playerX; 
    bulletY = playerY; 
    while(fired == true){ 
     bulletX = bulletX + 10; 
     if(bulletX == 800){ 
      bullet = null; 
      fired = false; 
     } 
    } 

} 


public void windowManager(){ 

     JFrame f = new JFrame(); 

     setTitle("Engine"); 
     setVisible(true); 
     setResizable(false); 
     setSize(800,400); 
     setBackground(Color.BLACK); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 
public class AL extends KeyAdapter{ 
    public void keyPressed(KeyEvent e){ 

     int keyCode = e.getKeyCode(); 
     if((keyCode == KeyEvent.VK_UP) && (run == true) && (playerY - 20 > 0)){ 
       playerY = playerY - 10; 
     }else if((keyCode == KeyEvent.VK_DOWN) && (run == true) && (playerY + 20 < 400)){ 
      playerY = playerY + 10; 
     } 
     if((keyCode == KeyEvent.VK_SPACE) && (fired == false)){ 
      fired = true; 
      if(fired == true){ 
       bullet(); 
      } 
     } 
    } 

    public void keyReleased(KeyEvent e){ 
    } 
} 

public class Mouse extends MouseAdapter { 
public void mousePressed(MouseEvent e) { 

    double x = e.getX(); 
    double y = e.getY(); 

} 
} 
} 

ОДНАКО

Когда я запускаю код без цикла в то время как пуля появляется в позиции X игрока но Когда цикл в то время как там, когда игрок нажимает на кнопку X ничего не происходит, пуля даже не появляется!

сможет ли кто-нибудь помочь мне в том, как я могу заставить пулю появиться и переместиться по экрану? спасибо

ответ

1

Это связано с тем, что вы не рисуете пулю до тех пор, пока она не выходит за пределы допустимого диапазона, поэтому вы не должны использовать цикл while таким образом, вам, вероятно, понадобится google для «Game Loop», но пока вы не сделаете это снайпер, может помочь, Обратите внимание, что очень плохо, но должно работать:

public void paintComponent(Graphics g){ 

    if(run == true){ 
     g.drawImage(player, playerX, playerY, this); 

     if(fired == true) { 
      bulletX = bulletX + 10; 
      if(bulletX > 800 || bulletX < 0){ 
       fired = false; 
      } 

      g.drawImage(bullet, bulletX, bulletY, this); 
     } 

     repaint(); 
    } 

} 

public void bullet(){ 
    bulletX = playerX; 
    bulletY = playerY; 
} 

одно заключительное примечание, перенести этот код в лакокрасочной Methode DBImage = createImage (GetWidth(), GetHeight()) в конструктор или Init(), потому что вы создаете новое изображение для каждого кадра.

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