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

Maz*_*azK 6 android artificial-intelligence

我正在开发类似于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();
Run Code Online (Sandbox Code Playgroud)

这些级别被分成一组敌人,现在EnemyGroup类负责实例化,将指定的FlightPath添加到新创建的敌人,并将该敌人传递给LevelManager中的ArrayList进行存储,直到在需要时生成世界.

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

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;
Run Code Online (Sandbox Code Playgroud)

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

gar*_*tor 1

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

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

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

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