Java游戏通用设计-乒乓球

Java游戏通用设计-乒乓球,java,swing,design-patterns,model-view-controller,Java,Swing,Design Patterns,Model View Controller,我在爪哇打乒乓球是为了好玩。我刚刚完成了俄罗斯方块,但开始构建游戏时出现了错误,因此整个程序的设计都很糟糕,这限制了我可以做的事情 这一次,我想从现在开始。我想: 按照MVC模式创建游戏 有合理的班级组织和脱钩 正确使用封装 将GUI与游戏规则分开 也就是说,我提出的班级结构是否正确使用了班级 Main类:扩展JFrame负责将JPanel添加到JFrame并初始化游戏 将GamePanel和ScorePanel添加到JFrame 设置其大小和位置等。。。(使用frame.pack()…)

我在爪哇打乒乓球是为了好玩。我刚刚完成了俄罗斯方块,但开始构建游戏时出现了错误,因此整个程序的设计都很糟糕,这限制了我可以做的事情

这一次,我想从现在开始。我想:

  • 按照MVC模式创建游戏
  • 有合理的班级组织和脱钩
  • 正确使用封装
  • 将GUI与游戏规则分开
也就是说,我提出的班级结构是否正确使用了班级

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

  • 将GamePanel和ScorePanel添加到JFrame
  • 设置其大小和位置等。。。(使用frame.pack()…)
  • 初始化游戏-
    publicstaticvoidmain(String[]args){…
游戏面板类:扩展JPanel:只负责知道自己的边界以及对象是否违反这些规则

  • paintComponent()将形状(桨和球)绘制到屏幕上
  • 具有边界和碰撞(球与桨碰撞)规则
  • KeyListeners(不确定是否在正确的位置)
  • 游戏计时器设置游戏的节拍
GameRules类:负责从GamePanel获取数据(例如,如果球与球拍碰撞),并根据这些数据计算分数和其他信息

  • 比赛得分、比赛结束规则、水准
  • 球反弹时的角度(不确定是否在正确的位置)
ScorePanel类:GUI负责向玩家显示分数、级别和其他相关数据……将从GameRules类获取其数据

  • paintComponent()将分数和其他数据绘制到屏幕上
桨类:扩展矩形2D(AWT)只负责知道自己的(x,y)坐标……拥有自己的颜色,设置新位置

  • getX(),getY()
  • getColor()
  • 设置位置(x,y)
球类:扩展Ellipse2D(AWT)负责了解自己的(x,y)坐标……就像球拍一样


问题:

  • 不确定在哪里放置数学来计算球应该反弹的角度
  • keyListener应该去哪里
  • 如何使用“游戏循环”而不是让游戏通过
    paintComponent()
    运行
  • 尝试遵循MVC模式……这能实现吗
谢谢大家!

编辑

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

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

keyListener应该去哪里

我的第一个猜测是GamePanel类

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

您的GamePanel paintComponent方法负责绘制挡板和球的当前状态。如果您的挡板和球有自己的绘制方法,则会有所帮助,以便paintComponent仅调用挡板和球的绘制方法

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

尝试遵循MVC模式……这能实现吗

JavaSwing可以在视图中以匿名操作类的形式包含控制器代码

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


看看这篇文章,看看如何组合一个中等复杂的Swing GUI。我没有任何视频游戏的例子给你看。

看起来你可能还需要一个Block类来处理那些被球破坏的块。你基本上了解MVC。有时候V&C层会有点分组,但是你的M层看起来很棒(除了Block类)@D.R.我正在做游戏
pong
,你只需来回弹起球。没有任何阻挡会被打破:)哦!对不起!我想的是错误的游戏(突破).那么你的模型层看起来很完美!而且看起来V&C层也很不错!@D.R.好的,你知道我应该在哪里添加角度计算和所有的数学计算吗?为什么投票决定关闭…我认为这是一个足够普遍的问题,人们可以从中受益(MVC、基本OOP设计方法等)谢谢你的回答,吉尔伯特。我在上面更新了一张图片,我认为我的课程如何符合维基百科给出的MVC图片。这有意义吗?Thanks@Growler:从逻辑上讲,这些图表是有意义的。从物理上讲,如果没有大量不必要的wo,您将无法将Java Swing代码清晰地分离到模型/视图/控制器中rk。