La funzione move_contact_solid di Game Maker è estremamente potente per la creazione di giochi di ogni tipo, dai platform ai top-down. Una grave limitazione purtroppo consiste nel fatto che la funzione non è in grado di effettuare spostamenti decimali. Esempio: move_contact_solid(0,1.3) >> La parte decimale viene ignorata, e il giocatore si muoverà ogni step di 1 pixel netto. Questa limitazione può risultare molto grave nel caso di giochi con accelerazioni/decelerazioni molto graduali, o comunque in generale con giochi ad alto framerate.
Questi 2 script, per i quali ho speso un sacco di tempo a scervellarmi, risolvono il problema, consentendo una precisione al centesimo di pixel.
Script xprec:
Codice: Seleziona tutto
if (!variable_local_exists("xpre")) xpre=50;
var newp,velo;
newp=x*100+xpre+argument0*100;
velo=floor(newp/100)-x;
if (velo>0) move_contact_solid(0,velo);
else if (velo<0) move_contact_solid(180,-velo);
xpre=newp-floor(newp/100)*100;
Script yprec:
Codice: Seleziona tutto
if (!variable_local_exists("ypre")) ypre=50;
var newp,velo;
newp=y*100+ypre+argument0*100;
velo=floor(newp/100)-y;
if (velo>0) move_contact_solid(270,velo);
else if (velo<0) move_contact_solid(90,-velo);
ypre=newp-floor(newp/100)*100;
Basta passare agli script lo spostamento in pixel. Ovviamente, xprec è per il movimento sull'asse x, yprec per l'asse y. Scomporre il moto nelle 2 componenti è estremamente utile per semplificare problemi relativi alle collisioni.