我正在开发一款类似于 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