Android 安卓射击游戏。复杂群体行为的鲁棒敌方模式

Android 安卓射击游戏。复杂群体行为的鲁棒敌方模式,android,artificial-intelligence,Android,Artificial Intelligence,我正在为Android开发一款类似Ikaruga的街机射击游戏。我面临的问题是,很难为敌人创建移动和射击模式。目前,我已经创建了两个抽象类EnemyShip和FlightPath,每个不同的敌人和移动模式分别从中派生。当世界 创建时,它实例化一个LevelManager,该管理器以以下形式存储级别信息: waveInfos.add(new WaveInfo(3, 3f)); // new WaveInfo(NumberOfGroups, spawn interval) enemyGroups.a

我正在为Android开发一款类似Ikaruga的街机射击游戏。我面临的问题是,很难为敌人创建移动和射击模式。目前,我已经创建了两个抽象类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 Component,它将接管并开始根据自己的状态时间发出指令,并且由于每个FlightPath都有一个指向其敌对所有者的引用字段,因此它可以访问其控制的飞船的功能和成员

Eneyship类有一些简单的指令函数,比如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()语句来检查组中的其他敌人在做什么等等

我希望我已经提供了足够的信息让你了解如何对付敌人。我将向任何感兴趣的人提供任何源代码。提前谢谢你对这个问题的解释

马里奥斯·卡洛格罗

编辑:我发现了一个页面,该页面非常详细地描述了适合我需要的系统类型,但我不确定如何正确地实现整个组关键帧


有不同的方法:

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

  • 你可以控制敌人的移动。群中的每个敌人都试图保持其相对于群中心的位置

  • 对于真正复杂的模式,最好开发一些简单的脚本引擎。它可以非常简单(如的系数数组),也可以更复杂。我相信,在这样的游戏中,行为是由脚本完成的


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

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

    EnemyGroup然后控制每个EnemyShip的繁殖。如果你在一个EnemyGroup中有8艘敌舰,它们都拥有相同的飞行路径类型,那么你可以想象EnemyGroup会在相隔500米左右的地方产卵每艘战舰来产生波浪


    最后,您将转换所有与世界/屏幕坐标相关的EnemyShip坐标,该坐标通常在垂直方向缓慢移动。

    谢谢您的快速回复。我真的很喜欢你关于脚本引擎的想法,但我对游戏编程和一般编程都很陌生。我将研究如何最好地实现这种类型的系统。再次感谢您的迅速答复。我猜FlightPath是个错误的名字:D我喜欢你说的FlightPath是严格意义上的路径。我将为此重新调整系统,为EnemyShip类提供更多功能,并让EnemyGroup控制整个团队行为,而不仅仅是创建和存储敌人。也许可以将AI分开,让飞船根据EnemyGroup提供的飞行路径、速度和提示控制自己的移动,EnemyGroup将整个团队作为一个整体进行跟踪,以便检查何时向飞船发出新指令。谢谢你,伙计