嘿,我正在用 Java 实现一个简单突破克隆,并尝试使其符合 MVC 模式。我承认,我有 Web 背景,只在 Php 框架 Symfony 中使用过 MVC,从未在桌面应用程序中使用过。所以我的问题是决定哪个实体负责哪些任务。
我将我的项目分为这些类:
Breakout extends JFrame
(主类)启动MainViewController
并将其 View 添加到内容 Pane 。MainViewController extends TimerTask
启动MainView
并处理其鼠标和键盘事件。还运行游戏循环(计算游戏对象的位置和状态,即Ball
、Paddle
、Brick
),是在这个地方?MainView extends JPanel
只是在屏幕上绘制Ball
、Paddle
、Brick
,这里没有任何逻辑。但是,它也会启动这些对象。恐怕这是不正确的,对吧?
最后是游戏元素:
Ball extends Ellipse2D
、Paddle extends Rectangle2D
和Brick extends Rectangle2D
提供了在屏幕上移动它们的方法,而且碰撞检测也是在这里完成的。再次,我怀疑这是正确的位置,将其移至 Controller 吗?
什么是模型?我想,正是这些游戏元素,因为它们代表了游戏期间唯一更改的数据。但这些都是 Controller 元素,因为它们也提供碰撞检测逻辑。它们最好的一点是,它们是在 view 类中启动的。我确信我的设计决策出了问题。
最佳答案
开发游戏的概念有点不同,但仍然是 MVC。
您的模型是游戏的实体,例如球、桨和砖 block 。
游戏由基本的三个步骤组成。
1° 读取输入(ViewController 会计算该输入)
2° Process Pieces AI(例如行为并根据 Controller 的新值进行移动)
3°在屏幕上绘制(您在屏幕上绘制所有实体)
在第一步中,如果用户输入向左或向右,您应该使用这些值更新桨实体。
碰撞应该在第二步中测试,对于你的例子,球应该测试它是否与任何砖 block 或桨相交来击退,球不需要用户 Action 来移动,所以它应该不断地移动某个方向直到相交。
第三步只是在屏幕上绘制所有元素。
游戏的第一个对象应该在 View init 的 setup() 方法中创建,其他对象(例如桨射击或从 splinter 的砖 block 中掉落的特殊奖励)应该在第二步中创建对于桨的情况, Controller 应该告诉桨用户按下按钮进行射击,在这个过程中,您创建射击实体并将其添加到实体游戏循环中,与砖 block 相同,但是当它注意它被摧毁了。
关于java - 简单的 Java 游戏中的 MVC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587005/