![](/img/trans.png)
[英]How to combine paintComponent(Graphics g) with MouseListener and MouseMotionListener
[英]How to draw objects stored in a vector with paintComponent(Graphics g)
我想知道如何将对象存储在矢量中,然后使用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);
}
}
如果我做System.out.println(contents),我也不确定我是否在向量中添加了正确的对象。 我只得到一个带有2个null元素的向量。
Breakout.ball和paddle元素都是2个矩形。 如果我尝试直接绘制它们,因为我到目前为止在底部它工作正常,但它当我想添加像20+砖我需要将所有对象存储在一个向量中,然后将其全部绘制出来。
如果有人得到了一些好的指针,或者链接到一个很好的教程!
编辑:突破类的一部分
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);
}
}
你应该做的是拥有每个对象类(如果它们是偶数类,它们应该是IMO),使用单个draw(Graphics g)
方法实现Drawable
接口。
public interface Drawable {
public void draw(Graphics g);
}
public class Ball implenents Drawable {
@Override
public void draw(Graphics g) {
// draw ball
}
}
然后Vector(我推荐一个List代替)可以输入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
接口的任何对象添加到List<Drawable>
在这里和这里以及此处和此处以及此处和此处查看一些示例,绘制多个对象并使用javax.swing.Timer
进行动画,这可能是您想要考虑的。
我们需要看看你的Breakout课程,知道你是否真的添加了任何东西。 如果它们是空对象,则意味着它们从未被实例化。 因此,基本上,调用构造函数并使用其返回的对象引用分别分配Breakout.paddle
和Breakout.ball
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.