6

我正在开发一款类似于 Ikaruga 的 Android 街机射击游戏。我面临的问题是,为敌人创建移动和射击模式非常困难。目前,我创建了两个抽象类 EnemyShip 和 FlightPath,每个不同的敌人和移动模式分别从它们派生而来。创建 World 时,它会实例化一个 LevelManager,它以以下形式存储关卡信息:

waveInfos.add(new WaveInfo(3, 3f)); // new WaveInfo(NumberOfGroups, spawn interval)
enemyGroups.add(new EnemyGroup(8, EnemyGroup.TYPE_SCOUT_SHIP, EnemyGroup.F_PATH_INVADERS));
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_L, World.BLACK));
enemyGroups.add(new EnemyGroup(8, EnemyGroup.TYPE_SCOUT_SHIP, EnemyGroup.F_PATH_INVADERS));
// new EnemyGroup(NumberOfEnemies, EnemyType, FlightPathType)
// new EnemyGroup(NumberOfEnemies, EnemyType, FlightPathType, ShipColour)

waveInfos.add(new WaveInfo(2, 0.33f));
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_L, World.WHITE));
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_R, World.WHITE));

totalWaves = waveInfos.size();

关卡被分成几波敌人,现在 EnemyGroup 类负责实例化,将指定的 FlightPath 添加到新创建的敌人,并将该敌人传递给 LevelManager 中的 ArrayList 进行存储,直到在需要的时候生成到世界中。

一旦生成 FlightPath 组件,它就会接管并开始根据它自己的 stateTime 发出指令,并且由于每个 FlightPath 都有一个指向其 EnemyShip 所有者的引用字段,它可以访问它所控制的船的功能和成员。

EnemyShip 类具有一些易于指令的函数,例如 moveTo(float x, float y, float duration) 和 shoot() 但即使使用这些函数,FlightPath 导数也很难制作,尤其是当我希望同一组中的不同敌人拥有路径略有不同,到达时间也略有不同。

我在 FlightPath 中创建了一些字段来跟踪关键帧:

public int currentKeyFrame = 0;
public int totalKeyFrames;
public KeyFrame[] keyFrames; // Stores duration of instruction to be done, the spreadTime, totalFrameTime and enemyIntervalTime
public int shipNumber; // Stores which ship out of group this FlightPath is attached to
public int totalShips; // Stores total number of ships in this EnemyShip's group
public float stateTime = 0;

KeyFrame.spreadTime 是我尝试控制组中第一个敌人开始移动/射击和最后一个敌人之间的时间。

KeyFrame.totalFrameTime = KeyFrame.duration + KeyFrame.spreadTime

KeyFrame.enemyIntervalTime = KeyFrame.spreadTime / 本组敌人数量

虽然这种设置非常适合非常简单的线性运动,但感觉很麻烦。

感谢您阅读本文。我的问题是如何实现更简化的模式控制,这将允许复杂的移动,而无需大量的 if() 语句来检查组中的其他敌人在做什么等。

我希望我已经提供了足够的信息让您了解如何处理敌人。我会向任何有兴趣的人提供任何源代码。提前感谢您对这个主题的任何启发。

马里奥斯·卡洛格鲁

编辑:我找到了一个页面,它非常描述了适合我想要的系统的类型,但我不确定如何在整个组关键帧方面正确实现它

http://www.yaldex.com/games-programming/0672323699_ch12lev1sec3.html

4

2 回答 2

1

有不同的方法:

  1. 您可以在拍摄前添加随机间隔,并设置稍微随机的到达时间。喜欢currentEnemyArrivalTime += (X - rand(2*X))

  2. 您可以控制一群敌人的移动。小组中的每个敌人都试图保持其相对于小组中心的位置。

  3. 对于真正复杂的模式,开发一些简单的脚本引擎可能会更好。它可以非常简单(例如spline的系数数组),或者更复杂的东西。我相信,在这样的游戏中,行为是由脚本完成的。

于 2012-04-10T17:27:52.720 回答
1

FlightPath 不应控制任何对象。这是一条路径,而不是经理。但是,它应该能够在给定任何关键帧或时间的情况下给出坐标。例如:flightPath.getX(1200)-> 我应该在 1200 毫秒的 X 坐标中的什么位置?

每个 EnemyShip 都应该拥有一个 FlightPath 实例。EnemyShip 每帧检查它应该在路径中的位置。

EnemyGroup 然后控制每个 EnemyShip 的生成。如果您在一个 EnemyGroup 中有 8 艘 EnemyShip,它们都具有相同的 FlightPath 类型,那么您可以想象 EnemyGroup 会以大约 500 毫秒的间隔生成每艘船来创建波浪。

最后,将所有 EnemyShip 坐标相对于世界/屏幕坐标平移,传统上它在垂直方向上缓慢移动。

于 2012-04-10T17:41:09.403 回答