Platform fluido?
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Platform fluido?
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..)
Re: Platform fluido?
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
per fare quello che descrivi hai bisogno di alcuni if che non sono tanto gestibili con le icone

-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
Grazie del chiarimento, ci proverò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
- 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?
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):
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.
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
Grazie per aver chiarito!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







-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
[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
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
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
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?AlexU2004 ha scritto: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 estensioniAlexU2004 ha scritto:Grazie per aver chiarito!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 ycomunque 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
![]()
![]()
![]()
![]()
![]()
- 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?
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.
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)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.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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!
- 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?
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!AlexU2004 ha scritto:siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)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.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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!
Ultima modifica di Alv il 05/12/2020, 19:29, modificato 1 volta in totale.
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
Alv ha scritto: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...AlexU2004 ha scritto:siccome non sono capace di inviarvi l'allegato del gioco, vi invio le informazioni dell oggetto (gia controllate le collisioni, non centrano)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.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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!
- 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?
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!
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.
-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
Grazie mille per la tua risposta! proverò a capire che cosa vuol dire....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.






-
- Newbie
- Messaggi: 10
- Iscritto il: 06/07/2018, 14:38
- Specialità: musico
- Uso: GameMaker 8.1
- Contatta:
Re: Platform fluido?
Alla fine ho risolto tutto, non era poi così difficile ma se uno non sa le cose è tutta un 'altra storia...
Chi c’è in linea
Visitano il forum: Nessuno e 27 ospiti