使用标签(或通常是 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 的所有实例都在某种集合中进行管理,我假设您使用列表。
在实现 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);
}
}
更复杂的游戏可能会命令游戏对象控制游戏对象如何相互重叠。但原则上它非常简单。