Android射击游戏。针对复杂群体行为的强大敌人模式

时间:2012-04-10 16:39:46

标签: android artificial-intelligence

我正在开发类似于Ikaruga的Android街机射击游戏。我面临的问题是,它很难为敌人强有力地创造移动和射击模式。目前我已经创建了两个抽象类EnemyShip和FlightPath,每个不同的敌人和移动模式分别来自它们。当世界 创建它实例化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所有者,它可以访问船舶的功能和成员它&#39控制。

EnemyShip类有一些简单指令的功能,如moveTo(float x,float y,float duration)和shoot(),但即使有这些,FlightPath衍生物也难以制作,特别是当我想要同一个不同的敌人时组的路径略有不同,到达时间略有不同。

我在FlightPath中创建了一些字段来跟踪keyFrames:

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()语句来检查组中其他敌人正在做什么等等。

我希望我能提供足够的信息让你了解敌人的处理方式。我会向感兴趣的人提供任何源代码。提前感谢你可以解决这个问题。

Marios Kalogerou

编辑:我找到了一个页面,它非常详细地说明了我想要的系统类型,但我不确定如何正确地实现它与整个组keyFrames

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

2 个答案:

答案 0 :(得分:1)

有不同的方法:

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

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

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

答案 1 :(得分:1)

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

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

然后, EnemyGroup控制每个EnemyShip的产卵。如果你在一个EnemyGroup中拥有8个EnemyShips,它们都拥有相同的FlightPath类型,那么你可以想象EnemyGroup会在每个船只相隔500ms左右产生这些波浪。

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