Sto lavorando a un gioco sparatutto arcade per Android simile a Ikaruga. Il problema che sto affrontando è che è abbastanza difficile creare schemi di mosse e scatti per i nemici. Al momento ho creato due classi astratte EnemyShip e FlightPath da cui derivano rispettivamente ciascun nemico e modello di movimento. Quando viene creato il mondo si crea un'istanza di un LevelManager che memorizza informazioni di livello in forma di:Gioco sparatutto su Android. Robusti schemi nemici per comportamento di gruppo complesso
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();
I livelli sono divisi in ondate di gruppi di nemici e in questo momento la classe EnemyGroup si occupa di creare un'istanza, aggiungendo gli aerei specificato al nemico appena creato e passando quel nemico alla Lista Array in LevelManager per lo stoccaggio fino a quando non viene generato nel mondo nel momento necessario.
Una volta generato il componant Flightpath prende il sopravvento e inizia a dare istruzioni basate su di essa la propria stateTime e dal momento che ogni Flightpath ha un campo di riferimento al suo proprietario EnemyShip si può accedere alle funzioni della nave e dei membri è di controllo.
La classe EnemyShip ha alcune funzioni per istruzioni semplici come moveTo (float x, float y, float duration) e shoot() ma anche con queste le derivate FlightPath sono difficili da creare specialmente quando voglio nemici diversi stesso gruppo per avere percorsi leggermente diversi e arrivi di tempo leggermente diversi.
ho creato un paio di campi nel Flightpath per tenere traccia dei fotogrammi chiave:
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 è il mio tentativo di controllare il tempo tra il primo nemico in gruppo per iniziare a muoversi/le riprese e l'ultimo.
KeyFrame.totalFrameTime = KeyFrame.duration + KeyFrame.spreadTime
KeyFrame.enemyIntervalTime = KeyFrame.spreadTime/numero di nemici in questo gruppo
Mentre questa configurazione funziona alla grande per molto semplice movimento lineare, ci si sente abbastanza ingombrante.
Grazie per aver letto fino a qui. La mia domanda è come implementare un controllo di pattern più snello che consentirebbe movimenti complessi senza orde di istruzioni if () per verificare quali altri nemici nel gruppo stanno facendo e così via.
Spero di aver fornito informazioni sufficienti per capire come vengono gestiti i nemici. Fornirò qualsiasi codice sorgente a chiunque sia interessato. Grazie in anticipo per qualsiasi luce si può versare sull'argomento.
Marios Kalogerou
EDIT: ho trovato una pagina che descrive molto il tipo di sistema che sarebbe perfetto per quello che voglio, ma io sono sicuro come implementare correttamente per quanto riguarda il gruppo nel complesso i fotogrammi chiave
http://www.yaldex.com/games-programming/0672323699_ch12lev1sec3.html
Grazie per la tua risposta veloce. Immagino che FlightPath sia il nome sbagliato: D Mi piace quello che hai detto a proposito del fatto che FlightPaths è strettamente tracciato. Riceverò il sistema per questo, assegnando alla classe EnemyShip più funzionalità e dando anche il controllo di EnemyGroup sul comportamento generale del gruppo invece di creare e archiviare i nemici. Forse dividi l'intelligenza artificiale in modo che le navi controllino il proprio movimento basato sul flightPath, la velocità e il cue dati dall'EnemyGroup e l'EnemyGroup tiene traccia del gruppo nel suo insieme in modo che possa controllare quando dare alle navi un nuovo istruzioni. Grazie mille amico – MazK