【发布时间】:2013-05-21 18:42:37
【问题描述】:
我用 Java 制作 Pong 是为了好玩。我刚完成俄罗斯方块,但开始构建游戏时不正确,因此整个程序都遵循了糟糕的设计,这限制了我可以做的事情。
这一次,我想从正确的开始。我想:
- 按照 MVC 模型创建游戏
- 有合理的类组织和解耦
- 正确使用封装
- 将 GUI 与游戏规则分开
话虽如此,我提议的类结构是否正确使用了类?
主类:extends JFrame 负责将 JPanel 添加到 JFrame 并初始化游戏
- 将 GamePanel 和 ScorePanel 添加到 JFrame
- 设置它们的大小和位置等...(使用 frame.pack()...)
- 初始化游戏-
public static void main(String[] args) {...
GamePanel 类:扩展 JPanel:只负责了解自己的边界以及对象是否违反这些规则...
- paintComponent() 将形状(桨和球)绘制到屏幕上
- 具有边界和碰撞(球与桨碰撞)规则
- KeyListeners(不确定位置是否正确)
- 游戏计时器设置游戏节拍
GameRules 类:负责从 GamePanel 中获取数据(例如,如果球与球拍碰撞),并据此计算得分和其他信息...
- 游戏计分、游戏结束规则、练级
- 球反弹时的角度(不确定位置是否正确)
ScorePanel 类: GUI 负责向玩家显示分数、级别和其他相关数据...将从 GameRules 类中获取其数据。
- paintComponent() 将分数和其他数据绘制到屏幕上
Paddle 类:扩展 Rectangle2D (AWT) 只负责知道自己的 (x,y) 坐标...拥有自己的颜色,设置新位置
- getX(), getY()
- getColor()
- setLocation(x, y)
Ball 类:扩展 Ellipse2D (AWT) 只负责了解自己的 (x,y) 坐标...就像 Paddle 一样
问题:
- 不确定将计算球反弹角度的数学放在哪里
- keyListener 应该去哪里?
- 如何使用“游戏循环”而不是让游戏通过
paintComponent()运行? - 尝试遵循 MVC 模型...这是否实现了它?
谢谢!
编辑
【问题讨论】:
-
看起来你可能还需要一个 Block 类来处理被球破坏的块。您几乎对 MVC 有了大致的了解。有时 V & C 层会有点组合,但你的 M 层看起来很棒(除了 Block 类)
-
@D.R.我正在制作游戏
pong,您只需在其中来回弹跳球。没有块会被打破:) -
糟糕!对不起!我在想错误的游戏(Breakout)。那么你的模型层看起来很完美!而且看起来 V&C 层也相当不错!
-
@D.R.好的,你知道我应该在哪里添加角度和所有数学计算吗?
-
为什么投票结束...我认为这是一个足够普遍的问题,人们可以从中受益(MVC、基本的 OOP 设计方法等)
标签: java swing design-patterns model-view-controller