Java游戏通用设计 - 乒乓球

时间:2013-05-21 18:42:38

标签: java swing design-patterns model-view-controller

我正在用Java制作Pong以获得乐趣。我刚刚完成俄罗斯方块,但开始错误地构建游戏,所以在整个程序中遵循的糟糕设计限制了我可以做的事情。

这一次,我想开始吧。我想:

  • 按照MVC模型创建游戏
  • 有明智的班级组织和脱钩
  • 正确使用封装
  • 从游戏规则中分离GUI

话虽如此,我提出的类结构是否正确使用了类?

主类:扩展JFrame 负责将JPanel添加到JFrame并使游戏初始化

  • 将GamePanel和ScorePanel添加到JFrame
  • 设置其大小和位置等...(使用frame.pack()...)
  • 初始化游戏 - public static void main(String[] args) {...

GamePanel类:扩展JPanel :仅负责了解自己的边界以及对象是否违反这些规则......

  • paintComponent()将形状(Paddles和ball)绘制到屏幕
  • 边界和碰撞(球碰撞)规则
  • KeyListeners(不确定是否在正确的位置)
  • 游戏计时器设置游戏的节拍

GameRules类:负责从GamePanel获取数据(如果球与球拍相撞),并根据该数据计算得分和其他信息......

  • 游戏得分,游戏结束规则,练级
  • 球弹跳时的角度(不确定是否在正确的位置)

ScorePanel类: GUI负责向玩家显示分数,级别和其他相关数据...将从GameRules类获取其数据。

  • paintComponent()将分数和其他数据绘制到屏幕

Paddle类:扩展Rectangle2D(AWT)负责只知道自己的(x,y)坐标......拥有自己的颜色,设置新的位置

  • getX(),getY()
  • 的getColor()
  • setLocation(x,y)

球类:扩展Ellipse2D(AWT)负责只知道自己的(x,y)坐标...就像Paddle一样


问题:

  • 不确定将数学用于计算角度的位置球应该在
  • 处反弹
  • keyListener应该去哪里?
  • 如何使用“游戏循环”而不是让游戏通过paintComponent()
  • 尝试遵循MVC模型......这是否实现了目标?

谢谢!

修改

enter image description here

1 个答案:

答案 0 :(得分:4)

  

不确定将数学用于计算角度的位置球应该在

处反弹

GameRules和任何一个类一样好。如果你的数学更精细,你可以创建一个GameMath类。

  

keyListener应该去哪里?

我的第一个猜测是GamePanel类。

  

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

你的GamePanel paintComponent方法负责绘制桨和球的当前状态。如果你的桨和球有自己的绘制方法,那么paintComponent只会调用paddles和ball draw方法。

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

  

尝试遵循MVC模型......是否实现了这一目标?

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

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

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