mp_grid conteggio celle

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
rommell76
Newbie
Messaggi: 35
Iscritto il: 09/11/2012, 7:39
Specialità: grafico
Contatta:

mp_grid conteggio celle

Messaggio da rommell76 »

Ciao a tutti

Sto creando un semplice software dimostrativo per un lavoro.

Fondamentalmente ho creato una griglia con grid = mp_grid_create(0,0,60,80,16,16);

ed un oggetto che quando passa sotto alla griglia con la funzione mp_grid_add_instances(grid, Object_01_obj, 1); illumina i quadrati della griglia interessati.

ho poi creato un contatore che ogni tot pixel di avanzamento resetta la griglia con l funzione if global.gr1 = 0

{
mp_grid_clear_all(grid)
}
In quanto non ho capito come cancellare solo le celle non piu' interessate dal passaggio dell'oggetto... :piagne: :piagne:

Avrei bisogno di calcolare il numero di celle "accese" prima che vengano resettate per poi inserire il valore risultante in un altra funzione .

Vi ringrazio in anticipo per qualsiasi aiuto

Avatar utente
Simsure
Membro
Messaggi: 223
Iscritto il: 13/09/2013, 21:54
Specialità: Programmazione
Uso: GM:Studio 2
Località: dietro di te...
Contatta:

Re: mp_grid conteggio celle

Messaggio da Simsure »

Ciao, a te serve un sistema di movimento per le entità di gioco? Nel senso che mp_grid è una serie di funzioni appunto per il Motion Planning(mp) che serve per gestire lo spostamento di entità su una mappa di gioco.
Se a te serve solo una griglia che si accorda di quando un oggetto è all'interno di una casella potresti usare le ds_grid che sono strutture dati fatte apposta.
https://docs.yoyogames.com/source/dadio ... index.html

Per vedere se un oggetto è dentro alla griglia ti basta convertire la sua posizione nella room in base alla dimensione della griglia, tipo

Codice: Seleziona tutto

gridX = round(x/grandezza_delle_caselle)
e poi settare il valore di quella casella con ds_grid_set(index, x, y, value);

Per resettare hai comunque una funzione clear ds_grid_clear(index, val);

E per vedere quante caselle sono accese puoi fare con ds_grid_get_sum(index, x1, y1, x2, y2); dandogli tutta la griglia come dimensione.
Se fai si che quando un oggetto è in una casella questa diventi di valore 1 e che di base siano tutte 0, usando questa funzione prendi la somma di tutti i valori della griglia, che quindi ti tornerà il numero di caselle accese.
Immagine
Spoiler
Immagine

rommell76
Newbie
Messaggi: 35
Iscritto il: 09/11/2012, 7:39
Specialità: grafico
Contatta:

Re: mp_grid conteggio celle

Messaggio da rommell76 »

Ciao

Intanto grazie infinite per la risposta , sto guardandomi un po le funzioni ds_grid su docs.yoyogames per capirne di piú ( sono poco esperto come potrai notare )

quello che devo fare fondamentalmente é una rappresentazione visiva di due griglie affiancate una con celle di dimensioni 6x10 ed una di dimensioni 40x100 , far passare una figura di forma circolare sotto le due glriglie e leggere i valori accesi delle 2 rispettive griglie per calcolare poi la differenza nelle 2 aree rilevate .

Da niubbo avevo iniziato con mp_grid perché ho visto che posso settare la dimensione di ogni cella come voglio , con ds_grid se non sbaglio posso creare solo griglie a quadretti.

Avatar utente
Simsure
Membro
Messaggi: 223
Iscritto il: 13/09/2013, 21:54
Specialità: Programmazione
Uso: GM:Studio 2
Località: dietro di te...
Contatta:

Re: mp_grid conteggio celle

Messaggio da Simsure »

Che intendi con "griglie a quadretti"? Se intendi come vengono viste sullo schermo quello puoi deciderlo tu in base a come scegli di rappresentarle, ma tutte le griglie sono "a quadretti" a caselle insomma. In questo caso ricorda che calcolo dei dati e rappresentazione visiva sono due cose separate e distinte. Con la mp_grid cè una funzione che la disegna, ma non è esattamente il massimo e ha piu lo scopo di debug, mentre per le ds_grid puoi rappresentarle tu con quadrati,linee e colori come preferisci una volta che ottieni i dati dalla griglia.

O forse intendi nella "forma"? Cioè una griglia larga 40 e alta 100? Per quello basta dichiararla tale.
grid = ds_grid_create(40,100)
Immagine
Spoiler
Immagine

Niubbo76
Newbie
Messaggi: 1
Iscritto il: 18/03/2019, 16:48
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: mp_grid conteggio celle

Messaggio da Niubbo76 »

Quello che devo fare è praticamente questo :

Immagine


i due dischi passano sotto le 2 griglie e man mano che avanzano accendono e spengono i rettangoli interessati, prima che un rettangolo si spenga devo registrare il valore di acceso in un contatore dove , nel riquadro di destra in questo caso sarà di 9 ed in quello di sinistra di 35.

Avanzando i dischi spegneranno ed accenderanno i rettangoli in corrispondenza della direzione di avanzamento .

il fatto è che sia in forma visiva che in forma di dati la cella della griglia deve avere le dimensioni che imposto ( 6x10 a sinistra e 60x15 a destra )

da quello che ho capito se creo una ds_grid 10x100 per esempio mi creerà una griglia alta 10 larga 100 com 1000 celle 10x10 all'interno ,se io quelle celle le voglio fare 6x10 non posso giusto ?

Avatar utente
Simsure
Membro
Messaggi: 223
Iscritto il: 13/09/2013, 21:54
Specialità: Programmazione
Uso: GM:Studio 2
Località: dietro di te...
Contatta:

Re: mp_grid conteggio celle

Messaggio da Simsure »

Le celle di una ds_grid non hanno una forma o uno spazio, sono solo un contenitore per un valore, non sono nemmeno 10x10 quindi, quello ricade nella rappresentazione visiva che vuoi dargli.

Comunque forse per quello che devi fare può essere piu immediato e semplice usare degli oggetti, ti faccio vedere un modo in cui potresti farlo.
Fai un oggetto "cella" con 2 variabili w e h (x e y sono gia messe di base), e un'altra chiamata active per dire, messa a false. Poi crei due sprite con la forma di rettangoli delle dimensioni dei due tipi di cella.
Quando avii il gioco usi due cicli for per cerare tante instance cella in modo da formare la griglia, appena create le riprendi e setti le variabili w e h delle dimensioni che ti servono e ne imposti lo sprite in base al tipo di griglia.
Essendo alle prima armi ti faccio vedere questo passo a codice che magari può essere un pò confusionario da leggere.

Codice: Seleziona tutto

for(var i=0; i<larghezza_griglia; i++)
{
for(var j=0; j<altezza_griglia; j++)
{
	var ogg = instance_create(i*larghezza_cella, j*altezza_cella, obj_cella)
	ogg.w = larghezza_cella
	ogg.h = altezza_cella
	ogg.sprite_index = spr_cella_1
}
}
Nello step dell'oggetto sfera prima di tutto prendi ogni oggetto cella esistente (basta usare il nome dell'oggetto) ed imposti active a false per resettare le celle attivate nello step precedente, poi usi questa funzione collision_circle_list()
https://docs2.yoyogames.com/source/_bui ... _list.html
Che date le coordinate ed il raggio dell'oggetto cerchio tornano una ds_list (di cui trovi le funzioni sulla documentazione) contenente tutti gli oggetti cella (o qualsiasi altro oggetto gli dichiari quando chiami la funzione) con cui il cerchio collide in quel momento.

Ora ti basta prendere ogni oggetto nella lista e settare active a true e magari cambiare lo sprite della cella con uno uguale ma illuminato.
Oppure nell'evento draw delle celle mettere che se active è uguale a true allora disegna lo stesso sprite ma colorato di giallo.

Questo è un modo (uno dei tanti con cui si potrebbe risolvere il problema) piu immediato anche se meno ottimizzato, ma se le tue griglie sono cosi piccole non dovrebbero esserci problemi.
Immagine
Spoiler
Immagine

rommell76
Newbie
Messaggi: 35
Iscritto il: 09/11/2012, 7:39
Specialità: grafico
Contatta:

Re: mp_grid conteggio celle

Messaggio da rommell76 »

Rieccomi qua

ho provato varie soluzioni per cercare di capire come fare , compresa quella che mi hai suggerito ma purtroppo e troppo pesante per quello che devo fare

fai conto che creando degli oggetti Cella di dimensione 6x10 pixel ( la dimensione con la quale devo lavorare ) per fare la simulazione creo 11.000 istanze .... tutto funzionerebbe anche bene .... il fatto e' che rallenta in maniera patetica il programma .

Qualcuno mi ha suggerito di creare un array e lavorare con una griglia basata su quello ma francamente ... non ho la piu pallida idea di come fare :-( ... sto cercando tutorial in giro per il mondo ma non ne vado fuori :-( ...

Rispondi

Chi c’è in linea

Visitano il forum: Bing [Bot], Google [Bot] e 122 ospiti