Domanda

Ho sentito che coroutine sono un buon modo per strutturare i giochi (ad esempio, PEP 342 : "coroutine sono un modo naturale per esprimere molti algoritmi, come simulazioni, giochi ..."), ma sto avendo un momento difficile confezionamento mia testa intorno a come questo possa effettivamente essere fatto

.

vedo da questo articolo href="http://www.ibm.com/developerworks/library/l-pygen.html" che coroutine possono rappresentare gli stati in un macchina a stati che la transizione tra loro utilizzando un programmatore, ma non è chiaro per me come questo si applica ad un gioco in cui lo stato del gioco sta cambiando basa sulle mosse da più giocatori.

C'è qualche semplice esempio di un gioco scritto utilizzando coroutine disponibili? O qualcuno può offrire un abbozzo di come potrebbe essere fatto?

È stato utile?

Soluzione

Un modo coroutine possono essere utilizzati in giochi è fili peso come luce in un attore come modello, come in Kamaelia .

Ogni oggetto nel gioco sarebbe 'componente' un Kamaelia. Un componente è un oggetto che può sospendere l'esecuzione cedendo quando è ammissibile per mettere in pausa. Questi componenti hanno anche un sistema di messaggistica che permette loro di comunicare in modo sicuro l'uno all'altro in modo asincrono.

Tutti gli oggetti sarebbero contemporaneamente fare le loro cose, con i messaggi inviati tra di loro quando si verificano le interazioni.

Quindi, non è veramente specifico per i giochi, ma nulla quando si ha una moltitudine di comunicare componenti che agiscono in concomitanza potrebbero beneficiare di coroutine.

Altri suggerimenti

coroutine consentono la creazione di grandi quantità di "microfili" molto leggeri dell'aria con multitasking cooperativo (cioè microfili si sospende volontariamente per consentire altre microfili l'esecuzione). Leggi in di Dave Beazley su questo argomento.

Ora, è evidente come tali microspire possono essere utili per la programmazione del gioco. Si consideri un gioco di strategia in tempo reale, dove si hanno decine di unità - ciascuno con una mente propria. Può essere un'astrazione comoda per AI di ogni unità per l'esecuzione come un tale MicroThread nel proprio ambiente multitasking simulato. Questo è solo un esempio, sono sicuro che ci sono più.

Il "gioco coroutine programmazione" cercare Google sembra far apparire risultati interessanti.

Il caso più importante di coroutine sono probally vecchio punto grafico e fare clic su giochi di avventura, dove si erano utilizzate per scene di script e altre sequenze animate del gioco. Un esempio di codice semplice sarebbe simile a questa:

# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...

L'intera sequenza non può essere scritta come codice normale, come si vuole vedere bob fare la sua animazione passeggiata dopo che avete fatto bob.walkto(jane) invece di saltare a destra alla riga successiva. Per l'animazione passeggiata Per giocare è comunque necessario dare il controllo al motore di gioco ed è qui che entrano in gioco coroutine.

L'intera sequenza viene eseguito come coroutine, che significa si avrà la possibilità di sospendere e riprendere come volete. Un comando come bob.walkto(jane) racconta così il lato bob motore oggetto il suo obiettivo e poi sospende il coroutine, in attesa di un campanello d'allarme quando Bob ha raggiunto il suo obiettivo.

sulle cose laterali del motore potrebbe assomigliare a questo (pseudo codice):

class Script:
    def __init__(self, filename):
        self.coroutine  = Coroutine(filename)
        self.is_wokenup = True

    def wakeup(self):
        self.is_wokenup = False;

    def update():
        if self.is_wokenup:
          coroutine.run()            


class Character:
   def walkto(self, target, script):
       self.script = script
       self.target = target

   def update(self):
       if target:
           move_one_step_closer_to(self.target)
           if close_enough_to(self.target):
               self.script.wakeup()

               self.target = None
               self.script = None

objects = [Character("bob"), Character("jane")]
scripts = [Script("script_file.scr")]

while True:
    for obj in objects:
        obj.update()

    for scr in scripts:
        scr.update()

Una parola in piu 'di avvertimento però, mentre coroutine rendono la codifica queste sequenze molto semplice, non ogni implementazioni troverete di loro sarà costruita con la serializzazione in mente, quindi il risparmio gioco diventerà un bel problema fastidioso se si fanno largo uso di coroutine.

Questo esempio è anche solo il caso più semplice di un coroutine in un gioco, coroutine stessi possono essere utilizzati per un sacco di altre attività e algoritmi pure.

Due collegamenti che potreste trovare interessante:

http://aigamedev.com/open/articles/coroutine-state- macchina /

http://www.dabeaz.com/coroutines/ (cercare 'compito' in questa pagina e pdf)

E 'abbastanza comune a voler utilizzare coroutine per rappresentare i singoli attori script AI. Purtroppo le persone tendono a dimenticare che coroutine avere tutti gli stessi problemi di sincronizzazione e di esclusione reciproca che hanno filettature, solo a un livello superiore. Così spesso è necessario fare in primo luogo per quanto è possibile per eliminare stato locale, e in secondo luogo scrivere modi robusto per gestire gli errori in un coroutine che sorgono quando qualcosa si stia riferendo alla cessa di esistere.

Quindi, in pratica, sono molto difficili da ottenere un beneficio da, che è il motivo per cui linguaggi come UnrealScript che utilizzano una qualche parvenza di coroutine spingono gran parte della logica di utile per gli eventi atomici. Alcune persone ottenere buon programma di utilità da loro, per esempio. la gente EVE Online, ma hanno dovuto praticamente architetto loro intero sistema attorno al concetto. (E come gestire contesa sulle risorse condivise non è ben documentato.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top