programmazione di eventi di storie di giochi


28

Ho sviluppato un motore di gioco in c / c ++ e DirectX.

Ho un motore a tessere per le mappe, animate player / npc sprites, parlando con npc, menu e cambio di livello ma non c'è gioco, sembra vuoto.

Mi sono guardato intorno e continuo a sentire le parole d'ordine, ma voglio sapere come implementare una storia nel mio gioco.

Alcune persone hanno detto che un file di salvataggio contiene bandiere che governano ogni possibile azione / stato disponibile nel gioco, ma questo sembra ridicolo.

È un po 'ambizioso, ma sto cercando di ottenere un gioco come i vecchi giochi Pokemon / Final Fantasy.

Qualcuno sa come funzionano questi giochi o la teoria utilizzata?

Ho cercato per un po 'di tempo e apprezzerei davvero qualsiasi input le persone abbiano.

Risposte:


19

La storia del tuo gioco dovrebbe probabilmente avere la forma di un automa a stati finiti (o una specie di FSA estesa). Quando si verificano determinati eventi, è necessario passare a un nuovo stato. In questo modo devi sempre e solo archiviare lo stato corrente e qualsiasi informazione sia necessaria per sapere dove spostarti nella FSA (insieme ai dettagli del giocatore come posizione, salute, ecc.).

Ad esempio, se semplifichiamo in modo eccessivo i giochi Pokemon, i badge della palestra formano il ramo principale dell'FSA. Inizi nello stato 0 dove non hai badge e mentre batti i capi palestra ti muovi attraverso gli stati, allo stato 1, allo stato 2, ecc. Per far aggiornare le entità di gioco allo stato corrente, devi solo ottenere loro per guardare lo stato attuale. Ad esempio, un NPC al di fuori della terza palestra controlla lo stato in cui ti trovi, vedi che sei nello stato corrispondente ad avere 3 badge e risponde di conseguenza (forse con un "Ben fatto!").

Non è necessario memorizzare lo stato di tutto nel mondo; solo lo stato della storia. Le entità stesse sanno come reagire in base allo stato attuale.


approccio interessante e mi piace che debba provarlo, ma come seguiresti le missioni secondarie che non dipendono dalla progressione della storia?

Dipende molto dalla complessità della tua storia. Potrebbe essere più semplice avere più FSA (uno per ogni sottostoria) o potresti aver bisogno di ramificazioni complesse. Devi sederti e disegnare la tua storia come una tabella di marcia. Quando capisci come tutto si intreccia, pensa a come memorizzare lo stato corrente (o indica se può trovarsi in più di uno alla volta). Alcune cose dovranno essere memorizzate separatamente, come le posizioni degli NPC (se ne hai bisogno per essere salvate) e la salute di alcuni personaggi, perché non dipendono dalla trama.

questo FSA di cui parli, dove troverei una spiegazione di questo, preferibilmente semplificato e senza altre teorie intrecciate.
Skeith

Puoi imparare tutto sulle macchine statali dappertutto, ma il 99,9% delle volte non parlerà di giochi. Un libro introduttivo sul calcolo ti insegnerà a riguardo, ma in realtà non hai bisogno di così tanti dettagli. Devi solo capire il concetto di essere negli stati e di muoverti tra loro quando accadono determinati eventi. La risposta di @ pwny sta davvero dicendo la stessa cosa in un modo diverso. Leggere degli FSA sarà comunque un ottimo modo per apprendere i concetti di macchine statali. Solo Google per un'introduzione alle macchine statali!
Joseph Mansfield,

7

Potresti usare una serie di possibili stati in cui si trova il tuo gioco. I tuoi NPC e il tuo mondo sarebbero consapevoli di quegli stati e reagirebbero / mostreranno di conseguenza. Potresti anche voler definire un insieme di trigger che verrebbero attivati ​​da alcune azioni / eventi.

Ad esempio, battere un certo avversario attiverebbe il grilletto A, che aggiungerebbe lo stato S al tuo mondo e nello stato S il tuo personaggio verrà fulminato quando esce dalla tana dei suoi avversari. O fuori piove. O trovi una caramella rara. Ottieni il punto.

Con queste due semplici aggiunte al tuo gioco, potresti renderlo molto più "vivo".

Assicurati di creare anche uno sfondo ricco per il tuo mondo, i personaggi e la trama e assicurati che il gioco sia coerente con quello sfondo. Pianifica prima la tua storia.

Prova anche Gamedev


ciò è possibile, ma sono sicuro che i professionisti abbiano un risultato migliore, poiché ciò che sujest comporta centinaia di migliaia di booleani e ints (l'ho provato). semplicemente non lo vedo come un approccio realistico a un gioco su larga scala. grazie per il link

Non necessariamente, immagina 5 stati sovrapponibili indipendenti. Ottieni 32 possibili rami per 5 booleani. Penso che sia ragionevole. Inoltre, i sistemi di trigger sono utilizzati in molti giochi professionali, soprattutto perché è quindi possibile creare script con il comportamento utilizzando una serie di trigger.
pwny

2

Come menzionato sftrabbit, questa è un'applicazione perfetta per una macchina a stati.

In sostanza, hai una sorta di struttura ad albero. Ogni foglia / nodo contiene informazioni sullo stato corrente e regole per passare allo stato successivo. Ogni nodo può contenere più uscite, a seconda della complessità del flusso di trama / riproduzione.

Un buon analogo molto sciolto a questo è un libro Scegli la tua avventura . Ogni pagina contiene del testo che descrive parte della storia e le decisioni che il giocatore può prendere. Ogni decisione porta ad un'altra pagina. Alcune pagine possono essere collegate a pagine precedentemente visitate, ecc.

I vecchi giochi di avventura basati su testo come Zork e Leather Goddesses of Phobos e i famigerati giochi Sierra * Quest ( SpaceQuest con Roger Wilco, il bidello spaziale è uno dei miei preferiti ) utilizzavano una versione molto semplice di questo tipo di sistema. Ogni stanza in una mappa era uno stato, con uscite collegate ad altri stati o stanze. L'acquisizione di un elemento imposta un flag in un oggetto stato globale. Ogni stanza controllava quelle bandiere per determinare quali personaggi o oggetti erano disponibili in ogni stanza.

Pertanto, i tuoi stati possono essere implementati come una classe o struttura, ciascuno con proprietà per:

Elenco risorse: elenco di puntatori alla grafica di sfondo e tutto ciò che è necessario per visualizzare la stanza / lo stato / il livello.

Condizioni di partecipazione: risultati che devono essere già stati raggiunti per accedere a un livello

Esci: collega a ogni possibile uscita "successiva". Nord, Sud, Est e Ovest sono alcuni esempi di questo, ma puoi anche includere Porta1, Teletrasporto, ecc. Quando si tenta di uscire da una stanza o la determinazione di un'uscita / porta è "aperta", il gioco potrebbe controllare lo stato successivo per vedere se le sue condizioni di ingresso sono state soddisfatte e modificare il modo in cui l'uscita viene visualizzata sullo schermo, o semplicemente non consentire al giocatore di muoversi in quella direzione.

Se vuoi essere sofisticato, potresti includere una versione diversa di uno stato con condizioni di ingresso diverse, che altererebbe il modo in cui la stanza viene presentata al giocatore o le azioni disponibili in quella stanza.

La schermata iniziale, la morte / il gioco sullo schermo, ecc. Potrebbero essere tutti stati all'interno del sistema, in modo simile al modo in cui è possibile navigare tra le schermate dei menu. In effetti, se si dispone di un tale sistema di menu, è possibile utilizzarlo per questo. Invece di frecce su / giù e "invio" per navigare in un menu, dovresti cercare eventi specifici all'interno dell'area di gioco, come salire su un pad di teletrasporto, uscire dal lato destro dello schermo, ecc.

Dal punto di vista dell'amministratore, considerare se è possibile trarre vantaggio dalla creazione di uno strumento di amministrazione che consenta di creare la macchina a stati. Aggiungi stanze a una mappa, crea collegamenti tra loro, assegna risorse come immagini di sfondo, ecc. Questo è probabilmente eccessivo per il tuo primo tentativo; è troppo facile essere assorbiti nella costruzione di strumenti di amministrazione e non finire mai il gioco. Ricorda: non stai scrivendo middleware, ma un gioco.

Spero che sia di aiuto.


per questo esempio imagne una città. ho un file che contiene il layout delle piastrelle, nonché la grafica e le dimensioni, elenchi di npc e cose generali del genere. con l'aggiunta di un file è stata aggiunta una nuova cam di città al gioco permettendo ad altri di contribuire o così era il piano ma il file sta diventando un po 'pieno e complesso. se ti capissi, metterei gli eventi che possono aver luogo in quella città in questo file con le bandiere per tenere traccia dei progressi?
Skeith

@Skeith sì, sembra un approccio ragionevole.
3Dave

0

Usavo questo motore di gioco chiamato VERGE . Gioca con quello e vedi come gestisce gli eventi, mi piace davvero. È anche open source, quindi puoi vedere come lo implementano, qui . Ecco una breve descrizione

Ogni mappa ha una varietà di livelli. I livelli grafici, di cui possono essercene diversi. Lo strato di ostruzione. E poi c'è il livello di zona. Il livello di zona è ciò che è importante qui. *

Ogni tessera ha un numero per indicare la zona di cui fa parte. Ogni zona può essere attivata in due modi base. O la zona viene attivata quando il giocatore entra in essa, oppure ha quella che viene chiamata attivazione adiacente. L'attivazione adiacente significa che quando il giocatore è in piedi adiacente a una delle tessere della zona e preme un tasto specificato come chiave di attivazione, la zona viene attivata.

Cosa succede quando una zona è attivata è che chiama una funzione da uno script. Quindi è necessario incorporare un qualche tipo di linguaggio di scripting. VERGE ha una sua lingua chiamata VergeC e consente anche lua. Io stesso preferisco usare Python.

Una volta superato questo ostacolo, ora hai un enorme potere nel tuo scripting di eventi. Hai un linguaggio di programmazione completo in cui puoi archiviare e agire su dati come le statistiche dei giocatori, i flag delle storie, ecc ...

* C'è anche un livello Entity. Le entità si comportano come zone attivate mobili adiacenti.


sembra il tipo di sistema utilizzato nella serie di giochi rpg. ma cosa succede se quella tessera ha 5 eventi diversi in base a quanto lontano sei nella storia?
Skeith

@Skeith Non può. A ogni tessera è associata solo una zona. E ogni zona ha solo una funzione di script che chiama. Questo non è un problema però. Ricorda, qui hai un linguaggio di programmazione completo. Le informazioni su quanto lontano nella storia sei memorizzato in una variabile (o più). Quindi decidere cosa fare è una semplice questione di testare quella variabile nello script e intraprendere l'azione appropriata in base al suo valore.
Benjamin Lindley,

@Skeith: anche se potresti aggiungere l'opzione di cambiare la zona a cui appartiene una tessera.
Benjamin Lindley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.