Gioco di strategia, come faccio a calcolare le azioni parallele?

3

Sto costruendo un gioco di strategia in cui più unità (5 - 20) si combattono tra loro.

Ho una logica di gioco che calcola tutte le azioni eseguite su ogni turno e la mando al motore di gioco per animare.

Queste sono le azioni possibili:

  • esegui un attacco
  • esegui i danni provocati
  • esegui lo spostamento
  • mostra la mancanza
  • esegui la rimozione di te stesso (morire)

Come posso trovare quali azioni posso eseguire in parallelo e quali no?

Queste sono le limitazioni che ho:

  • le unità possono eseguire solo un'azione alla volta.
  • ogni azione può avere tempi diversi, anche se è la stessa azione
  • L'unità può eseguire l'azione attack , solo se l'altra unità esegue l'azione taking damage o removing your self
  • dopo che l'unità ha eseguito l'azione: removing your self , non può eseguire altre azioni.

Modifica Queste sono le situazioni che potrebbero accadere:

  • una unità viene attaccata da più unità contemporaneamente
  • una unità subisce danno mentre nessuna unità lo sta attaccando
  • tutte le unità si muovono contemporaneamente
  • tutte le unità eseguono miss allo stesso tempo

Questa domanda non riguarda il game design, ma una soluzione programmatica su come posso trovare le piastrelle parallele di azioni?

Rispondi a FrustratedWithFormsDesign , answer

Ciao amico, l'hai portato in una direzione completamente diversa, quindi voglio risponderti qui per chiarire le cose.

Questa domanda non riguarda come far muovere le unità in parallelo. Inoltre, non penso che il tuo suggerimento sia una buona idea.

Quello che hai fatto con il tuo gioco è in realtà, la giusta direzione. Sarà anche saggio lavorare su MVC e separare la vista e le logiche di gioco.

Quindi per implementare un motore di gioco userei un thread di gioco che invierà gli eventi tick, in base alla frequenza dei fotogrammi scelta. Solo le viste dovrebbero essere in ascolto per quel thread e implementare la logica di visualizzazione basata su di esso.

Nel mio gioco sto usando il framework Adobe Air con alcuni supporti Java e Objective-C nativi per i cellulari, ma è Air principalmente. Quindi tutte le mie animazioni stanno ascoltando onEnterFrameEvent, questo dovrebbe essere spuntato nel tuo esempio e implementare la loro logica di animazione.

La mia logica di gioco sta usando un lavoratore diverso (le implementazioni dei thread di Air, è più come un processo) per generare tutte le azioni in particolari turni. E poi lo sbiadisce al motore di gioco per animare. Non ti chiedo come implementare le animazioni, è gestito da Air apis e non viene calcolato qui.

Pensa a questi problemi:

unit a attacks unit b while unit b attacks unit c, while unit c is moving.

Questo si risolverà con un pasticcio sullo schermo.
Voglio che sia:

unit a attack unit b, unit b waits for a to finish attacking him to start attacking unit c, while unit c is moving. After a finish attacking unit b, unit b attacks unit c.

Quindi l'input delle azioni che ho ricevuto è stato:

  • Un attacco
  • B prendi danno
  • Attacco B
  • C prendi danno
  • C sposta

E l'output era di due serie di animazioni

  • Un attacco, C sposta, B subisce danno
  • B attacco, C subisce danni

Questo è stato un esempio molto semplice di come vorrei parallelizzare le mie azioni. Spero che ora sia più chiaro.

    
posta Ilya Gazman 14.07.2014 - 13:47
fonte

2 risposte

2

Se stai parlando di avere un thread per ogni personaggio del gioco, avrai alcuni problemi di sincronizzazione. E potresti iniziare a correre problemi di prestazioni se hai molti personaggi di gioco, ognuno dei quali richiede il proprio thread.

Se vuoi davvero fare cose in parallelo, potresti provare a eseguire più thread tutti con lo stesso compito. Ad esempio:

  1. crea discussioni per tutti i personaggi del gioco (o fino a un limite di n discussioni) e sposta i personaggi di un incremento (la distanza che un personaggio potrebbe muovere in un'unità di tempo di gioco).
  2. attendi che tutti i thread siano completati.
  3. crea discussioni per tutti i personaggi del gioco ed esegui attacchi.
  4. attendi che tutti i thread siano completati.
  5. crea discussioni per tutti i personaggi del gioco e calcola i danni e rimuovi i personaggi se sono morti.
  6. attendi che tutti i thread siano completati.
  7. torna all'inizio.

Potresti anche provare a usare un thread per tipo di attività di gioco (spostare personaggi, attaccare, calcolare i danni, ecc ...). Avresti meno thread da gestire, ma penso che il coordinamento e la sincronizzazione tra di loro sarebbe più difficile, perché avresti eseguito i thread "move character" e "attack" in parallelo.

Queste sono solo idee, però, non ho mai provato a costruire un gioco in questo modo, ma potrebbe esserti d'aiuto.

Nella mia esperienza con il codice di gioco (è vero, è stato qualche anno fa, e su giochi più semplici di quello su cui potresti lavorare), di solito facevamo tutto nel contesto di un singolo ciclo di eventi. Il ciclo era solitamente guidato da una sorta di timer, e con ogni ticchettio del timer, tutte le azioni sarebbero state elaborate. Quindi, se ci fossero 3 personaggi del gioco che si attaccano a vicenda sullo schermo, un singolo tick del timer avrebbe:

  • elabora qualsiasi input dell'utente dal mouse o dalla tastiera
  • sposta tutte le unità dell'immagine sullo schermo di una certa quantità, se erano in movimento.
  • sposta proiettili e altri oggetti mobili.
  • controlla se sono stati colpiti da altri proiettili e se hanno subito danni e, in tal caso, quanto.
  • calcola i punti guadagnati dal giocatore.
  • se il tempo è importante, controlla quanto tempo è trascorso dall'ultimo contrassegno ed esegui un'azione (ad esempio terminare il gioco se il giocatore impiega troppo tempo).
  • ... qualsiasi altro calcolo necessario.

In questo modo, c'era un processo principale che si occupava di tutto. Suppongo che avremmo potuto usare più thread se avessimo avuto dei calcoli complicati, ma sarebbero comunque stati eseguiti dal ciclo principale e il ciclo principale avrebbe dovuto aspettare fino a quando non avessero completato tutto.

    
risposta data 14.07.2014 - 17:39
fonte
2

Ci sono ancora alcune domande aperte sul tuo gioco e sulla tua domanda. Quindi, inserisco qui delle piccole risposte a domande che già derivano da ciò che hai dato come informazione:

Ottieni le animazioni per le tue azioni nel giusto orario:

Scrivi uno schedulatore che avvia le animazioni con un dato tempo di avvio in modo che le azioni avranno un aspetto liscio. Ad esempio "attack" ha un avvio di 2 secondi e performance-time 1 secondo e "block" ha start-up 1 secondo e prestazioni 1 secondo. Quindi "attacco" dovrebbe iniziare 1 secondo prima che "blocco" possa iniziare.

Poiché non ci sono informazioni fornite sul linguaggio di programmazione o sul paradigma, solo viene lasciata un'ipotesi: indagare su Modello di comando e Catena di comando per questo

Trova le azioni possibili per le tue unità in parallelo:

C'è un piccolo modello di ambiente necessario per vedere quali altre unità sono "raggiungibili" Pensa che qualche sistema di coordinate, a seconda del tuo gioco, farà il lavoro. Forse puoi fornire ulteriori informazioni al riguardo.

Visualizza i risultati delle azioni delle tue unità in parallelo:

Ancora una volta, scriverò uno scheduler per risolvere anche questo. Quello che ho visto in un gioco era un piccolo tavolo che utilizzava timestamp (ad esempio ora con secondo, data e così via). Questa tabella viene letta da un eventhandler, che prende ogni secondo da quel tavolo, e gestisce i risultati. È solo una sorta di ciclo di messaggi, ma penso che l'idea dietro questo è molto chiaro.

    
risposta data 14.07.2014 - 20:39
fonte

Leggi altre domande sui tag