Java帮助:使图像在屏幕上移动

Java帮助:使图像在屏幕上移动,java,image,Java,Image,我已经有相当长一段时间的麻烦了 我试着做一个太空射手,但没用,我试着让子弹像太空入侵者一样在屏幕上移动 当玩家按下空格键时,一个项目符号会出现在玩家的X位置,并在屏幕上向右移动 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.M

我已经有相当长一段时间的麻烦了 我试着做一个太空射手,但没用,我试着让子弹像太空入侵者一样在屏幕上移动 当玩家按下空格键时,一个项目符号会出现在玩家的X位置,并在屏幕上向右移动

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();

}
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
公共类游戏扩展JFrame{
布尔运行=真;
布尔值=假;
图像播放器;
图像子弹;
int playerX=100;
int playerY=200;
国际公报;
内布拉蒂;
公共游戏(){
//加载图像:
ImageIcon playerI=新的ImageIcon(“C:/Users/Dan/workspace/shooterProject/bin/shooterProject/ship.png”);
player=playerI.getImage();
ImageIcon Bulletin=新的ImageIcon(“C:/Users/Dan/workspace/shooterProject/bin/shooterProject/bullet.png”);
bullet=bulletI.getImage();
//设置游戏
addKeyListener(新AL());
addMouseListener(新鼠标());
init();
}
私有镜像dbImage;
专用图形数据库;
公共静态void main(字符串[]args){
新游戏();
}
//当程序运行时,thin在这里初始化
公共void init(){
windowManager();
}
公共组件(图形g){
if(run==true){
g、 drawImage(player、playerX、playerY、this);
}
如果(激发==真){
g、 drawImage(bullet、bulletX、bulletY、this);
}
重新油漆();
}
公共空间涂料(图g){
dbImage=createImage(getWidth(),getHeight());
dbg=dbImage.getGraphics();
油漆组件(dbg);
g、 drawImage(dbImage,0,0,this);
}
公共无效项目符号(){
bulletX=播放器X;
子弹=游戏;
while(fired==true){
bulletX=bulletX+10;
如果(bulletX==800){
bullet=null;
解雇=假;
}
}
}
公共窗口管理器(){
JFrame f=新的JFrame();
设置标题(“引擎”);
setVisible(真);
可设置大小(假);
设置大小(800400);
挫折背景(颜色:黑色);
setDefaultCloseOperation(关闭时退出);
}
公共类AL扩展了KeyAdapter{
按下公共无效键(按键事件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)){
激发=真;
如果(激发==真){
子弹();
}
} 
}
公共无效密钥已释放(密钥事件e){
}
}
公共类鼠标扩展了MouseAdapter{
公共无效鼠标按下(MouseEvent e){
双x=e.getX();
双y=e.getY();
}
}
}
然而

当我在没有while循环的情况下运行代码时,项目符号出现在播放器的X位置 但是 当while循环存在时,当玩家按下X按钮时,什么都没有发生,子弹甚至没有出现

有谁能帮助我让子弹出现并在屏幕上移动?
谢谢

这是因为在子弹超出范围之前,你不会画子弹,你不应该这样使用while循环,你可能需要在谷歌上搜索“游戏循环”,但在你这样做之前,这里有一个狙击手可能会有帮助,请注意,非常糟糕,但应该可以工作:

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;
}
公共组件(图形g){
if(run==true){
g、 drawImage(player、playerX、playerY、this);
如果(激发==真){
bulletX=bulletX+10;
如果(bulletX>800 | | bulletX<0){
解雇=假;
}
g、 drawImage(bullet、bulletX、bulletY、this);
}
重新油漆();
}
}
公共无效项目符号(){
bulletX=播放器X;
子弹=游戏;
}
最后一个注意事项是,将绘制方法dbImage=createImage(getWidth(),getHeight())中的代码移动到构造函数或init()中,因为每一帧都要创建一个新图像