Cerca de camí basada en la quadrícula | hyperPad Documentation

Loading...

Logo

En aquest tutorial, farem una simulació de cerca de camí basada en una graella de matriu bidimensional. Això ens donarà una idea bàsica per a crear activitats de cerca de camí per als nostres jocs. Visualitzarem la graella utilitzant objectes quadrats buits com a pisos i un objecte rodó com el nostre avatar que pot moure's en aquesta àrea de graella amb el nostre comando.

Video_2019-07-30__2_32_01_PM.gif

I. Configurant els objectes

Només farem servir quatre objectes en el nostre projecte. El nostre avatar verd, un pis blau, un bloqueig blanc, i l'etiqueta de la graella per configurar i visualitzar la nostra graella.

Photo_2019-07-29__1_50_10_PM.png

Avatar

El nostre avatar és un objecte buit que té una escala x i y del 50%. Ha de tenir la seva col·lisió configurada en una forma rodona perquè sembli com el de la imatge següent. Aquest objecte tindrà tres atributs predeterminats: en pis, pis anterior i pis objectiu. Estableix els valors per defecte d'aquests atributs a zero perquè no tinguin un valor nul quan intentem agafar-los més endavant.

Photo_2019-07-29__1_53_38_PM.png

Objecte Pis

Crea un altre objecte buit que s'utilitzarà per visualitzar els pisos a la nostra graella. La seva escala també és del 50% i només té un atribut predeterminat: en pis. Estableix també aquest valor a zero.

Photo_2019-07-29__1_53_51_PM.png

Objecte Bloqueig

Crea un altre objecte buit que servirà com a bloqueigs a la nostra graella. Aquest és un objecte buit blanc amb una escala del 40%. El nostre avatar no podrà travessar un pis que tingui un bloqueig a sobre.

Etiqueta de la Graella

Aquesta és només una etiqueta que tindrà els comportaments que permetran la configuració i visualització de la nostra graella. Té atributs predeterminats: inici x amb un valor de 4 i inici y amb un valor de 3. Aquests valors són desplaçaments que s'utilitzaran com a referència quan apareguem els nostres pisos per posicionar la nostra graella netament al centre.

Photo_2019-07-29__1_56_01_PM.png

Atributs predeterminats d'Avatar/Pis:

Definim un pis aquí com una matriu de 2 dimensions que tindrà un valor x i y basat en la nostra graella.

  • en pis - aquest és el valor del pis en el qual el nostre objecte es troba actualment a la nostra graella
  • pis anterior - un pis que va ser anteriorment travessat pel nostre avatar
  • pis objectiu - el pis al qual el nostre avatar anirà

II. Configurant la graella

Dins de l'etiqueta de la graella és on definirem la nostra matriu 2D i la generació de la nostra graella. Hi ha 2 punts clau principals en aquest objecte: configurar la matriu i visualitzar la matriu. Fem primer el paquet de configuració de la matriu.

Photo_2019-07-29__3_05_10_PM.png

Configura la matriu - paquet

Primer és crear una matriu buida anomenada 'Graella'. Aquesta matriu contindrà la nostra matriu bidimensional. Tindrem un contenidor de caixes anomenat 'comptador de files x' que té un valor de 24 i una altra matriu buida anomenada 'fil y' que té 18 valors buits.

Photo_2019-07-29__1_55_28_PM.png

El primer comportament del nostre paquet és un bucle amb un nombre de repeticions de 'comptador de files x'. Per cada pas d'aquest bucle, afegirem una fila y buida a la 'matriu Graella'. Això crearà una matriu dins d'una matriu amb una dimensió de 24x18.

Vigila que hem connectat un comentari inactiu al començament del nostre paquet per negar l'execució automàtica d'aquest comportament arrel. Un comportament arrel és un comportament que no s'activa en funció de cap esdeveniment i es col·loca obertament a la interfície.

Visualitzar la graella - paquet

La principal cosa que farem aquí és traversar cada valor de la nostra 'matriu Graella' i apareixer un objecte pis. També afegirem una condició en el nostre bucle que permeti l'aparició d'un bloqueig blanc a sobre de l'objecte pis.

Photo_2019-07-29__3_56_37_PM.png

El primer pas és obtenir el comptador d'elements de la nostra 'matriu de files y', el valor de l'atribut 'inici x' d'aquest objecte i el 'inici y'.

Crea un bucle que tingui un número de repeticions igual a 'comptador de files x' i per cada pas d'aquest bucle, afegirem el valor d'índex d'aquest bucle i el valor de l'atribut 'inici x'. Això resulta en una posició absoluta x que utilitzarem per posicionar els pisos apareguts més endavant. A continuació, tenim el bucle 'fil y' que té un nombre de repeticions de 'comptador de files y'. Per cada pas d'aquest bucle, afegirem el valor d'índex d'aquest bucle i el valor d'atribut 'inici y', que ara resultat en la posició absoluta y.

Photo_2019-07-29__4_03_51_PM.png

Després d'afegir els valors sota el 'bucle de fila y', s'apareixerà l'objecte blau. Estableix el nombre d'objectes vius d'aquell a 999 perquè necessitarem un munt d'aquests per a la nostra graella, i també amb una durada de 0. Després es mourà aquell objecte aparegut a un punt x amb un valor del bucle x 'afegir valors' i al punt y amb un valor del bucle y 'afegir valors'.

A continuació, afegeix una matriu amb 2 valors buits anomenats 'En pis' que només utilitzarem com a marcador de posició de la matriu. Després de moure l'objecte pis, modifica la matriu 'En pis' substituint el seu valor a l'índex 0 amb el valor del 'bucle de fila x'. Després afegeix una altra modificació de matriu que substitueixi el valor a l'índex 1 amb el 'índex de fila y'. Aquests són les coordenades x i y de la nostra graella que l'objecte tindrà com a atribut 'en pis'.

Ara, estableix l'atribut de l'objecte aparegut amb una clau dinàmica, 'en pis', i amb un valor de 'matriu En pis'.

Photo_2019-07-29__4_41_55_PM.png

Encara sota el bucle de fila y, hi ha la condició d'aparèixer l'objecte bloqueig blanc. Tindrem un 2 de 5 de probabilitats d'executar aquest paquet que afegirà a la aleatorització de la nostra graella. A continuació, marcarem un valor de 1 a les coordenades x i y d'això a la nostra 'matriu Graella' que ens indica que aquesta coordenada té un bloqueig aparegut.

El primer pas és tenir un número aleatori de 1 a 5. Si aquest número és menor o igual a 2, apareguem el bloqueig. Estableix el seu nombre d'objectes vius a 999 i mou a aquell objecte al mateix punt que el pis blau que vam aparèixer abans, i també amb una durada de 0.

A continuació, emmagatzemem la informació que aquesta coordenada estava ocupada per un bloqueig, si es va aparèixer. Fem això marcant aquesta coordenada amb un valor de 1. El primer és obtenir el valor a l'índex 'bucle de fila x' de la 'matriu Graella'. Aquest valor ens donarà una matriu d'una 'fila y'. Modificarem aquesta 'fila y' substituint el seu valor a l'índex 'bucle de fila y' amb el valor 1, que és el valor marcat. Com que aquesta modificació de valor només s'aplica a aquell valor i no a la 'Matriu' en sí, encara hem de modificar la 'matriu Graella'. Substituïm el valor a l'índex 'bucle de fila x' de la 'matriu Graella' amb un valor de 'modificar fila y - matriu'.

Un cop jugat, hauria de resultar en aquest tipus de forma.

Photo_2019-07-29__4_45_18_PM.png

III. En Pressionar el Pis

Per poder interactuar amb la graella mateixa, necessitarem un comportament de paquet sempre que pressionem un pis blau. La primera pressió resultarà en l'aparició del nostre avatar a la nostra graella, i qualsevol pressió successiva després d'aquest esdeveniment iniciarà la seva cerca de camí.

Dins de l'objecte blau hi ha un paquet de comportaments que té 3 punts principals: és restablir el pis anterior del nostre avatar, establir el seu pis objectiu/establir el seu pis objectiu, i després establir una animació de color per visualitzar l'esdeveniment de toque a la pantalla.

Photo_2019-07-29__5_00_44_PM.png

El primer és obtenir l'atribut 'en pis' de l'objecte pis. Estableix l'atribut 'pis anterior' del nostre avatar a 0. El nostre avatar s'ha de configurar per evitar tornar a un 'pis anterior', és per això que restablim el 'pis anterior' cada cop que pressionem un pis.

A continuació, obté l'atribut 'en pis' del nostre avatar. La primera condició if és si el valor 'en pis' és igual a zero. Això vol dir que si l'avatar no ha aparegut encara, llavors això resultarà veritat. Si és veritat, configurarem el seu atribut 'en pis' amb el valor de l'atribut 'en pis' de l'objecte pis. Després mourem la posició del nostre avatar obtenint la posició de l'objecte pis, apuntant els seus valors x i y a ese punt amb una durada de 0.

Si el valor 'en pis' no és igual a zero. configurarem l'atribut 'pis objectiu' del nostre avatar amb el valor de l'atribut 'en pis' de l'objecte pis. Això vol dir que el nostre avatar ja està a la nostra graella, i llavors podem executar el paquet de comportament 'trobar camí'. Encara no tenim aquest comportament, però ho solucionarem després de fer la següent part d'aquest tutorial per a 'trobar camí'.

Ara que hem configurat correctament el nostre avatar a la nostra graella, només hem de visualitzar aquest esdeveniment de pressió. Primer, tenim un comportament arrel 'obtenir color' per obtenir el seu color original. Després de l'esdeveniment de pressió, establirem el color de l'objecte pis a negre amb una durada de 0, i després tornarem a establir el seu color al seu valor original amb una durada de 0.2.

La pressió en un pis blau hauria de resultar en això.

Photo_2019-07-30__1_04_42_PM.png

IV. Executar el Paquet Trobar Camí

Per aquesta darrera part del nostre tutorial, farem l'algorisme que ens permet trobar el pis més proper que el nostre avatar pot agafar per arribar a la seva destinació. Aquest paquet es repetirà per cada pas de pis que el nostre avatar es mou a la nostra graella.

Establirem l'algorisme dins del nostre objecte avatar i que tindrà tres punts principals: trobada de pisos adjacents, trobada del pis adjacent més proper, i el moviment a aquell pis adjacent.

Photo_2019-07-29__5_39_25_PM.png

Trobant els pisos adjacents

En aquesta part, recollirem tots els pisos adjacents als quals el nostre avatar hauria de poder travessar. Comprovarem els quatre pisos adjacents direccionals i veurem si aquells pisos tenen un bloqueig a sobre o si han estat anteriorment trepitjats.

Photo_2019-07-29__5_40_24_PM.png

El primer pas és afegir la nostra matriu 'Pisos adjacents'. Una matriu 'Direcció' amb 2 valors buits, i les quatre matrius direccionals que tenen 2 valors per cadascuna: N (0,1), S (0,-1), E (1,0), O( -1,0).

El primer comportament del nostre paquet és esborrar els nostres pisos adjacents. Com que farem aquest paquet repetidament, necessitem que els nostres 'pisos adjacents' recullin cada cop es restableixin. Els següents quatre comportaments són modificacions a la matriu 'Direcció'. Establim la matriu de la matriu 'Direcció' quatre vegades amb les quatre matrius direccionals, i després executem el paquet a continuació. Fem això per crear un bucle amb valors de matriu 'Direcció' diferents cada vegada.

Photo_2019-07-29__6_04_42_PM.png

Ahora que tenim la direcció, només hem de combinar els seus valors x i y amb l'atribut 'en pis' del nostre avatar. Després podrem obtenir el valor objectiu a la 'matriu Graella' per saber si aquest pis està marcat amb un bloqueig.

'Direcció x' és el valor de la matriu 'Direcció' a l'índex 0, 'obtenir en pis' x és el valor de 'obtenir en pis' a l'índex 0. El objectiu x és la suma dels valors de 'direcció x' i 'obtenir en pis x'. El mateix es fa amb els valors y però amb un índex objectiu de 1.

'Fila objectiu y' és el valor de la 'matriu Graella' a l'índex 'Fila objectiu x'. I llavors l'índex objectiu en la fila y serà el valor de la fila objectiu y a l'índex de 'Fila objectiu y'. És la coordenada a la nostra graella que ens dirà si està marcada amb un bloqueig.

Photo_2019-07-29__6_17_41_PM.png

Si el valor a 'Índex objectiu en fila y' és 1, llavors aquest pis objectiu està marcat com bloquejat. Però si el valor no és igual a 1, llavors podem continuar en el nostre paquet.

Com que el nostre objectiu x i y van passar la nostra condició, hem afegit una nova matriu de pis buida anomenada 'Nou pis adjacent'. Aquesta ens emmagatzemarà els valors de l'objectiu x i y com a matriu de pis. Establirem el valor de l'objectiu x a l'índex 0 de 'Nou pis adjacent' i l'objectiu y al seu índex 1.

Ara obtindrem l'atribut 'pis anterior' del nostre avatar. Si el 'pis anterior' no és igual al 'nou pis adjacent', això voldria dir que el nou pis no ha estat travessat anteriorment. Llavors, podem afegir 'Nou pis adjacent' a la matriu de 'Pisos adjacents' afegint-lo. Establirem el valor del 'pis anterior' més tard després de moure amb èxit el nostre avatar a un altre pis.

"Pots expandir aquest paquet fent vuit matrius direccionals que permetin al teu avatar moure's en direccions diagonals."

Trobant el pis adjacent més proper

Ara que hem recollit els nostres pisos adjacents fiables, només necessitem obtenir el pis adjacent que és el més proper al pis objectiu del nostre avatar. Farem el càlcul utilitzant una fórmula de distància subministrada pels valors x i y del nostre pis objectiu i dels pisos adjacents.

Hi ha dos punts clau en aquest paquet: la inicialització de variables per al càlcul i el càlcul de les distàncies dels pisos dins d'un bucle.

a. Inicialització de variables

Primer, obtindrem el comptador d'elements de la nostra matriu de pisos adjacents. Després obtindrem l'atribut 'pis objectiu' del nostre avatar i obtindrem els seus valors x i y. Afegirem 2 nous contenidors de caixes: el 'Min distància' i el 'Índex de pis objectiu'. Establim el valor inicial del 'Min distància' a 9999, i el valor de 'Índex de pis objectiu' a 0. La min distància es estableix a un número alt perquè necessitem la distància mínima des del començament. L'índex de pis objectiu és el nostre índex de referència a la matriu 'Pisos adjacents' que té la menor distància al 'pis objectiu'.

El nostre objectiu principal aquí és obtenir l'índex del pis dins de la nostra matriu 'Pisos adjacents' que és el més proper al 'pis objectiu'.

Photo_2019-07-29__6_47_43_PM.png

b. Càlcul de les distàncies dels pisos

En aquest paquet, farem el càlcul dins d'un bucle que farem per cada pis adjacent. El bucle es repeteix amb el 'comptador de pisos adjacents' i obtindrem el valor del pis de la matriu 'Pisos adjacents' utilitzant l'índex d'aquest bucle.

Obteniu els valors x i y d'aquest pis adjacent i llavors obtindrem la distància entre el nostre 'pis objectiu' i el 'pis adjacent' utilitzant aquesta fórmula:

distància = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Objectiu x
x2 = Adjacente x
y1 = Objectiu y
y2 = Adjacente y

Primer, restem els seus valors x i y, els multipliquem per sí mateixos per obtenir els seus valors exponencials, afegim aquells valors, i després fem la arrel quadrada dels valors afegits, per obtenir el valor de la distància.

Photo_2019-07-29__6_46_04_PM.png

Si el valor de 'Distància' és menor que el valor del contenidor de 'Min distància', llavors establirem el valor de 'índex de pis objectiu' al valor actual de l'índex del bucle, que és l'índex de la nostra matriu obtinguda dins de la matriu 'Pisos adjacents'. També establiré el valor del contenidor de 'Min distància' amb el valor de 'Distància' per poder comparar-lo amb el següent pis del nostre bucle.

Després de finalitzar el bucle, hem comparat cadascun dels nostres pisos adjacents i hem obtingut el valor de l'índex del pis adjacent que és més proper al 'pis objectiu'.

Moviment al pis adjacent

En aquest últim paquet del nostre tutorial, mourà el nostre avatar al pis adjacent més proper i tornarem a fer el paquet 'Trobar Camí' si encara no hem mogut al 'pis objectiu'.

Photo_2019-07-30__1_23_31_PM.png

El primer pas és comprovar si el nostre 'comptador de pisos adjacents' és més gran que 0. Això és per assegurar-nos que només ens mourà si hem obtingut almenys un pis adjacent fiable.

Després 'Obtenim el pis més proper' utilitzant el valor de 'índex de pis objectiu' del paquet anterior per obtenir el valor de la matriu de 'Pisos adjacents'.

Per obtenir el punt exacte on el nostre avatar es mourà, necessitarem els valors del x i del y d'aquest pis, i també aconseguir els valors d'atribut 'inici x' i 'inici y' de la nostra etiqueta 'graella'. Aleshores afegim el valor x del nostre 'pis més proper' i el valor 'inici x', i també el mateix amb els valors y. Aquests valors afegits són els nostres punts objectius x i y on el nostre avatar es mourà.

Abans de moure's a aquest punt, establirem el 'pis anterior' del nostre avatar amb el valor de la seva actual atribut 'en pis'. Podem obtenir aquest valor 'en pis' dels paquets anteriors. Ara movem el nostre avatar als nostres punts objectius, amb una durada de 0.2.

Després de completar el comportament 'Mou-te al punt', ara establirem l'atribut 'en pis' del nostre avatar amb el valor de la matriu 'Obteniu el pis més proper'. Si el valor de la matriu 'Obtenir el pis més proper' no és igual al nostre 'pis objectiu', llavors executarem el paquet 'Trobar Camí', per tant, repetim tot el paquet novament. El valor d'atribut 'pis objectiu' es pot obtenir del paquet anterior.

En presionar qualsevol pis blau, i després de l'aparició del nostre avatar a la graella, s'executarà el paquet 'Trobar Camí'. Això activarà el moviment de l'avatar de pis a pis.

Conclusió

En aquest tutorial, hem après a fer una activitat de cerca de camí d'objecte utilitzant una matriu que anomenem 'Graella', que s'utilitza per guardar informació sobre si aquest pis estava ocupat o no. Pots expandir aquesta idea mitjançant l'ús de IDs d'objecte com a emmagatzematge d'informació en comptes d'un simple número per a la nostra matriu 'Graella'. Això ens donarà informació més fiable que podrem utilitzar quan fem la cerca de camí. Per exemple, podem aconseguir els atributs d'aquest ID d'objecte per saber si està viu o no, i si ens permetrà ficar-nos al seu pis o no.

Aquest tutorial només ha servit per a la idea bàsica darrere de la cerca de camí. Un inconvenient d'això és que no crea el camí més curt possible fins a un pis objectiu, i només verifica els seus pisos adjacents actuals. Això pot resultar en un bucle de moviment que no arriba enlloc.

Tanmateix, això es pot resoldre ampliant el nostre algoritme de cerca de camí. Podem fer això reiterant sobre el nostre pis adjacent obtingut per aconseguir els seus pisos adjacents també fins a trobar el nostre pis objectiu. Cada pis adjacent més proper trobat s'afegirà a una llista. Per evitar un bucle infinit, afegeix una condició que si aquest pis adjacent ha estat comprovat ja, aquell pis no s'afegirà a la nostra llista. A més, afegeix un límit màxim al comptador d'iteració per evitar un bucle infinit causat per l'objectiu de pis si és massa lluny o no és possible de trobar. Un cop aquesta iteració troba el pis objectiu, sortim d'aquesta iteració i comencem a moure l'avatar de pis a pis utilitzant la llista de pisos.