corse di auto: confrontiamoci sulla AI del computer
-
- Membro super
- Messaggi: 801
- Iscritto il: 12/02/2004, 10:05
- Uso: GM:Studio 2
- Località: Roma
- Contatta:
corse di auto: confrontiamoci sulla AI del computer
Ieri rispondendo in altro post a Lapo ho immaginato, come progetto sul quale fare esperienza, un giochino di corse di auto (ma con idee diverse che qui non elenco) con la possibilità di giocare sia contro il computer sia contro altro giocatore (uso della stessa tastiera).
Così, ieri ho iniziato a ragionare su uno degli aspetti più importanti (a dire il vero, sicuramente il più importante perché necessario): l'AI del computer in gara.
L'AI dovrebbe gestire:
1) la direzione dell'auto in relazione al percorso ed alla traiettoria più breve
2) la direzione dell'auto in relazione alla presenza di ostacoli sul percorso
3) la direzione dell'auto per riprendere la marcia dopo un urto
4) la direzione dell'auto per ostacolare il passaggio degli avversari
Sono sicuro che molti di voi abbiano già affrontato l'argomento e non so se lo abbiano compiutamente ed efficacemente "risolto". Mi piacerebbe confrontarmi con le vostre idee e con i vostri metodi e quindi di seguito indico le mie, esposte a grandi linee.
A) Il gioco sfrutterebbe comunque un percorso delimitato e chiuso da oggetti utili al rilevamento delle collisioni;
B) l'AI di cui al punto 1) verrebbe gestita utilizzando, per ciascuna auto in gara manovrata dal computer, un oggetto che esegue una path di forma del percorso. Questo oggetto viene preso come punto di destinazione dell'auto (ed è quindi da questa seguito) e nell'eseguire la path verifica di non lasciare indietro la sua auto, in modo da garantire che l'auto possa seguirlo manovrando in conformità della struttura del percorso
C) l'AI di cui al punto 2 verrebbe gestita con un controllo sull'auto, che utilizza due collision_line che partono dagli spigoli anteriori dell'auto e si proiettano in avanti per una lunghezza (proporzionale alla velocità dell'auto?) e nella sua stessa direzione. Con i collision_line verifichiamo se davanti all'auto vi sono ostacoli di vario genere. Lo script verifica costantemente le collisioni sulle due linee. Se vi è collisione solo su una delle due linee vuol dire che la direzione opposta è libera e l'auto scarterà di alcuni gradi in quella direzione. Se entrambi rilevano la collisione le due linee non vengono più proiettate lungo la direzione dell'auto ma leggermente più aperte di 5 gradi (in pratica, inizia a crearsi un cono davanti all'auto) e l'operazione di verifica collisione viene ripetuta. Di nuovo, se solo una delle linee rileva la collisione allora l'auto scarterà nella direzione opposta mentre se entrambe sono ancora in collisione le linee (il cono) si apriranno di altri 5 gradi. E così via; la verifica viene ripetuta ad ogni step e quindi lo scarto di 5 gradi è progressivo.
Andranno comunque gestite le operazioni di cui al punto 1 e punto 2 affinché non si ostacolino e affinché l'auto, dopo aver evitato l'ostacolo, riprenda la corretta direzione nel percorso orientandosi verso l'oggetto che segue la path
D) l'AI di cui al punto 3 dovrebbe essere facile da gestire, perché basterà orientare l'auto verso l'oggetto che esegue la path, e che la sta aspettando
E) l'AI di cui al punto 4 è tutta da immaginare, e credo che qui le soluzioni possono essere tante in relazione al tipo di gioco che si vuole realizzare (in un vero gioco di competizione un'auto da corsa non si mette ad ostacolare le altre.
Aspetto di conoscere le vostre soluzioni.
Ciao
Così, ieri ho iniziato a ragionare su uno degli aspetti più importanti (a dire il vero, sicuramente il più importante perché necessario): l'AI del computer in gara.
L'AI dovrebbe gestire:
1) la direzione dell'auto in relazione al percorso ed alla traiettoria più breve
2) la direzione dell'auto in relazione alla presenza di ostacoli sul percorso
3) la direzione dell'auto per riprendere la marcia dopo un urto
4) la direzione dell'auto per ostacolare il passaggio degli avversari
Sono sicuro che molti di voi abbiano già affrontato l'argomento e non so se lo abbiano compiutamente ed efficacemente "risolto". Mi piacerebbe confrontarmi con le vostre idee e con i vostri metodi e quindi di seguito indico le mie, esposte a grandi linee.
A) Il gioco sfrutterebbe comunque un percorso delimitato e chiuso da oggetti utili al rilevamento delle collisioni;
B) l'AI di cui al punto 1) verrebbe gestita utilizzando, per ciascuna auto in gara manovrata dal computer, un oggetto che esegue una path di forma del percorso. Questo oggetto viene preso come punto di destinazione dell'auto (ed è quindi da questa seguito) e nell'eseguire la path verifica di non lasciare indietro la sua auto, in modo da garantire che l'auto possa seguirlo manovrando in conformità della struttura del percorso
C) l'AI di cui al punto 2 verrebbe gestita con un controllo sull'auto, che utilizza due collision_line che partono dagli spigoli anteriori dell'auto e si proiettano in avanti per una lunghezza (proporzionale alla velocità dell'auto?) e nella sua stessa direzione. Con i collision_line verifichiamo se davanti all'auto vi sono ostacoli di vario genere. Lo script verifica costantemente le collisioni sulle due linee. Se vi è collisione solo su una delle due linee vuol dire che la direzione opposta è libera e l'auto scarterà di alcuni gradi in quella direzione. Se entrambi rilevano la collisione le due linee non vengono più proiettate lungo la direzione dell'auto ma leggermente più aperte di 5 gradi (in pratica, inizia a crearsi un cono davanti all'auto) e l'operazione di verifica collisione viene ripetuta. Di nuovo, se solo una delle linee rileva la collisione allora l'auto scarterà nella direzione opposta mentre se entrambe sono ancora in collisione le linee (il cono) si apriranno di altri 5 gradi. E così via; la verifica viene ripetuta ad ogni step e quindi lo scarto di 5 gradi è progressivo.
Andranno comunque gestite le operazioni di cui al punto 1 e punto 2 affinché non si ostacolino e affinché l'auto, dopo aver evitato l'ostacolo, riprenda la corretta direzione nel percorso orientandosi verso l'oggetto che segue la path
D) l'AI di cui al punto 3 dovrebbe essere facile da gestire, perché basterà orientare l'auto verso l'oggetto che esegue la path, e che la sta aspettando
E) l'AI di cui al punto 4 è tutta da immaginare, e credo che qui le soluzioni possono essere tante in relazione al tipo di gioco che si vuole realizzare (in un vero gioco di competizione un'auto da corsa non si mette ad ostacolare le altre.
Aspetto di conoscere le vostre soluzioni.
Ciao
TellyAbba
tellyabba at yahoo.it
tellyabba at yahoo.it
- Scario
- Moderatore
- Messaggi: 2707
- Iscritto il: 26/05/2003, 20:29
- Specialità: Tergiversare
- Uso: GM:Studio 2
- Contatta:
Purtroppo questo è un aspetto del gameplay di vari giochi che mi ha sempre appassionato di più, ma purtroppo in materia sono ancora un principiante.
Ti suggerisco comunque una soluzione spartana, che avevo utilizzato per un gioco che avrebbe dovuto partecipare a una competizione di qualche tempo fa. Innanzitutto avevo seguito il tutorial di pedra per una semplice IA per un gioco di corse, ossia far puntare tanti vari "checkpoint" alle varie auto, così da non essere legati a un vincolo come una path. Per rendere un'auto più "intelligente" dell'altra, semplicemente avevo creato due tipi di puntatori per le auto: uno per i rettilinei, l'altro per le curve: se la distanza tra un puntatore curva e l'altro era abbastanza grande, l'auto seguiva i puntatori per il rettilineo a velocità sostenuta, altrimenti avrebbe rallentato in prossimità della curva stessa, per poi curvare in prossimità del segnalatore, facendo quindi in modo che tagliasse la curva ( chi più chi meno, in base all'abilità dell'auto ). Come metodo funzionava abbastanza bene, però non riuscii a implementare le collisioni tra una vettura e l'altra rendendo così la vita troppo facile al giocatore, per cui abbandonai il tutto.
So benissimo che era un metodo abbastanza stupido di procedere, ma ai tempi non avevo idee migliori e ho cercato di rimboccarmi lo stesso le maniche e inventarmi qualcosa.
Ti suggerisco comunque una soluzione spartana, che avevo utilizzato per un gioco che avrebbe dovuto partecipare a una competizione di qualche tempo fa. Innanzitutto avevo seguito il tutorial di pedra per una semplice IA per un gioco di corse, ossia far puntare tanti vari "checkpoint" alle varie auto, così da non essere legati a un vincolo come una path. Per rendere un'auto più "intelligente" dell'altra, semplicemente avevo creato due tipi di puntatori per le auto: uno per i rettilinei, l'altro per le curve: se la distanza tra un puntatore curva e l'altro era abbastanza grande, l'auto seguiva i puntatori per il rettilineo a velocità sostenuta, altrimenti avrebbe rallentato in prossimità della curva stessa, per poi curvare in prossimità del segnalatore, facendo quindi in modo che tagliasse la curva ( chi più chi meno, in base all'abilità dell'auto ). Come metodo funzionava abbastanza bene, però non riuscii a implementare le collisioni tra una vettura e l'altra rendendo così la vita troppo facile al giocatore, per cui abbandonai il tutto.
So benissimo che era un metodo abbastanza stupido di procedere, ma ai tempi non avevo idee migliori e ho cercato di rimboccarmi lo stesso le maniche e inventarmi qualcosa.
- BillyMetAl
- Membro super
- Messaggi: 721
- Iscritto il: 05/01/2008, 18:13
- Specialità: Musicista
- Località: Catania
- Contatta:
io avevo pensato di fare una AI per un remix del gioco di Street Race (per chi lo ricordi era l'esempio nel gm 6.0)
Si chiamava Street Race: Callaghan's Revenge e il giocatore impersonava la polizia, che doveva andare a inseguire la macchina rossa.
Ma la mia AI non funzionò e la macchina rossa andava fuori dalla view, e allora il progetto venne abbandonato.
Si chiamava Street Race: Callaghan's Revenge e il giocatore impersonava la polizia, che doveva andare a inseguire la macchina rossa.
Ma la mia AI non funzionò e la macchina rossa andava fuori dalla view, e allora il progetto venne abbandonato.
-
- Membro super
- Messaggi: 801
- Iscritto il: 12/02/2004, 10:05
- Uso: GM:Studio 2
- Località: Roma
- Contatta:
Nient'affatto, non credo fosse un sistema stupido ma una delle strade possibili. Sarei curioso di vederlo quel gioco, anche per capire, dal punto di vista dell'estetica del movimento delle auto, come risultava.So benissimo che era un metodo abbastanza stupido di procedere
A mio avviso il sistema dei check point è più macchinoso del sistema della path (qui http://mio.discoremoto.alice.it/regressive , cartella Demo GM editabili, trovate già una prova che ho realizzato poco fa) ma forse ha il vantaggio di poter variare la velocità della vettura, mentre con la path ed il sistema indicato al post precedente devo ancora capire come ottenere (devo variare la speed dell'oggetto che segue la path)
Per BillyMetal: non hai più nulla di quel progetto?
TellyAbba
tellyabba at yahoo.it
tellyabba at yahoo.it
- Scario
- Moderatore
- Messaggi: 2707
- Iscritto il: 26/05/2003, 20:29
- Specialità: Tergiversare
- Uso: GM:Studio 2
- Contatta:
Do' un'occhiata al mio disco esterno e vedo se ho ancora qualche reperto di quel progetto, nel frattempo guardo il tuo esempio. Comunque l'utilizzo delle path mi da' l'impressione di avere percorsi troppo precalcolati e prevedibili, mentre invece quello dei check point aveva un po' più libertà, risultando però purtroppo più macchinoso.TellyAbba ha scritto: Nient'affatto, non credo fosse un sistema stupido ma una delle strade possibili. Sarei curioso di vederlo quel gioco, anche per capire, dal punto di vista dell'estetica del movimento delle auto, come risultava.
EDIT: Ho guardato il tuo esempio. Io ho cercato in tutti i modi di creare più path che l'auto potrebbe scegliere di utilizzare, perchè il tempo stringeva e non potevo mettermi a disegnare troppi percorsi da seguire. Per la rotazione dello sprite dell'auto abbiamo usato invece codici simili da quel che ricordo, solo che usavo ancora GM 5.0 e image_angle non esisteva ancora.
- BillyMetAl
- Membro super
- Messaggi: 721
- Iscritto il: 05/01/2008, 18:13
- Specialità: Musicista
- Località: Catania
- Contatta:
Purtroppo no, ma ho usato un pezzo di codice per creare una AI da platform.TellyAbba ha scritto: Per BillyMetal: non hai più nulla di quel progetto?
Purtroppo non la hosterò in quanto ha richiesto settimane di lavoro e ha delle molte variabili di controllo che impediscono di far capire a chi non l'abbia creata come funzioni.
- dave_djtam
- GMI Advanced
- Messaggi: 1604
- Iscritto il: 02/07/2007, 21:32
- Contatta:
io come scario, ho utilizzato un sistema di "checkpoint"...semplice e facile da usare.....difatti non mi è ben chiaro il tuo sistema di path.......cioè cè un obj invisibile che segue la path,e l'auto segue l'obj giusto???? e poi fai fermare l'obj invisibile se la distanza dall'auto è troppa????
se ho capito giusto, è meglio del mio sistema checkpoint, perchè a pensarla cosi su due piedi mi sembra molto + preciso essendo un check in movimento,e non statico; non ci avrei mai pensato........molto probabilmente ti freghero' l'idea
io ero(sono) bloccato ad un altro punto cruciale del gameplay........far sgommare in modo decente l'auto.....dopo mille e mille tentativi forse ho trovato un metodo(a mente) ma devo ancora testarlo....caro telly hai idee al riguardo oppure ti basta premere left/right e far girare l'auto di conseguenza???
se ho capito giusto, è meglio del mio sistema checkpoint, perchè a pensarla cosi su due piedi mi sembra molto + preciso essendo un check in movimento,e non statico; non ci avrei mai pensato........molto probabilmente ti freghero' l'idea
io ero(sono) bloccato ad un altro punto cruciale del gameplay........far sgommare in modo decente l'auto.....dopo mille e mille tentativi forse ho trovato un metodo(a mente) ma devo ancora testarlo....caro telly hai idee al riguardo oppure ti basta premere left/right e far girare l'auto di conseguenza???
-
- Membro super
- Messaggi: 729
- Iscritto il: 07/01/2008, 15:48
- Uso: GM:Studio 2
- Località: Casalecchio di Reno (BO)
- Contatta:
- civic71
- GMI Advanced
- Messaggi: 2210
- Iscritto il: 23/10/2003, 17:31
- Specialità: Risotto con zucchine
- Uso: GM:Studio 1.4 Pro
- Località: Jesolo (venezia)
- Contatta:
Nel mio vecchio CIVIC Racing ho utilizzato delle path (diverse per ogni auto e per ogni gara) alle quali avevo aggiunto un object traguardo che con lo sprite copriva la pista . Quando le auto collidevano con questo alcune variabili cambiavano.
Mentre la velocità delle auto variava con un semplice alarm : minima_speed+random(n° ) ;
Il risultato era che si le auto avevano delle traiettori predefinite ma il variare della loro velocità ne determinava l' ostruzione verso l'auto del giocatore.
Mentre la velocità delle auto variava con un semplice alarm : minima_speed+random(n° ) ;
Il risultato era che si le auto avevano delle traiettori predefinite ma il variare della loro velocità ne determinava l' ostruzione verso l'auto del giocatore.
Telly, internet è vasto, troverai un sacco di tutorial fatti bene che descrivono perfettamente come fare un AI seria (che non si basi su delle path predefinite... ).
Gamedev.net è un punto di partenza, ma basta anche Google...
Sopratutto lo usate per cose in cui la sfortuna non c'entra niente, d'altronde, quando mai c'entra?
Del tipo "io non lo posto, purtroppo", ma purtroppo cosa? Purtroppo dove???
Gamedev.net è un punto di partenza, ma basta anche Google...
Usate "purtroppo" in modo strano voialtri (Scario... ).BillyMetAl ha scritto:Purtroppo no, ma ho usato un pezzo di codice per creare una AI da platform.TellyAbba ha scritto: Per BillyMetal: non hai più nulla di quel progetto?
Purtroppo non la hosterò in quanto ha richiesto settimane di lavoro e ha delle molte variabili di controllo che impediscono di far capire a chi non l'abbia creata come funzioni.
Sopratutto lo usate per cose in cui la sfortuna non c'entra niente, d'altronde, quando mai c'entra?
Del tipo "io non lo posto, purtroppo", ma purtroppo cosa? Purtroppo dove???
-
- Membro super
- Messaggi: 801
- Iscritto il: 12/02/2004, 10:05
- Uso: GM:Studio 2
- Località: Roma
- Contatta:
Bello, vedo che la discussione si anima di contributi interessanti e quindi ringrazio tutti per gli spunti e le idee sicuramente istruttive.
Non so bene se andrò avanti con l'idea, perché personalmente le corse di auto non mi entusiasmano particolarmente e perché non vorrei distogliere tempo ad altri progetti.
Probabilmente realizzerò una prova molto rozza per vedere quale soluzione può risultare migliore.
Sabato ho fatto alcune prove modificando la speed della path seguita dall'oggetto invisibile che viene preso a riferimento dall'auto. Se si modifica la speed fra un intervallo (punto) della path e l'altro, è possibile dare maggior realismo al movimento dell'auto, soprattutto nelle curve, dove il rallentamento si impone, e nei rettilinei, l'accelerazione.
Stavo anche pensando di utilizzare un sistema misto waypoint e path, per aggiungere realismo.
Come qualcuno di voi ha evidenziato, il problema della sbandata resta, per il momento, uno dei più difficili da risolvere, soprattutto perché nell'idea che vi ho esposto se l'auto segue la direzione dell'oggetto che esegue la path allora è difficile fargli cambiare angolo o traiettoria, essendo vincolata dal codice nello script.
Così, sto provando ad utilizzare la frizione (friction) ma è difficile bilanciarla bene (al momento sono solo riuscito ad ottenere che in curva l'auto sbanda troppo e se il percorso è stretto collide con il bordo pista).
Appena riesco farò un giro nella rete seguendo il suggerimento di Lapo, per capire meglio quali altre idee si possono applicare.
Chissà che non ne venga fuori un engine....
Se avete altre riflessioni postate; io vi terrò aggiornati sulle mie prove
A presto
Non so bene se andrò avanti con l'idea, perché personalmente le corse di auto non mi entusiasmano particolarmente e perché non vorrei distogliere tempo ad altri progetti.
Probabilmente realizzerò una prova molto rozza per vedere quale soluzione può risultare migliore.
Sabato ho fatto alcune prove modificando la speed della path seguita dall'oggetto invisibile che viene preso a riferimento dall'auto. Se si modifica la speed fra un intervallo (punto) della path e l'altro, è possibile dare maggior realismo al movimento dell'auto, soprattutto nelle curve, dove il rallentamento si impone, e nei rettilinei, l'accelerazione.
Stavo anche pensando di utilizzare un sistema misto waypoint e path, per aggiungere realismo.
Come qualcuno di voi ha evidenziato, il problema della sbandata resta, per il momento, uno dei più difficili da risolvere, soprattutto perché nell'idea che vi ho esposto se l'auto segue la direzione dell'oggetto che esegue la path allora è difficile fargli cambiare angolo o traiettoria, essendo vincolata dal codice nello script.
Così, sto provando ad utilizzare la frizione (friction) ma è difficile bilanciarla bene (al momento sono solo riuscito ad ottenere che in curva l'auto sbanda troppo e se il percorso è stretto collide con il bordo pista).
Appena riesco farò un giro nella rete seguendo il suggerimento di Lapo, per capire meglio quali altre idee si possono applicare.
Chissà che non ne venga fuori un engine....
Se avete altre riflessioni postate; io vi terrò aggiornati sulle mie prove
A presto
TellyAbba
tellyabba at yahoo.it
tellyabba at yahoo.it
-
- Membro super
- Messaggi: 688
- Iscritto il: 20/10/2006, 16:32
- Uso: GM:Studio 2
- Località: berbenno di valtellina
- Contatta:
Lapo ha scritto:http://www.red3d.com/cwr/steer/gdc99/
E' solo il primo che ho trovato...TellyAbba ha scritto:Fighissimmo il documento di cui al link! Peccato sia in inglese ed io non me la cavo molto bene, ma sarà l'occasione per rimpolparsi un po' la lingua.
Thanks (caspita, sto già tornando in forma!)
Comunque, capire l'inglese del manuale di game maker o di uno scritto così è relativamente molto facile.
-
- Membro super
- Messaggi: 801
- Iscritto il: 12/02/2004, 10:05
- Uso: GM:Studio 2
- Località: Roma
- Contatta:
Zuzzerellando ho trovato questo. Credo sia molto interessante per tutti gli appassionati di corse d'auto
http://gmc.yoyogames.com/index.php?showtopic=318371
http://gmc.yoyogames.com/index.php?showtopic=318371
TellyAbba
tellyabba at yahoo.it
tellyabba at yahoo.it
Gamedev.net Telly, Gamedev.net.TellyAbba ha scritto:Zuzzerellando ho trovato questo. Credo sia molto interessante per tutti gli appassionati di corse d'auto
http://gmc.yoyogames.com/index.php?showtopic=318371
Ho dato ora un'occhiata al "codice", come volevasi dimostrare è un pò una porcata:Lapo ha scritto:Gamedev.net Telly, Gamedev.net.TellyAbba ha scritto:Zuzzerellando ho trovato questo. Credo sia molto interessante per tutti gli appassionati di corse d'auto
http://gmc.yoyogames.com/index.php?showtopic=318371
Codice: Seleziona tutto
direction+=speed*1.5 //turn the car left
Per essere un AI è un pò troppo hard-coded, è più un AHIII, un pò come il raglio di un asino.
- z4g0
- Membro
- Messaggi: 243
- Iscritto il: 16/06/2003, 20:01
- Uso: GM:Studio 2
- Località: Bologna
- Contatta:
qui: http://www.gameprog.it/?resource=313 c'è un mio tutorial di 6 anni fa (ci ho messo quasi altrettanto a ritrovarlo nei meandri di GPI XD) circa un sistema 'artigianale' per simulare la schivata di ostacoli
purtroppo era una conversione in Div Games Studio di un engine che feci su Klik&Play (per questo si basa molto su 'oggetti' grafici e poco su quelli matematici)... in GM, comunque, secondo lo stesso principio dovrebbe essere possibile riscriverlo senza utilizzare troppi oggetti ausiliari...
purtroppo era una conversione in Div Games Studio di un engine che feci su Klik&Play (per questo si basa molto su 'oggetti' grafici e poco su quelli matematici)... in GM, comunque, secondo lo stesso principio dovrebbe essere possibile riscriverlo senza utilizzare troppi oggetti ausiliari...
Chi c’è in linea
Visitano il forum: Nessuno e 88 ospiti