Dunque, premetto che questo rappresenta il mio primo tutorial ' ufficiale ' e che quindi potrei commettere degli errori nella spiegazione.
Cosa molto importante da dire e' che l'eseguibile contiene un BUG che nega il riconoscimento di alcune istanze all'interno delle ROOM. Per risolvere questo fastidioso problema, ho studiato un sitema di creazione istanze e la loro sucessiva distruzione, al termine del loro compito, ma lo spieghero' passo passo sucessivamente.
Anzitutto ecco l'editabile http://mastergidan.altervista.org/forum/...php?aid=55 (modificato ed aggiornato)
Questo semplice programma trova il suo utilizzo quando, dovendo creare una ricerca percorsi all'interno di una certa area di movimento, ci troviamo a che fare con una zona di movimento estremamente elaborata.Per far questo si utilizzano le funzioni MP_GRID*, che integrano all'interno del loro codice l'uso dell' A* ( si legge A star ).
L' A* e' un algoritmo di calcolo utilizzato in molti giochi professionali, estremamente utile ad esempio, per trovare una strada percorribile all'interno di un labirinto.
Detto molto semplicemente, A* calcola il " peso " di ogni spostamento in ogni direzione consentita e ripete il calcolo ad ogni cella di spostamento raggiunta, seguendo sempre il percorso con il minor " peso " ( quindi il piu' veloce ).
Ipoteticamente, inserendo il nostro personaggio all'interno di uno spazio perimetralmente chiuso, esso non cerchera' nessun percorso che non sia all'interno dello stesso " recinto ".
Detto questo, ve ne illustro brevemente il funzionamento, tralasciando la spiegazione dei passi piu' semplici, ma restando disponibile ad ulteriori spiegazioni.
Il programma si compone sostanzialmente di 7 oggetti,4 dei quali verranno distrutti al termine del loro compito.
Nella room iniziale andranno inseriti OB_CREATE e OB_BLU, posizionando quest'ultimo all'interno della mappa di background.
Il primo passo consiste nel creare un oggetto OB_CREATOR, che avra' il compito di generare le altre istanze e fatto questo, si autoeliminera'. Il suo codice e' semplice e si svolge solo in un evento CREATE.L'ordine di creazione inserito e' ottimale per il corretto funzionamento del programma, perche' ,create in altro ordine, si genererebbero errori per chiamate a variabili od eventi non ancora esistenti.
Il secondo oggetto creera' la griglia di movimento.
Ho identificato il nome delle variabili per renderle le piu' intuitive possibile.
Noterete la presenza di dim_celle:
questa e' una costante e andra' creata nel game setting, settandola a 16.
Le costanti sono un modo rapido per modificare le voci da cui vengono richiamate. Sono simili alle variabili, ma non possono essere modificate una volta dichiarate e non occupano memoria come un vera variabile.
La funzione inserita dopo il commento, va eliminata , e' li per sbaglio....
Come e' intuibile, la griglia si originera' dal punto 0,0 ed avra' termine nella casella calcolata dalle variabili num_celle ( parliamo di caselle di griglia e non di coordinate x y ).
L'oggetto ob_muri, servira' piu' avanti e non ha eventi.
Il quarto oggetto e' OB_CONTROL.
Esso ha il compito di far muovere il cursore, o meglio, la serie di cursori che individueranno la mappa presente nella room. Ad esso e' associato lo sprite SP_SENSORE ( un quadretto giallo ).
Il ciclo presente in STEP EVENT avra' origine solo al commutare della variabile start a 1, da parte di OB_GENERATORE.
Questo avviene perche', come vedremo, quest'ultimo avra' il compito di creare una serie di sensori OB_CONTROL e solo al termine della creazione, fara' partire il ciclo di controllo.
All'interno di OB_CONTROL, nell'evento create, solo un paio di variabili, una di cui ho discusso, l'altra servira' internamente al ciclo step per bloccare il movimento di scansione al raggiungimento della fine della room e la conseguente distruzione dell'evento...
Il rilevamento si effettuera' usando la funzione position_meeting con l' obj OB_MAPPA, al cui contatto, tramite MP_GRID_CLEAR_CELL, si marcheranno le relative celle come libere ( verdi )
OB_MAPPA:
semplicemente la mappa da ' ritagliare.
Nell'esempio ho utilizzato la stessa sprite SP_MAPPA, sia per creare questo oggetto e sia per la creazione del background, che saranno dimensionalmente identici e con la stessa origine.
All'interno dello STEP, un semplice controllo della NON esistenza dell'istanza OB_CONTROL, distruggera' la mappa, che restera' visibile in quanto nella room avremo impostato il background di cui sopra discusso.
Per chiarire, la mappa viene distrutta in quanto dovrebbe essere piu' semplice ,ai fini di calcolo CPU, la gestione di un background che non di un'oggetto, magari dimensionalmente grande... ( di questo non sono certo
)
L' OB_GENERATORE, che si compone di un solo evento CREATE, ha il compito di settare come proibite ( rosse ) tutte le celle, tramite la funzione mp_grid_add_rectangle, le cui dimensioni sono calcolate sempre in posizione di cella e fanno riferimento alla dimensione della room, Questa marcatura permettera' sucessivamente, come visto in OB_CONTROL, di riconoscere le celle libere.
Il ciclo for crea gli OB_CONTROL uno sotto l'altro, sino ad arrivare all'altezza massima della room, dopodiche' forzera' la variabile ob_control.start ad 1 ( innescando l'esecuzione del relativo processo ) e la distruzione di questo ennesimo oggetto.
Nota importante : la room dovra' avere altezza multipla di dim_celle, ma ho pronto un pezzo di codice che dovrebbe sistemare anche questo particolare...
l'ultimo oggetto rappresenta il nostro ' personaggio ', un semplice pallino blu....
Nel suo evento GLOBAL LEFT BUTTON, si trovano tre funzioni:
la prima dice quali oggetti sono da considerare intransitabili ai fini del calcolo percorso ( diciamo come le nostre celle rosse ), associando in questo caso OB_MURI.
La sentenza IF contiene invece il cuore di calcolo dei percorsi, dove MP_GRID_PATH rileva la percorribilita' del tracciato ( evitando celle rosse e OB_MURI ) e se il percorso puo' esistere, fa partire il percorso, precedentemente creato ( in realta' ancora non avevo detto di farlo
)denominato path_base.
Path_base non richiede nessun parametro, basta crearlo e lasciare tutto il resto così com'e'.
In DRAW EVENT si disegna la griglia in trasperenza e si disegna lo sprite....
L'OB_MURI permette inoltre di affinare la mappa, perche' come noterete, in alcuni punti vicinali il perimetro, alcune celle sono transitabili anche se eccedenti la mappa.Questo avviene perche' le funzioni MP_GRID permettono di avere solo celle libere o proibite.
Inserendo invece manualmete i nostri muri nei punti critici, possiamo sistemare molto meglio la mappa finale.Questo comportera' l'inserimento di parecchi OB_MURI, ma potremo sempre distruggerli e lasciare al loro posto celle proibite, una volta inserite nella room iniziale !
Spero di essere stato comprensibile