2013-10-29 38 views
0

好吧,我有一个GameField类,一个GameObject类和一个Panel类。 GameObject类描述了一个对象,该对象具有x和y位置,宽度和高度以及x和y方向(当前正在移动)。 GameField类有几个不同的这些对象的实例,有些是自己存储的,有些则存储在原始数组中。如何paintComponent在Java中显示对象?

Panel类应该在屏幕上显示这些对象。我为此使用了JPanel。 但是,当涉及到在屏幕上实际显示它们时,我有点失落。我需要实现一个名为paintComponent(Graphics graphics)的函数,它接受一个Graphics对象。

要开始,我想要在屏幕上显示所有对象,并设置它们的颜色。他们的大小,位置等在别处处理。我如何使用这些属性来设置实际对象的大小,位置和方向?

我可能需要重写paintComponent函数来显示GameField中的所有对象。

如果你能帮我解决一些代码,那会很棒。

回答

0

我不太清楚你的意思是“他们的规模,职位等在别处处理”。现在,让我们假设你大概有以下结构(领域和ommitted为清楚起见其他方法):

class GameObject { 

    java.awt.Color  getColor() { ... } 
    java.awt.Point  getPosition() { ... } 
    java.awt.Point  getDirection() { ... } 
    java.awt.Dimension getSize { ... } 
} 

class GameField { 

    List<GameObject> getGameObjects() { ... } 
} 

class Panel extends JPanel { 

    private GameField getGameField() { ... } 

    @Override 
    public void paintComponent(Graphics g) { 
     // this is where the GameObjects must be painted 
    } 
} 

该方法的paintComponent负责Panel类的屏幕表示。如果你重写它,你刚刚赢得了它的责任。幸运的是,绘图是 - 如果单调乏味 - 相当简单。你问了那个Graphics参数。简而言之,它是由Java的魔力为您设置的,并为您提供了一个用于绘图的工具箱。

首先,只要面板被重新粉刷,您就会想要一个干净的石板。绘制后无法删除任何东西,但您可以轻松地以选择的背景颜色绘制整个面板。现在

g.setColor(Color.white); // everything that is now painted will be white 
g.fillRect(0, 0, getWidth(), getHeight()); // fills the entire area with the set color 

,你有每个游戏物体,让我们把矩形的对象的定义颜色和大小的屏幕上,与它的物体的位置中心。

for (GameObject object : getGameField().getGameObjects()) { 
    g.setColor(object.getColor()); 
    g.fillRect(object.getPosition().x - (object.getSize().x/2), object.getPosition().y - object.getSize().y/2, object.getSize().x, object.getSize().y); 
} 

fillRect方法要求前两个参数是矩形的左上角。因此,为了让它以对象的位置为中心,我们分别从x和y值的位置减去一半大小。现在,对于每个GameObject,在对象颜色的正确位置处有一个直径正确的矩形。

您应该阅读关于java.awt.Graphics的javadoc以了解如何绘制其他内容,可能是图片精灵或方向线或其他内容。这很麻烦但可行。

+0

当然,您还需要一些机制来触发面板上的重绘。 –