我可以看到@Hovercraft 建议的使用游戏 API 的感觉,但感觉很多简单的游戏都可以没有它。
我同意@Guillaume 的前两点,但之后往往会朝着不同的方向发展。
让我们假设游戏:
- 是固定大小(即不可调整大小)。
- 没有组件出现在它上面。
在这种情况下,我倾向于BufferedImage
在标签中显示的中进行渲染。
具体问题的答案
我应该使用 Swing JFrame 而不是将其添加为 Graphics 对象吗?
那不会编译。所以不行。
我应该先制作一个面板然后在上面添加图形吗?
这基本上是纪尧姆的建议,尽管我更喜欢使用图像作为画布。
或者也许我应该使用画布而不是 JPanel?
如果你的意思是“画布”,java.awt.Canvas
那么没有。
如果你的意思是,java.awt.image.BufferedImage
那么是的。
有些人建议使用该paint()
方法,而其他人则在使用paintComponent()
...
这是一个常见的混淆,因为万维网上有太多旧的和糟糕的代码。
唯一可以使用覆盖paint(Graphics)
的组件是 AWT 和 Swing顶级容器的组件,例如JFrame
、JApplet
或JWindow
.
- AWT 是上个千年的 GUI 组件工具包。我们应该在这个千年使用 Swing。
- 自定义绘制整个 GUI 是不寻常的。相反,它可能会被添加为报告玩家健康、剩余生命、得分等的主要组件。出于这个(和其他)原因,最好渲染到“非顶级容器”,这会让我们看到在
JComponent
or中进行自定义绘画JPanel
。
对于扩展面板或组件中的自定义绘画,覆盖paintComponent(Graphics)
. 这是为这些组件进行自定义绘制的正确方法。
其他提示
游戏的每个对象(例如Ship
、Enemy
、Missile
)都应该知道如何绘制自己。在绘画例程中保留对每个游戏元素的引用,并简单地调用gameElement.paint(Graphics)
(或Graphics2D
)它正在绘画的图形实例。
如果游戏元素是从基于 Java-2D 的Shape
实例中绘制的,或者如果Shape
可以从现有的精灵图像中定义,那么碰撞检测就变得简单了。详情见:
- 使用动态形状获取鼠标检测的答案
![](https://i.stack.imgur.com/NtOZL.gif)
- 复杂形状的碰撞检测的答案
![](https://i.stack.imgur.com/U2KHk.png)