Platform fluido?

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Platform fluido?

Messaggio da AlexU2004 »

Salve a tutti e scusate se vi disturbo. avrei un problema con la collisione degli oggetti nei platform , un problema molte volte discusso ma mai veramente risolto in questo forum. Credo sia inutile spiegarvi precisamente che problemi con le collisioni, ma lo farò comunque. Quando l'oggetto salta e viene premuto il tasto per accelerare da un lato, se ce una collisione con un muro l'oggetto non cade ma si appiccica al muro (perchè lo speed orizzontale è ancora attivo). ho trovato diverse soluzioni ma sono tutte molto "aggrovigliate" o efficaci ma comunque con dei bug. mi potreste spiegare (tramite la programmazione a icone) come posso fare per creare un platform fluido? Grazie in anticipo e mi scuso se ho fatto una domanda a cui ce già la risposta nel forum. (considerando anche le variabili sprite index, ecc..)

ZerA78
Membro super
Messaggi: 516
Iscritto il: 01/01/2013, 16:00
Specialità: Idee
Contatta:

Re: Platform fluido?

Messaggio da ZerA78 »

lascia perdere il drag& drop delle icone e inizia ad imparare il gml.
per fare quello che descrivi hai bisogno di alcuni if che non sono tanto gestibili con le icone
Immagine

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

ZerA78 ha scritto:lascia perdere il drag& drop delle icone e inizia ad imparare il gml.
per fare quello che descrivi hai bisogno di alcuni if che non sono tanto gestibili con le icone
Grazie del chiarimento, ci proverò

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Platform fluido?

Messaggio da Alv »

Ciao! Devi gestire il movimento lungo l'asse x separatamente da quello lungo y. Nello sprite del player imposti una collision box rettangolare. In questo modo, il player sarà un rettangolo in grado di strisciare contro il pavimento e contro i muri.

Ti spiego meglio come funziona:
Se tu muovi contemporaneamente il player lungo le assi x e y, quando avverrà una collisione l'oggetto verrà rispostato indietro. In questo modo non si sarà mosso né lungo x né lungo y. Il movimento invece dovrebbe avvenire in questo modo (pseudocodice):

Codice: Seleziona tutto

se la posizione (x+speed_x, y) è libera, somma speed_x a x
se la posizione (x, y+speed_y) è libera, somma speed_y a y
Ultima modifica di Alv il 06/01/2021, 14:37, modificato 8 volte in totale.

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

Alv ha scritto:Ciao! Devi gestire il movimento lungo l'asse X separatamente da quello lungo Y. Nello sprite del player imposti una collision box rettangolare. In questo modo il player sarà un rettangolo in grado di strisciare contro il pavimento e contro i muri.

Ti spiego meglio come funziona. Se tu muovi contemporaneamente il player lungo le assi X e Y, avverrà una collisione e l'oggetto verrà rispostato indietro. In questo modo non si sarà mosso nè lungo X nè lungo Y. Il movimento invece dovrebbe avvenire in questo modo:

se la posizione (x+speed_x,y) è libera, somma speed_x a x
se la posizione (x,y+speed_y) è libera, somma speed_y a y
Grazie per aver chiarito! :) comunque alla fine ho trovato un modo semplice in questo link http://www.valcon.it/gamemaker/platform-game/ e sono anche riuscito ad usare gli sprite index senza bug e solo con le icone :banana: :banana: :banana: :metalgo: :metalgo: :metalgo:

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

[quote="AlexU2004"][quote="Alv"]Ciao! Devi gestire il movimento lungo l'asse X separatamente da quello lungo Y. Nello sprite del player imposti una collision box rettangolare. In questo modo il player sarà un rettangolo in grado di strisciare contro il pavimento e contro i muri.

Ti spiego meglio come funziona. Se tu muovi contemporaneamente il player lungo le assi X e Y, avverrà una collisione e l'oggetto verrà rispostato indietro. In questo modo non si sarà mosso nè lungo X nè lungo Y. Il movimento invece dovrebbe avvenire in questo modo:

se la posizione (x+speed_x,y) è libera, somma speed_x a x
se la posizione (x,y+speed_y) è libera, somma speed_y a y[/quote]
Grazie per aver chiarito! :) comunque alla fine ho trovato un modo semplice in questo link http://www.valcon.it/gamemaker/platform-game/ e sono anche riuscito ad usare gli sprite index senza bug e solo con le icone :banana: :banana: :banana: :metalgo: :metalgo: :metalgo:[/quote]
anzi a dire il vero ci sarebbe ancora un piccolo bug quando lo sprite destro (lasciate perdere la grafica malfatta che e una prova) va in collisione col muro, vi invierei il file ma non mi lascia aggiungere estensioni

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

AlexU2004 ha scritto:
AlexU2004 ha scritto:
Alv ha scritto:Ciao! Devi gestire il movimento lungo l'asse X separatamente da quello lungo Y. Nello sprite del player imposti una collision box rettangolare. In questo modo il player sarà un rettangolo in grado di strisciare contro il pavimento e contro i muri.

Ti spiego meglio come funziona. Se tu muovi contemporaneamente il player lungo le assi X e Y, avverrà una collisione e l'oggetto verrà rispostato indietro. In questo modo non si sarà mosso nè lungo X nè lungo Y. Il movimento invece dovrebbe avvenire in questo modo:

se la posizione (x+speed_x,y) è libera, somma speed_x a x
se la posizione (x,y+speed_y) è libera, somma speed_y a y
Grazie per aver chiarito! :) comunque alla fine ho trovato un modo semplice in questo link http://www.valcon.it/gamemaker/platform-game/ e sono anche riuscito ad usare gli sprite index senza bug e solo con le icone :banana: :banana: :banana: :metalgo: :metalgo: :metalgo:
anzi a dire il vero ci sarebbe ancora un piccolo bug quando lo sprite destro (lasciate perdere la grafica malfatta che e una prova) va in collisione col muro, vi invierei il file ma non mi lascia aggiungere estensioni
vi spiego meglio: nei due eventi dello sprite che va verso destra e verso sinistra ci sono scritte le stesse identiche cose ovvero if a relative position is collision free for only solid object jump to relative position. cambia in base a destra e sinistra dove la x e scritta col meno davanti e a destra col più, solo che quando vado verso destra contro un muro lo sprite inizia a tremare come se ci fosse un problema con le collisioni, mentre a sinistra questo non succede. ho controllato più e più volte ma quello che ho scritto e uguale in tutti e due gli eventi, suggerimenti?

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Platform fluido?

Messaggio da Alv »

Potrebbe esserci qualche altro evento che causa il movimento del player e lo fa tornare indietro verso sinistra (supposto che stia avanzando verso destra). Dovresti anche controllare la collision box...
Ultima modifica di Alv il 21/12/2020, 21:38, modificato 1 volta in totale.

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

Alv ha scritto:Potrebbe esserci qualche altro evento che causa il movimento del player e lo fa tornare indietro verso sinistra (supposto che stia avanzando verso destra). Dovresti anche controllare la collision box.
siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Information about object: sprite01
Sprite: sprite_right_3
Solid: true
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

set screen mode to: switch
Step Event:

COMMENT: Check whether in the air
if relative position (0,1) is collision free for Only solid objects
set the gravity to 1 in direction 270
else
set the gravity to 0 in direction 270
COMMENT: Limit the vertical speed
if vspeed is larger than 10
set the vertical speed to 10
Collision Event with object muro:

move in direction direction at most 10 till a contact with solid objects
set the vertical speed to 0
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right with subimage 0 and speed 1
Keyboard Event for Key:

if sprite_index is equal to sprite_left
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right_4 with subimage 0 and speed 1
Keyboard Event for A-key Key:

if relative position (-1,0) is collision free for Only solid objects
jump relative to position (-10,0)
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if relative position (-1,0) gives a collision with Only solid objects
set the sprite to sprite_left_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_left_2 with subimage 0 and speed 1
Keyboard Event for D-key Key:

if relative position (+1,0) is collision free for Only solid objects
jump relative to position (+10,0)
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if relative position (+1,0) gives a collision with Only solid objects
set the sprite to sprite_right_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_right_2 with subimage 0 and speed 1
Keyboard Event for W-key Key:

if relative position (0,1) gives a collision with Only solid objects
set the vertical speed to -15
if sprite_index is equal to sprite_left
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right_4 with subimage 0 and speed 1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
con lo sprite che va a sinistra non succede niente ma con quello a destra inizia a tremare. Credo ci sia un problema con il move to contact
Grazie ancora per la vostra pazienza!

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Platform fluido?

Messaggio da Alv »

AlexU2004 ha scritto:
Alv ha scritto:Potrebbe esserci qualche altro evento che causa il movimento del player e lo fa tornare indietro verso sinistra (supposto che stia avanzando verso destra). Dovresti anche controllare la collision box.
siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Information about object: sprite01
Sprite: sprite_right_3
Solid: true
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

set screen mode to: switch
Step Event:

COMMENT: Check whether in the air
if relative position (0,1) is collision free for Only solid objects
set the gravity to 1 in direction 270
else
set the gravity to 0 in direction 270
COMMENT: Limit the vertical speed
if vspeed is larger than 10
set the vertical speed to 10
Collision Event with object muro:

move in direction direction at most 10 till a contact with solid objects
set the vertical speed to 0
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right with subimage 0 and speed 1
Keyboard Event for Key:

if sprite_index is equal to sprite_left
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right_4 with subimage 0 and speed 1
Keyboard Event for A-key Key:

if relative position (-1,0) is collision free for Only solid objects
jump relative to position (-10,0)
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if relative position (-1,0) gives a collision with Only solid objects
set the sprite to sprite_left_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_left_2 with subimage 0 and speed 1
Keyboard Event for D-key Key:

if relative position (+1,0) is collision free for Only solid objects
jump relative to position (+10,0)
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if relative position (+1,0) gives a collision with Only solid objects
set the sprite to sprite_right_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_right_2 with subimage 0 and speed 1
Keyboard Event for W-key Key:

if relative position (0,1) gives a collision with Only solid objects
set the vertical speed to -15
if sprite_index is equal to sprite_left
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right_4 with subimage 0 and speed 1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
con lo sprite che va a sinistra non succede niente ma con quello a destra inizia a tremare. Credo ci sia un problema con il move to contact
Grazie ancora per la vostra pazienza!
Come mai non riesci a inviare l'allegato? Ti basta comprimere la cartella del progetto (gmx), fare l'upload su drive o qualche altro servizio e mandare il link. Così non ci capisco molto!
Ultima modifica di Alv il 05/12/2020, 19:29, modificato 1 volta in totale.

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

Nuova cartella.zip
ecco il file
(69.31 KiB) Scaricato 289 volte
Nuova cartella.zip
ecco il file
(69.31 KiB) Scaricato 289 volte
Alv ha scritto:
AlexU2004 ha scritto:
Alv ha scritto:Potrebbe esserci qualche altro evento che causa il movimento del player e lo fa tornare indietro verso sinistra (supposto che stia avanzando verso destra). Dovresti anche controllare la collision box.
siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Information about object: sprite01
Sprite: sprite_right_3
Solid: true
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

set screen mode to: switch
Step Event:

COMMENT: Check whether in the air
if relative position (0,1) is collision free for Only solid objects
set the gravity to 1 in direction 270
else
set the gravity to 0 in direction 270
COMMENT: Limit the vertical speed
if vspeed is larger than 10
set the vertical speed to 10
Collision Event with object muro:

move in direction direction at most 10 till a contact with solid objects
set the vertical speed to 0
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right with subimage 0 and speed 1
Keyboard Event for Key:

if sprite_index is equal to sprite_left
set the sprite to sprite_left_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_3 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_right_4 with subimage 0 and speed 1
Keyboard Event for A-key Key:

if relative position (-1,0) is collision free for Only solid objects
jump relative to position (-10,0)
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_2
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_left with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_left_2 with subimage 0 and speed 1
if relative position (-1,0) gives a collision with Only solid objects
set the sprite to sprite_left_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_left_2 with subimage 0 and speed 1
Keyboard Event for D-key Key:

if relative position (+1,0) is collision free for Only solid objects
jump relative to position (+10,0)
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_left_2
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left
set the sprite to sprite_right with subimage 0 and speed 1
if sprite_index is equal to sprite_right_4
set the sprite to sprite_right_2 with subimage 0 and speed 1
if relative position (+1,0) gives a collision with Only solid objects
set the sprite to sprite_right_3 with subimage 0 and speed 1
if relative position (0,1) is collision free for Only solid objects
set the sprite to sprite_right_2 with subimage 0 and speed 1
Keyboard Event for W-key Key:

if relative position (0,1) gives a collision with Only solid objects
set the vertical speed to -15
if sprite_index is equal to sprite_left
set the sprite to sprite_left_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_left_3
set the sprite to sprite_left_4 with subimage 0 and speed 1
if sprite_index is equal to sprite_right
set the sprite to sprite_right_2 with subimage 0 and speed 1
if sprite_index is equal to sprite_right_3
set the sprite to sprite_right_4 with subimage 0 and speed 1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
con lo sprite che va a sinistra non succede niente ma con quello a destra inizia a tremare. Credo ci sia un problema con il move to contact
Grazie ancora per la vostra pazienza!
Come mai non riesci a inviare l'allegato? Ti basta comprimere la cartella del progetto (gmx), fare l'upload su drive o qualche altro servizio e mandare il link. Così non ci capisco molto...

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Platform fluido?

Messaggio da Alv »

E' un problema con le collision box. Invece di definire la collision box per ogni singolo sprite del giocatore, ti conviene creare uno sprite maschera e associarlo all'oggetto player. In questo modo, la collision box dello sprite non avrà più importanza: sarà la mask a comandare. Così le collisioni le definisci una volta sola, in un solo sprite.

Lo sprite mask in genere è uno sprite rettangolare, che dovresti riempire di un colore (es. nero/rosso). La precisione non è importante in un platform: in genere si assume che il giocatore sia un rettangolo. Se usi una collision mask in questo modo, le collisioni avverranno come se il giocatore fosse un rettangolo.

Secondariamente, non hai bisogno di creare per ogni sprite del player verso destra il corrispettivo verso sinistra. Ti basta cambiare il valore della variabile image_xscale. Se la metti a -1, riflette orizzontalmente lo sprite; se la metti a 1 non riflette. Anche la mask viene riflessa, quindi devi centrare orizzontalmente l'origine della mask (es. se la mask è grande 50, l'origine dev'essere a 25), altrimenti rischi che, in caso di riflessione, la maschera vada a sovrapporsi al muro.

Poi: se vuoi fare spostare il giocatore a destra di 10 pixel, devi controllare se la posizione a destra di 10 pixel è libera, non di 1 pixel. Questo è molto importante perchè, se la posizione a destra di 1 pixel è libera, avverrà lo spostamento di 10 pixel, ma la posizione a destra di 10 pixel potrebbe essere occupata. Quindi il player si sovrapporrà al muro, e farà scattare l'evento collisione (cosa che noi non vogliamo, in quanto l'evento collisione dovrebbe verificarsi solo lungo l'asse y!).

Infine, quando assegni lo sprite, potresti fare un if con la negazione. Quindi, se lo sprite non è sprite_left_3, cambia lo sprite in sprite_left_3. Così ti viene molto più corto, non serve tutta la casistica!
Ultima modifica di Alv il 03/01/2021, 17:58, modificato 8 volte in totale.

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

Alv ha scritto:Lo sprite lo trovo carino! :)

E' un problema con le collision box. Ti do qualche dritta: invece di definire la collision box per ogni singolo sprite del giocatore, ti conviene creare uno sprite maschera e associarlo all'oggetto player. In questo modo la collision box dello sprite non avrà più importanza, sarà la mask a comandare. Così le collisioni le definisci una volta sola, in un solo sprite.

Lo sprite mask in genere è uno sprite rettangolare, che dovresti riempire di un colore (es. nero/rosso). La precisione non è importante in un platform, in genere si assume che il giocatore sia un rettangolo. Se usi una collision mask in questo modo, le collisioni avverranno come se il giocatore fosse un rettangolo.

Secondariamente, non hai bisogno di creare per ogni sprite del player verso destra il corrispettivo verso sinistra. Ti basta cambiare il valore della variabile image_xscale. Se la metti a -1, riflette orizzontalmente lo sprite, se la metti a 1 non riflette. Anche la mask viene riflessa, quindi devi centrare orizzontalmente l'origine della mask (es. se la mask è grande 50, l'origine dev'essere a 25), altrimenti rischi che, in caso di riflessione, la maschera vada a sovrapporsi al muro.

Poi: se vuoi fare spostare il giocatore a destra di 10 pixel, devi controllare se la posizione a destra di 10 pixel è libera, non di 1 pixel! Questo è molto importante, perchè se la posizione a destra di 1 pixel è libera, avverrà lo spostamento di 10 pixel. Ma la posizione a destra di 10 pixel potrebbe essere occupata. Quindi il player si sovrapporrà al muro, e farà scattare l'evento collisione (cosa che noi non vogliamo, in quanto l'evento collisione dovrebbe verificarsi solo lungo l'asse Y).

Inoltre: usi i blocchi di codice in maniera impropria. Se vuoi separare codice che ha una funzione da codice che ne ha un'altra, usa i commenti. Cose del tipo: "cambia lo sprite", "muove il player", etc. I blocchi hanno un'altra funzione, leggi nella guida!

Infine: quando assegni lo sprite, potresti fare un if con la negazione. Quindi se lo sprite non è sprite_left_3, cambia lo sprite in sprite_left_3. Così ti viene molto più corto, non serve tutta la casistica.
Grazie mille per la tua risposta! proverò a capire che cosa vuol dire.... :manual: :manual: (non sono molto esperto) comunque veramente utile grazie! :sisisi: :sisisi: :sisisi: :sisisi: comunque mi sono ispirato a gang garrison 2 per fare un gioco tipo post apocalisse zombie

AlexU2004
Newbie
Messaggi: 10
Iscritto il: 06/07/2018, 14:38
Specialità: musico
Uso: GameMaker 8.1
Contatta:

Re: Platform fluido?

Messaggio da AlexU2004 »

Alla fine ho risolto tutto, non era poi così difficile ma se uno non sa le cose è tutta un 'altra storia...

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Platform fluido?

Messaggio da Alv »

Bene, non dubitavo avresti risolto! :cappa:

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 49 ospiti