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.