我在使用 ArrayList 在 JPanel/Jframe 中绘制多个图像时遇到了一些问题。我的项目是创建一个 Yar's Revenge 类型的游戏。到目前为止,还没有,但这是我所拥有的:
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.util.ArrayList;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements ActionListener, KeyListener, ImageObserver {
public Image ship;
public Image enemy;
public Image shot;
private int xLoc;
private int yLoc = 180;
private int xLoc2 = 700;
private int yLoc2 = 180;
private int xVel;
private int yVel;
private int xVel_en;
private int xVel_sh;
private ImageObserver observer;
private ArrayList<Base> shield = new ArrayList<Base>();
private Image shieldPiece;
public GamePanel() {
ship = Toolkit.getDefaultToolkit().createImage("ship3.png");
enemy = Toolkit.getDefaultToolkit().createImage("alien-ship-1.png");
shot = Toolkit.getDefaultToolkit().createImage("shot4.png");
shieldPiece = Toolkit.getDefaultToolkit().createImage("block1.png");
for(int x = 300; x < 420; x = x + 30)
for(int y = 100; y < 220; y = y + 30) {
Base temp = new Base(x,y);
shield.add(temp);
}
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(ship, xLoc, yLoc, null);
//g.drawImage(enemy, xLoc2, yLoc2, null);
for(Base b: shield)
g.drawImage(shieldPiece, b.getShieldX(), b.getShieldY(), null);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
move();
setBackground(Color.BLACK);
repaint();
}
private void move() {
int endOfWindow = getWidth();
int endOfWindow1 = getHeight();
if(xLoc>=(endOfWindow - ship.getWidth(null))|| xLoc<0)
xVel = -xVel;
xLoc +=xVel;
if(xLoc>=(endOfWindow - ship.getWidth(null)))
xVel = -xVel;
xLoc +=xVel;
if(yLoc>=(endOfWindow1 - ship.getHeight(null)) || yLoc<0)
yVel = -yVel;
yLoc +=yVel;
if(yLoc>=(endOfWindow1 - ship.getHeight(null)))
yVel = -yVel;
yLoc +=yVel;
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getKeyCode() == KeyEvent.VK_D)
xVel = 3;
if(arg0.getKeyCode() == KeyEvent.VK_A)
xVel = -3;
if(arg0.getKeyCode() == KeyEvent.VK_W)
yVel = -3;
if(arg0.getKeyCode() == KeyEvent.VK_S)
yVel = 3;
if(arg0.getKeyCode() == KeyEvent.VK_RIGHT)
xVel = 3;
if(arg0.getKeyCode() == KeyEvent.VK_LEFT)
xVel = -3;
if(arg0.getKeyCode() == KeyEvent.VK_UP)
yVel = -3;
if(arg0.getKeyCode() == KeyEvent.VK_DOWN)
yVel = 3;
//if(arg0.getKeyCode() == KeyEvent.VK_SPACE)
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getKeyCode() == KeyEvent.VK_D || arg0.getKeyCode() == KeyEvent.VK_A)
xVel = 0;
if(arg0.getKeyCode() == KeyEvent.VK_W || arg0.getKeyCode() == KeyEvent.VK_S)
yVel = 0;
if(arg0.getKeyCode() == KeyEvent.VK_RIGHT || arg0.getKeyCode() == KeyEvent.VK_LEFT)
xVel = 0;
if(arg0.getKeyCode() == KeyEvent.VK_UP || arg0.getKeyCode() == KeyEvent.VK_DOWN)
yVel = 0;
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
这是我的基类:
import java.awt.Image;
import java.awt.Toolkit;
public class Base {
private Image shieldPiece;
private int x;
private int y;
public Base(int xCoord, int yCoord) {
xCoord = x;
yCoord = y;
}
public int getShieldX() {
return x;
}
public int getShieldY() {
return y;
}
}
GameWindow 类供参考:
import java.awt.Color;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class GameWindow extends JFrame {
public GameWindow() {
setSize(800, 500);
GamePanel pan = new GamePanel();
Timer t = new Timer(40, pan);
add(pan);
this.addKeyListener(pan);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
t.start();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
annnnd 这是弹出的内容:
http://i.imgur.com/4bmf3Ab.png
它应该在船的右侧某处(从 x=300,y=100 开始)绘制多个盾牌(红色矩形)。窗口为 800x500。我不确定为什么它不循环遍历数组列表来绘制每一块。有人可以帮我吗?