我想編寫一個Space Invader遊戲來刷新我在AP計算機科學中學到的技能。我遇到了一個問題。當我按下空格鍵(火按鈕)時,頂部的子彈動畫不可見。相反,子彈剛剛出現在屏幕的頂部,從你開槍的地方。這是一個包含了子彈的擊發代碼:Java Space Invader子彈運動
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class AlienInvader extends JPanel implements KeyListener, ActionListener {
Constants constant = new Constants();
Timer timer = new Timer(5, this);
Sprite images = new Sprite();
public void update() {
timer.start();
images.loadImage();
addKeyListener(this);
setFocusable(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 500, 500);
g.drawImage(images.spaceship, constant.x, constant.y, null);
g.drawImage(images.bullet, constant.bulletx, constant.bullety, null);
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println(constant.x);
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
constant.xvel = -1 * constant.STEP;
repaint();
break;
case KeyEvent.VK_RIGHT:
constant.xvel = 1 * constant.STEP;
repaint();
break;
case KeyEvent.VK_SPACE:
constant.xvel = 0;
constant.bulletx = constant.x;
constant.bullety = constant.y;
while (constant.bullety > 0) {
constant.bullety = constant.bullety - 1;
repaint();
}
}
constant.x += constant.xvel;
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
constant.xvel = -1;
break;
case KeyEvent.VK_RIGHT:
constant.xvel = 1;
break;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
}
我將如何使它所以用戶可以看到子彈向上行進時,從你火的屏幕?
您是否想說我需要使用BufferedImage才能將圖像添加到控制檯?我已經做到了。這裏是代碼: import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio。ImageIO的; 公共類精靈{ \t \t BufferedImage spaceship,bullet; \t \t公共無效的LoadImage(){ \t \t嘗試{ \t \t \t飛船= ImageIO.read(新文件( 「spaceship.png」)); \t \t \t bullet = ImageIO.read(new File(「bullet.png」)); \t \t}趕上(IOException的發送){ \t \t \t // TODO自動生成的catch程序塊 \t \t \t e.printStackTrace(); \t \t} \t} } – user1881401 2013-03-12 02:43:31
不,我是說,你需要使用至少兩個'BufferedImage's向渲染你整場比賽狀態。一個將被渲染器用於屏幕(通過一種「paint」方法),另一個將被遊戲線程引擎用來更新世界上所有對象的狀態。然後你會交換引用,這意味着當你更新遊戲狀態時,任何由Swing繪製的東西都不會過早渲染。 – MadProgrammer 2013-03-12 02:52:12