2

我在使用 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。我不确定为什么它不循环遍历数组列表来绘制每一块。有人可以帮我吗?

4

1 回答 1

3

我到现在发现的原因是这样的:

public Base(int xCoord, int yCoord) {
  xCoord = x;
  yCoord = y;
}

您正在分配xCoord的值x和默认情况下yCoord的值。y0应该更改为:

public Base(int xCoord, int yCoord) {
 x = xCoord ;
 y = yCoord ;
}
于 2013-05-04T20:10:05.297 回答