当前位置: 首页 > 面试题库 >

Java图形-游戏阶段

郏志诚
2023-03-14
问题内容

这是最近困扰我的话题。

在JFrame中创建游戏时,您想使用paintComponent()-method将图形添加到JPanel中,如何给游戏提供不同的阶段?哪个最适合表现?

我可以想到的两种方法是:

  1. 添加和删​​除包含它们自己的- paintComponent()方法和计时器的面板。游戏的每个阶段(关卡等)将使用不同的面板。
  2. 将所有内容放在一个面板或框架中,并具有许多布尔值和if语句。例如,如果是游戏结束,则将布尔值更改为true,然后在paintComponent()-method 内使用if语句,该语句会说出if(gameover)然后绘制游戏此阶段的图形。

还是有其他更好的方法?


问题答案:

“放弃所有希望,通过Swing进入游戏的人!”

要回答您的问题,JPanel只是要在其上绘画的表面,例如黑板或纸。它们与阶段无关,或者与您可以借鉴的东西无关,并且与其他子组件的容器无关。

为了解决游戏特定的问题,我建议您不要浪费时间使用Swing组件来构建游戏界面。尽管有 可能
,但是您将遇到一系列性能问题,这些问题只会占用您的时间。根据您的问题,您已经在考虑诸如计时器之类的低级内容来安排事情,并覆盖该paintComponent()方法-
这是一个非常常见的错误,很多失败的项目都花时间去发现这不是最佳方法。

如果您的问题从字面上看是您可以看到的森林中的一条路径,那么您会注意到以下几点:

  • 这是很容易破解的(因为这似乎是最直接的方法)
  • 即将到来的是一些尖刻的性能陷阱,以及模糊,非跨平台兼容的调整
  • 您必须弄清楚如何使用Swing的绘画管理器来完成所需的工作,而在大多数情况下,对于大多数游戏而言,您都希望对渲染管线/过程进行直接的确定性控制即可。
  • 出于奇怪(和愚蠢)的原因,例如“我想构建仅使用标准Java库的游戏”,尝试将Swing用于游戏的项目主体不胜枚举。好的,标准库非常好,但是它的核心是解决业务问题,并且真正擅长服务器和网络软件等。如果您至少没有使用某些gamedev库,则可能会错过使用正确工具进行正确工作的机会。Swing绝对不是为游戏而设计的,因为它基本上满足了游戏开发人员的需求,除非您在谈论用于 构建和编辑 关卡的桌面应用程序/工具以及类似的东西。

相反,请使用Slick2D(用于2D游戏)或jMonkeyEngine等用于3D播放的东西。这些库是
专门 为构建游戏而设计的,将使您不必重新发明众所周知的轮子,而只是为了使您的游戏不断发展。他们也有自己的社区,可以帮助您解决特定于图书馆的问题。

最重要的是,他们已经解决了一些最棘手的跨平台问题,例如处理各种版本的OpenGL,以及其他技术细节,我敢打赌您在一天结束时不会真正在意,您真正想要的是,“嘿,给我一个[任意分辨率],图形加速的表面以进行绘制,不要使其变得复杂!”



 类似资料:
  • 问题内容: 下学期,我们有一个团队中的Java应用程序模块。该模块的要求是制作游戏。在圣诞节假期里,我一直在做一些练习,但是我想不出绘制图形的最佳方法。 我正在使用Java Graphics2D对象在屏幕上绘制形状,并每秒调用30次,但这非常闪烁。有没有更好的方法来绘制Java中的高性能2D图形? 问题答案: 您想要做的是创建一个带有BufferStrategy的canvas组件并对其进行渲染,下

  • 全球理念:假设我想做一个游戏/电影/剪辑。为此,我需要这个(不)简单的动画得到工作。 这个问题的一个例子:我得到了类Screen,它有JFrame的Screen Stuff声明,设置它的配置(大小、关闭操作等),然后创建类Box的对象,显示在框架上。请检查这个类的图像/图表(希望我写的是正确的):ClassesDiagram 现在,class Box扩展了JPanel。我从JPanel继承了方法P

  • 面试时间整整一小时,嘴都说干了,整体难度不大,问的全都是其他面经里问的内容 一开始问的C++ 上来先手写一个拷贝构造函数,要求这个类有2个成员变量,int和char *;写完之后面试官提醒深浅拷贝,然后把char指针的拷贝改为深度拷贝,这里提醒char指针通常用来存储字符串,需要读取字符串长度,这里我手写的方法,在判断指针到字符串尾部的时候我写成了(*c)=='\n',这里面试官提醒了应该是'\0

  • 本文向大家介绍Java游戏开发拼图游戏经典版,包括了Java游戏开发拼图游戏经典版的使用技巧和注意事项,需要的朋友参考一下 游戏介绍: 拼图游戏是一款经典的益智游戏,游戏难度分为 简单、正常、困难 三种难度,分别对应3*3,4*4,5*5布局,游戏开始前图片被随机打乱,空块位于最右下角,玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换,直到所有图片都回到原位即为游戏胜利。 本次制作的拼

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 我在java中创建了一个2D游戏,并试图将其分辨率提高到60 fps,分辨率为1920x1080像素。我的游戏逻辑在不到1毫秒的时间内表现良好。但是绘图需要超过10毫秒。在我相当强大的台式机(英特尔i5-4670K@3.40Ghz)上这可能就足够了,但是在我的笔记本电脑(英特尔i5-6300HQ@2.30Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤: > 将游戏的每个部分绘制到Buffere