Articles of Java

不完美的乒乓球AI

所以我开始在使用LWJGL的时候学习Java和一些OpenGL。 从容易开始,我正在写一个Atari Pong的克隆。 我已经正确地设置了游戏画面,碰撞检测,而且所有的游戏大部分都在工作,实际上,如果它是一个双人游戏,我现在就完成了,但是因为我打算这样做一个单人游戏,我必须想出一个简单的AI来控制第二个玩家。 知道这个球打哪里似乎相当微不足道,创造一个总是击球的AI似乎是一件容易的事情,但是我希望能够赢得比赛,所以我不能总是让IA打中球。 所以,这里是我的问题,我应该如何编码,以增加AI的人为缺陷。 我应该随机决定人工智能是否会在某一点失败? 还是有一个更聪明(或者也许只是显而易见)的东西,我在这里失踪? 非常感谢你。

什么是不同的方式来定义RPG游戏的项目?

我在java中随意使用RPGtypes的游戏,但是我很难搞清楚如何让项目可以做很多不同的事情,而无需为每个项目创建不同的类。 举个例子,我将如何创建一个可以砍树和攻击怪物的斧头? 如果我延长斩或武器级别,那么我不能延长其他职业。 如果我砍断武器成为一个界面,那么当一把匕首也可以攻击怪物而另一把斧头砍树时,我会有很多重复的代码。 我希望有一种方法可以有一个单一的物品类,并从文件中加载物品和他们各自的能力。 如果可能的话,怎么办? 如果不是,那么在游戏中放置物品的最佳方式是什么?

主游戏循环运行失控是否有害?

我想知道当我的游戏循环以系统允许的速度运行时是否有任何可能的伤害? 我现在有一个循环,通过测量纳秒的传递时间,以预定的速度运行游戏逻辑和渲染逻辑,没有问题。 事实上,我在循环中做的任何逻辑都是每秒都有一定数量的调用。 循环本身虽然运行速度一样快,但是在我的机器上每秒循环大约1170万次。 循环(简单伪代码): while(!isGameOver){ if(canPollInputs){ pollInputs() } while(canStepLogic){ stepLogic() } if(canRender){ render() } } 我的问题基本上是如果这个简单的循环,如果没有以受控的速度运行,可以对系统造成任何损害? 编辑:这意味着我的逻辑每秒运行30次(30 tps),我的渲染器运行在60 fps,我轮询input每秒100次,还有一些逻辑来应付逻辑或呈现花费比预期更长的时间。 但是循环本身没有被限制。 编辑:使用Thread.sleep()来例如调整主循环下降到每秒250循环导致减less,但循环运行在大约每秒570循环,而不是所需的250(当我在我的桌面时将添加代码机..) 编辑:在这里,我们去,一个工作的java gameloop为了澄清事情。 也可以随意使用它,但不要求你的;) private void gameLoop() { // Time that must elapse before a new run double timePerPoll = 1000000000l / targetPPS; double timePerTick = 1000000000l / targetTPS; double timePerFrame = 1000000000l / […]

如何实现一个永不重新启动的testing世界?

我正在寻找关于如何执行以下操作的想法:我想用Java编写一个简单的“世界”。 一个我可以开始,然后稍后添加新的对象来模拟/观察现有对象之间的不同行为。 然后,计划在观察旧的对象之后编码新的对象,然后将它们加载/放入现有的世界中。 问题是,我不希望在开始之后停止或重新启动世界,我希望它运行几个星期,但是我需要能够放入对象并重做/重写/删除/创建/改变它们随着时间的推移而不需要重启。 这个世界可以像一个100 x 100的X / Y位置arrays一样简单,用一个可能的平铺图GUI来直观地表示世界。 我知道我需要某种ticktimer过程来监视对象,给每个对象一个'行动的机会'(如果他们想要的话(如果轮到他们的话)?)。 例如:我星期一编写了World.java并保持运行。 然后在星期二,我写了一个名为Rock.java的新类(不移动)。 然后,我将它加载/放置到这个已经运行的世界(它只是将它放置在世界arrays中的任意位置,并且永远不会移动)。 然后在星期三,我创建了一个名为Cat.java的新类,并将其放到了这个世界中,然后再随机放置,但是这个新对象可以在世界上移动(在某个单位时间内),然后在星期四我写了一个名为Dog的类。 Java也可以移动,但是如果它在邻居位置,可以“对另一个对象起作用”,反之亦然。 这是事情。 我不知道我需要什么样的结构/devise来编写实际的世界级,以知道如何检测/加载/跟踪未来(和目前不存在的)对象。 有关如何使用Java来做这种事情的任何想法?

如何提高Voxel / Minecrafttypes游戏的渲染速度?

我正在写我自己的Minecraft(也用Java编写)的克隆。 它现在很好用。 观看距离为40米,我可以轻松地在我的MacBook Pro 8,1上达到60 FPS。 (Intel i5 + Intel HD Graphics 3000)。 但如果我把观看距离放在70米,我只能达到15-25 FPS。 在真实的“我的世界”中,我可以毫无问题地将观看的距离放在远处(= 256米)。 所以我的问题是我应该怎样做才能使我的游戏更好? 我实施的优化: 只保留本地块(取决于玩家的观看距离) 剔除(首先在块上,然后在块上) 只绘制块真正可见的面孔 使用包含可见块的每个块的列表。 成为可见的块将自动添加到此列表中。 如果他们变得不可见,他们会自动从这个列表中删除。 块通过建立或销毁邻居块而成为(可见)。 使用包含更新块的每个块的列表。 与可见块列表相同的机制。 在游戏循环中几乎不使用new语句。 (我的游戏运行大约20秒,直到垃圾收集器被调用) 目前我正在使用OpenGL调用列表。 ( glNewList() , glEndList() , glCallList() )为一种块的每一边。 目前我甚至没有使用任何types的照明系统。 我已经听说了VBO的。 但我不知道究竟是什么。 但是,我会对它们进行一些研究。 他们会提高性能吗? 在实现VBO之前,我想尝试使用glCallLists()并传递一个呼叫列表。 而是使用千次glCallList() 。 (我想试试这个,因为我认为真正的MineCraft不使用VBO,是否正确?) 还有其他的技巧来提高性能吗? VisualVM剖析表明了这一点(剖析仅33帧,观看距离为70米): 40米(246帧)的分析: 注意:我正在同步很多方法和代码块,因为我正在另一个线程中生成块。 我认为在一个游戏循环中进行这么多操作时,获取锁对象是一个性能问题(当然,我只是在讨论只有游戏循环并且没有生成新块的时间)。 这是正确的吗? 编辑:删除一些synchronised块和其他一些小的改进之后。 performance已经好多了。 […]

什么是保存游戏数据的好文件格式?

我需要保存一些自定义的游戏数据。 地图,玩家等 他们都将有“子对象”。 例如,地图和地图将有一个“arrays”的瓷砖。 即分层数据。 希望没有二进制。 这将是一个很好的格式? 到目前为止,我认为: Serailization:这是快速和容易的,但是当我改变底层类时往往会中断:( XML:我真的很讨厌parsing这个。 我的testing用例超过了100多行代码,就算是非常简单的格式,也似乎喜欢大量的“忙碌的工作”。 INI:对分层数据来说真的很笨拙。 Protobuf:从来没有使用过,但是如果你改变了课程的话,你必须做大量的手动操作。 其他选项? 这就是我来这里的原因! 编辑:这是Java btw。 编辑2: 我解决了“受控的二进制序列化”(见下文)。 优点: 它很快 它很小(在磁盘上),在读/写过程中可以很容易地进行压缩/解压缩。 从游戏和工具集中读取/写入是非常容易的。 我可以决定包含/排除对象的内容。 对象/数据可以嵌套。 缺点: 不能手工编辑(如XML,YAML等) 不能用脚本轻松读取/修改 与其他实现相比,默认情况下,Java序列化非常缓慢/臃肿,但它是稳定的并且可行

我怎样才能把2D的高度幻觉变成一个球?

在二维顶级的足球比赛中,有时候球会有空中的幻想,如下图: 我怎样才能做到这一点?

Java是否可以用于严肃的游戏开发?

我已经搜遍了互联网,但是Java游戏开发的资源并不是很多,几乎没有C ++那么多。 事实上,大多数引擎都是用C ++编写的。 我试图玩jMonkeyEngine制作的游戏,但是游戏非常缓慢,到了我的电脑冻结的地步。 我没有其他的Java应用程序在运行,也没有太多的资源密集型。 相比之下,我的电脑可以轻松玩大部分现代3D游戏。 如果我现在继续学习和改进Java,事实certificate,后来我需要学习C ++,使得切换可能是困难的。 Java是否是严肃游戏开发的可接受的语言? 认真的说,我的意思是高质量的graphics,在现代计算机上没有太多滞后。 我也想考虑为游戏机制作游戏。

我应该使用哪种数据types用于游戏币?

在一个简单的商业模拟游戏(内置Java + Slick2D)中,玩家当前的金额应该作为一个float还是一个int来存储? 在我的使用案例中,大多数交易将使用美分($ 0.50,$ 1.20等),并将涉及简单的利率计算。 我见过有人说你永远不应该使用float货币,以及人们说你永远不应该使用int货币。 我觉得我应该使用int和四舍五入任何必要的百分比计算。 我应该使用什么?