我的Java游戏编程方法是否足够

时间:2012-07-12 06:01:59

标签: java slick2d

所以我正在使用slick2d和MarteEngine库进行2D游戏。这是自从我为Java类制作检查器以来最大的项目。我对编程概念和使用最佳方法完成工作仍然很陌生。

我的游戏的基本结构是你是僵尸大灾难中的玩家/英雄,你可以聚集幸存者来帮助你。在我的编程中,我关注的领域很多。我不确定我的方法是否是我想要的好选择。此游戏目前还没有网格/磁贴系统。

我看过一些开源的java游戏,他们并没有真正回答我的问题。所以我要在这里列出我不确定的内容,我希望你们能确认/否认我的方法是否合适。很抱歉,如果这个列表太长,我会在输入时考虑问题。

  1. 定位/攻击 - 一旦进入枪支目标范围内,幸存者将自动攻击僵尸。要做到这一点,我让每个幸存者得到每个僵尸的距离(使用距离公式)并找到最接近攻击的人。我经常检查这个,所以如果更快的僵尸越来越近,幸存者将改变目标。对于僵尸,他们获得了一个目标并坚持下去(目前)。僵尸使用距离公式不断检查它们是否在攻击范围内(大约50个像素)。如果它们在范围内,则停止并攻击,否则,移向目标。

  2. 2D相机 - 因此,2D环境中的相机会移动世界而不是您。我当前的方法是将我的僵尸/幸存者/地图上的任何实体存储在数组列表中。首先调整背景,然后循环所有列表,并修改每个实体的x和y值。这似乎工作正常,但有些东西,你真的可以注意到在背景上滑动。不确定如何避免这种情况。

  3. 用户界面 - 我真的不知道如何使用UI。到目前为止我一直在做的只是使用背景,然后生成按钮对象并手动排列它们。然后,我检查鼠标是否在按钮的任何区域上方以及鼠标悬停在按钮上时是否有点击。我有三个不同的背景和按钮,我用布尔值切换。我将重新编码该区域,使用具有背景和按钮的对象。这是做UI的正确方法吗?

  4. 路径查找 - 我还没有找路径系统。我必须坚持网格系统吗?我真的宁愿我的实体在地形上自由移动,而不是在一个奇怪的方形中移动。

  5. 选择 - 我有它,所以你可以选择幸存者,升级它们和其他随机的东西。我目前的选择方法是不断检查鼠标X和Y的位置。我得到了鼠标到每个幸存者的距离,并检查它是否在30像素以内。然后,我检查是否有点击,如果是,请选择幸存者并取消选中所有其他幸存者。如果我点击空地,我仍然想弄清楚如何取消所有幸存者的选择。有没有更好的方法来做这个?

  6. 挑选东西 - 与之前说的相同。我检查从玩家到可以拾取的每个项目的距离。如果项目在播放器的30像素范围内,则会将其拾取。它似乎在我想的那一刻工作正常。也许真的没有其他方法可以做到这一点。

  7. 动画 - 我了解如何使用精灵制作动画,但我只是想确定一下。因此,如果我要拍摄7种不同的枪,我是否需要手动制作在每个精灵上具有精确定时的功能。如果我有一把猎枪,它需要一个后坐力,向前泵,短暂停顿,抽回,然后再准备好。对于手枪我真的需要后坐力。所以我必须为每个动画制作独特的功能?

  8. 很抱歉输入这么长的问题列表。我尽可能地收集关于这些东西的信息,但我还没有找到很多这方面的例子。我非常感谢任何答案,即使只是一个是或否答案。提前谢谢!

1 个答案:

答案 0 :(得分:1)

2D相机:

当你说你修改每个实体的位置时,不完全确定你在做什么,但我这样做的方法是拥有一个Camera对象,它有自己的x,y,width,height和移动相机的方法还有,然后在你的Draw周期中:

for (every Object on the map)
{
    if (Object is within Camera bounds)
    {
        // Draw the Object at the Object-xy minus the Camera-xy
        // This will draw the Object at its position relative to the camera
        // and won't waste time drawing things that are not within camera bounds
    }
}

定位/攻击

你有正确的想法,但检查每个僵尸对抗每个幸存者将需要大量的计算和(取决于有多少僵尸和幸存者)会导致游戏减速很多。这与碰撞检测相同,检查每个对象是否与其他对象相关,以查看它们是否发生碰撞需要很多。有些方法可以不必检查所有内容,我建议您阅读“空间分区”。我没有使用过slick2d,但也许已经为你实现了这样的东西。

挑选内容

与定位/攻击相同的交易,如果有太多物品或物品可以拾取物品,它将最终降低帧速率。

<强>选择

这不是你应该选择的方式,但我自己根本不必使用选择,所以我不完全确定最好的方法,你应该尝试寻找方法来做到这一点。无论哪种方式,只需检查一下点击就可以改善当前的方式,你不需要检查每一帧,只检查点击的时间。

这是我目前所能提供的所有帮助,我希望它至少对你有用。