【问题标题】:Java Game General Design - Pong [closed]Java 游戏通用设计 - Pong [关闭]
【发布时间】: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


【解决方案1】:

不确定在哪里放置数学来计算球应该反弹的角度

GameRules 是一个很好的课程。如果您的数学更精细,您可以创建一个 GameMath 类。

keyListener 应该去哪里?

我的第一个猜测是 GamePanel 类。

如何使用“游戏循环”而不是让游戏通过paintComponent() 运行?

您的 GamePanel paintComponent 方法负责绘制球拍和球的当前状态。如果您的球拍和球有自己的绘制方法会很有帮助,这样paintComponent 只会调用球拍和球的绘制方法。

您的游戏循环会更新桨和球类中的值。您可以在其自己的循环中调用paintComponent,以获得稳定的帧速率,并在不同的循环中调用您的球拍和球位置更新。

尝试遵循 MVC 模型...这实现了吗?

Java Swing 可以在视图中以匿名操作类的形式包含控制器代码。我说把绘图代码放在模型类中。

虽然代码不一定是分开的,但功能是分开的。模型类中的绘图代码由绘图 JPanel 执行。视图类中的控制代码作为控制动作的一部分执行。

看看这篇文章,Sudoku Solver Swing GUI,看看如何组合一个适度复杂的 Swing GUI。我没有任何视频游戏的例子可以给你看。

【讨论】:

  • 感谢吉尔伯特的回答。我在上面更新了一张我认为我的课程如何适合 Wikipedia 给出的 MVC 图片的图片。是否有意义?谢谢
  • @Growler:从逻辑上讲,是的,这些图表是有道理的。从物理上讲,如果没有大量不必要的工作,您将无法将 Java Swing 代码清晰地分离到模型/视图/控制器中。
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多