我想知道如何将对象存储在 vector 中,然后稍后使用 PaintComponent(Graphics g) 方法绘制它们。
我的绘画课是atm:
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
public class PaintingPanel extends JPanel{
public static Rectangle playField = new Rectangle(10, 10, 800, 800);
public static int playFieldCentreX = 399;
public static int playFieldCentreY = 399;
public static Vector contents;
public PaintingPanel(Vector contents)
{
contents = new Vector();
contents.addElement(Breakout.paddle);
contents.addElement(Breakout.ball);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.draw(playField);
Breakout.paddle.paintThis(g2d);
Breakout.ball.paintThis(g2d);
}
}
我也不确定我是否在 vector 中添加了正确的对象,如果我这样做的话 System.out.println(内容);我刚刚得到一个带有 2 个空元素的 vector 。
Breakout.ball 和 paddle 元素都是 2 个矩形。如果我尝试直接绘制它们,就像我到目前为止在底部所做的那样,它工作得很好,但是当我想添加 20 多个砖 block 时,我需要将所有对象存储在一个 vector 中,然后将其全部绘制出来。
如果有人得到一些好的指示,或者一个好的教程的链接,那就太好了!
编辑:突破类的一部分
public class Breakout extends TimerTask implements KeyListener {
public static Ball ball;
public static Paddle paddle;
public static PaintingPanel panel;
public static boolean gameRunning;
public static Breakout game;
public Breakout()
{
}
public static void setupGame()
{
paddle = new Paddle(350, 790, 100, 10); //initial paddle creation
ball = new Ball(393, 400, 7);
showGUI();
}
public static void beginGame()
{
gameRunning = true;
}
public void run()
{
if(gameRunning == true)
{
Ball.move();
Paddle.move();
}
}
}
public static void main(String[] args)
{
Timer t = new Timer();
t.schedule(new Breakout(), 0, 40);
panel = new PaintingPanel(PaintingPanel.contents);
setupGame();
beginGame();
while (gameRunning == true)
{
panel.repaint();
}
// TODO a lot
}
private static void showGUI()
{
JFrame frame = new JFrame("Breakout");
game = new Breakout();
frame.addKeyListener(game);
frame.add(panel);
frame.setSize(1000,1000);
frame.setLocationRelativeTo(null); // create game window
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
最佳答案
你应该做的是让每个对象类(如果它们是偶数类,在我看来,它们应该是),实现 Drawable
接口(interface),具有单个draw(Graphics g)
方法。
public interface Drawable {
public void draw(Graphics g);
}
public class Ball implenents Drawable {
@Override
public void draw(Graphics g) {
// draw ball
}
}
然后可以输入 vector (我建议使用列表)Drawable
。然后你可以循环遍历它,调用 draw
每个对象的方法。 (即将所有 Drawable
对象添加到其中之后。
public class PaintingPanel extends JPanel {
private List<Drawable> objects;
BreakOut breakOut;
public PaintingPanel(BreakOut breakout) {
this.breakOut = breakOut;
this.objects = breakOut.getSomething();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Drawable object: objects) {
object.draw(g);
}
}
}
IMO,这将是更好的设计。因此,您可以添加任何实现 Drawable
的对象接口(interface)进入List<Drawable>
查看一些示例 here和here和here和here和here和here绘制多个对象并使用 javax.swing.Timer
对于动画,也许您想考虑这样做。
关于java - 如何使用paintComponent(Graphics g)绘制存储在 vector 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801298/