Avatar utente
ElBebo
Membro
Messaggi: 138
Iscritto il: 16/09/2012, 12:40
Specialità: Programmazione
Uso: GM:Studio 1.4 Android
Località: Rimini
Contatta:

Pavimento obliquo in un platform

Messaggio da ElBebo »

Salve a tutti utenti del forum, sto scrivendo un platform e mi piacerebbe permettere al giocatore di poter camminare anche su piani leggermente inclinati. Quale codice dovrei usare? Per i movimenti orizzontali in se non c'é alcun problema, ma gestire la velocitá verticale e porre le condizioni giuste non mi é ancora molto chiaro. Il risultato che vorrei ottenere é semplice e chiaro, é come ció che avviene in Super Mario World per intenderci.

Grazie a tutti in anticipo! :P
Arcade Blues
Newbie
Messaggi: 47
Iscritto il: 09/01/2016, 12:05
Specialità: Sogno a occhi aperti
Uso: GM:Studio 1.4 Master
Località: Napoli
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da Arcade Blues »

Se conosci l'inglese internet è pieno di esempi del genere per game maker e non.
Mi vengono in mente i due tutorial del gioco n+ sulle collisioni tramite separating axis e il tutorial sulla fisica di sonic sul sito sonic retro , ma non so se facciano al caso tuo sono esigenze molto diverse da quelle di mario world, ma sicuramente buon materiale di lettura anche solo per curiosità.
Per darti invece direzioni precise rispetto al tuo progetto servirebbero ulteriori dati (es se usi la fisica interna di gm o tua custom), come usi gestire le collisioni.
In extrema ratio puoi sempre fare affidamento a qualche contenuto a pagamento del marketplace yoyo.
Per super mario c'è anche online un clone fatto in game maker open source se ti piace vincere facile.
Avatar utente
ElBebo
Membro
Messaggi: 138
Iscritto il: 16/09/2012, 12:40
Specialità: Programmazione
Uso: GM:Studio 1.4 Android
Località: Rimini
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da ElBebo »

Per la fisica ho preferito creare la mia customizzata. Le mie collisioni funzionano con i seguenti codici:

Per le collisioni orizzontali:

Codice: Seleziona tutto

if !place_free(x+hspeed,y)
 {
  if hspeed < 0
   {
    move_contact(180)
    hspeed=0
   }
    else
   {
    if hspeed > 0
     {
      move_contact(0)
      hspeed=0
     }
   }
 }
Per le collisioni verticali:

Codice: Seleziona tutto

if !place_free(x,y+vspeed)
 {
  if vspeed > 0
   {
    move_contact(270)
    vspeed=0
   }
    else
   {
    if vspeed < 0
     {
      move_contact(90)
      vspeed=0
     }
   }
 }
E per gli eccezionali casi in cui la maschera va ad incastrarsi negli spigoli:

Codice: Seleziona tutto

if !place_free(x,y)
 {
  if vspeed > 0
   {
    move_contact(90)
    vspeed=0
   }
  else
   {
    if vspeed < 0
     {
      move_contact(270)
      vspeed=0
     }
   }
 } 
Ad ogni modo ti ringrazio per l'aiuto Arcade Blues, andró sicuramente a cercare le risorse che mi hai consigliato! :cappa: :manual:
Avatar utente
ElBebo
Membro
Messaggi: 138
Iscritto il: 16/09/2012, 12:40
Specialità: Programmazione
Uso: GM:Studio 1.4 Android
Località: Rimini
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da ElBebo »

Per chi fosse interessato alla soluzione.

Ho risolto scrivendo questo codice insieme allo script di movimento orizzontale:

Codice: Seleziona tutto

if gravity = 0 //In un' altra parte del codice viene annullata la gravitá nel caso il personaggio che si muove sia a terra.
 {
  for (i=1; i <= v.stair_height; i++) //"stair_height" é la variabile dell' oggetto "v" 
   {                                  //(che gestisce tutte le mie variabili) e specifica l'altezza massima da poter superare.
    if !place_free(x+hspeed,y) && place_free(x+hspeed, y-i)
     {
      y-=i
      i=v.stair_height //Si esce dal ciclo.
     }
   }
 }
Arcade Blues
Newbie
Messaggi: 47
Iscritto il: 09/01/2016, 12:05
Specialità: Sogno a occhi aperti
Uso: GM:Studio 1.4 Master
Località: Napoli
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da Arcade Blues »

c'è un errore nel codice if gravity = 0 e non gravity == 0;

Mi potrei sbagliare, ma nell' ultimo listato, potresti salvare circa la metà delle chiamate a place_free tramite rifattorizzazione del codice visto che se il primo risultato non fosse vero ciclo successivo saresti uscito nel precedente.

Provo ad abbozzare un codice

Codice: Seleziona tutto

if(gravity == 0 && !place_free(x+hspeed,y))
{
    var i = 1;
    var x2check = x+hspeed;
    while( i <= v.stair_height && !place_free(x2check, y-i) )
    {
        ++i;
    }       
    if(place_free(x2check, y-i))
    {
        y-=i;
    }
}
Dovrebbe essere equivalente.
ho messo anche una variabile x2check per un vecchio vizio , sicuramente è inifluente o cmq ridicolo paragonato ai place_free() mancanti;
Un altra cosa che dovresti verificare se è il caso è la velocità del personaggio quando sale perchè nel caso di un inclinazione ad esempio di 45 gradi la velocità lineare considerato x e y è maggiore della normale velocità lineare in piano.

edit ho portatofuori dal loop l'ultimo if perchè era stato messo all' interno per una svista(nessun place free risparmiato) ora è corretto.
Conservativamente ho voluto fare l'ultimo check non so se è evitabile e puoi dare direttamente il valore alla y.
Avatar utente
ElBebo
Membro
Messaggi: 138
Iscritto il: 16/09/2012, 12:40
Specialità: Programmazione
Uso: GM:Studio 1.4 Android
Località: Rimini
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da ElBebo »

scusa Arcade Blues se non ho risposto, mi era completamente saltato di mente! :spat:

Ho aggiunto una parentesi tonda alla fine della tua riga numero 9, e nella riga 4 rinominando la variabile "xcheck", il codice funziona senza problemi!
A proposito della velocitá lineare non ci avevo minimamente pensato, in generale nei giochi platform che tu sappia é frequente che la velocitá sia ricalcolata per concordare con l'angolazione del piano?
Arcade Blues
Newbie
Messaggi: 47
Iscritto il: 09/01/2016, 12:05
Specialità: Sogno a occhi aperti
Uso: GM:Studio 1.4 Master
Località: Napoli
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da Arcade Blues »

per quanto riguarda le sviste , correggo subito.

Per la velocità storicamente si è visto di tutto.Ci sono stati anche fps in cui si andava piu' forte camminando in diagonale quindi nessuno griderà allo scandalo.
Oggi generalmente si usano molto i vettori (purtroppo non esistono nativamente in gm) quindi è molto comune dare una normalizzazione al vettore velocità e moltiplicare per il valore desiderato che puo' anche variare in base alle situazioni(es. la corsa che potrebbe essere progressiva o velocità maggiori in discesa).
Altre volte ho visto usare riproiezioni del vettore velocità lungo il piano di collisione che invece comporta altre particolarità dipendentemente pure da quante forze tieni in considerazione quando muovi il personaggio (es se tieni in considerazione la gravità anche quando il personaggio è grounded.Tutto questo per dire che non c'è una regola fissa.
La regola generale è testare qualsiasi cosa credi che abbia un potenziale e mettere quello che i testers preferiscono in quanto la fisica nei platform è totalmente al servizio del gameplay , quindi non mi sentirei di consigliare qualcosa solo perchè piu fisicamente corretto in un contesto del genere.
Avatar utente
ElBebo
Membro
Messaggi: 138
Iscritto il: 16/09/2012, 12:40
Specialità: Programmazione
Uso: GM:Studio 1.4 Android
Località: Rimini
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da ElBebo »

Penso tu abbia completamente ragione, in particolare mi ha colpito quando hai scritto che la fisica nei platform é totalmente al servizio del gameplay.
Ti ringrazio molto dei tuoi consigli, che utilizzeró insieme ai miei collaboratori per il progetto a cui stiamo lavorando, spero avremo nuovamente modo di scriverci qui sul forum!
Avatar utente
Alv
Membro
Messaggi: 131
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Pavimento obliquo in un platform

Messaggio da Alv »

Immagine

Ho realizzato un semplice esempio editabile e commentato. Download:
http://alv90.altervista.org/stor/terreno.gmk