我正在开发类似于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
编辑:我找到了一个页面,它非常详细地说明了我想要的系统类型,但我不确定如何正确地实现它与整个组keyFrameshttp://www.yaldex.com/games-programming/0672323699_ch12lev1sec3.html
答案 0 :(得分:1)
有不同的方法:
您可以在拍摄前添加随机间隔,并设置稍微随机的到达时间。与currentEnemyArrivalTime += (X - rand(2*X))
一样。
你可以控制一群敌人的移动。组中的每个敌人都试图保持它相对于组中心的位置。
对于真正复杂的模式,开发一些简单的脚本引擎可能会更好。它可以非常简单(如spline的系数数组),或更复杂的东西。我相信,在这样的游戏中,行为是通过脚本完成的。
答案 1 :(得分:1)
FlightPath不应该控制任何对象。这是一条路,而不是经理。但是,它应该能够给出任何关键帧或时间的坐标。例如:flightPath.getX(1200)
- >我应该在1200毫米的X坐标位置?
每个EnemyShip都应该拥有一个FlightPath实例。 EnemyShip每帧检查它应该在路径中的位置。
然后,最后,您将所有EnemyShip坐标相对于世界/屏幕坐标进行平移,该坐标传统上在垂直方向上缓慢移动。