使用标签(或通常的GUI组件)来快速表示动画,动态创建/移动的对象是不实际的。就像使用汽车从客厅开车到厨房一样。
Swing组件带有很多很好的功能,例如,他们可以确定他们需要的空间,布局经理可以使用它自动将它们很好地放置。不幸的是,对于一款游戏,你不需要所有的好东西,也不需要支付与之相关的处理开销。通过摆动多平台功能使问题变得更加复杂,其要求每个组件具有对等组件(对等组件处理将组件呈现为活动外观)。
要解决这个问题,您不会将单个游戏对象表示为挥杆组件。相反,你使用一个单独的swing组件(通常是JPanel)作为画布来绘制你的游戏对象。您只需定期为该JPanel调用repaint()(例如,每秒30或60次)。当然,你会覆盖JPanel上的paintComponent()来使用你自己的代码来绘制所有的游戏对象。
编辑:概述你怎么做你自己的渲染
您需要决定如何组织你的游戏相关的对象。一个很简单的骨架看起来是这样的(省略getter/setter方法):
public class GameObject {
public int x;
public int y;
public Image image;
}
在实践中,这种类将有更多的成员(如控制对象如何动作行为,并为动画也许有些州/计数器) 。对于每种可能的行为(如船,小行星和子弹),它也可以是具体的子类的抽象。 GameObject的所有实例都在某种集合中进行管理,我假设您使用了一个List。
当实现在列表中把它归结为只是环路的paintComponent和渲染每个物体的图像:
public void paintComponent(Graphics g) {
List<GameObject> list = ... // however you obtain it in your game
for (GameObject gobject : list) {
g.drawImage(gobject.image, gobject.x, gobject.y, (ImageObserver) null);
}
}
更复杂的游戏,可以责令gameobjects获得的游戏对象如何相互重叠的控制。但原则上它非常简单。
有关信息,我有一个代表船舶,子弹和小行星的标签,我将它们添加到我的面板并将它们移除,因为它们被用于拍摄或耗尽生命。使用add(component);并删除(对手);然后我添加我重新验证。 – Elton 2013-02-16 10:30:56