Inizio con la pagina nuovamente vergine. Adesso non dovrei fare più gran fatica per ricostruire lo schema che permette l'individuazione delle collisioni.
function OnMouseMove(){ oggetto.style.left=(event.clientX-spiazzamentoX)+"px"; oggetto.style.top=(event.clientY-spiazzamentoY)+"px"; }Questa è la funzione che va modificata.
In pratica, devo riscrivere da capo il semplice codice che mi fa individuare le collisioni, che ormai credo di aver imparato a sufficienza...
Ci provo...
Mi dichiaro le variabili globali che mi servono per memorizzare la posizione precedente delle coordinate dell'oggetto:
var prevDex; var prevSin; var prevAlt; var prevBas;E poi vado alla funzione per modificarla.
Innanzitutto memorizzo la posizione dell'oggetto prima del movimento.
function OnMouseMove(){ prevDex=destro(oggetto); prevSin=sinistro(oggetto); prevAlt=alto(oggetto); prevBas=basso(oggetto); oggetto.style.left=(event.clientX-spiazzamentoX)+"px"; oggetto.style.top=(event.clientY-spiazzamentoY)+"px"; }Ora devo individuare i "corridoi", ossia le sovrapposizioni...
Spezziamo queste in due funzioni: una che individua la posizione nell'ambito della proiezione dell'ostacolo e una che individua lo sconfinamento dell'oggetto oltre il margine dell'ostacolo.
Funzione overH, che individua la sovrapposizione sul piano orizzontale, e overV, sul piano verticale
function overH(obj,ost){ if(basso(obj)>=alto(ost) && alto(obj)<=basso(ost)){ return true; } else { return false; } } function overV(obj,ost){ if(destro(obj)>=sinistro(ost) && sinistro(obj)<=destro(ost)){ return true; } else { return false; } }
Ho costruito, valendomi di overH e overV, le funzioni daAlto, daBasso, daDestra e daSinistra:
function daSinistra(obj,ost){ if(overH(obj,ost) && destro(obj)>sinistro(ost)){ return true; } else { return false; } } function daDestra(obj,ost){ if(overH(obj,ost) && sinistro(obj)<destro(ost)){ return true; } else { return false; } } function daAlto(obj,ost){ if(overV(obj,ost) && basso(obj)>alto(ost)){ return true; } else { return false; } } function daBasso(obj,ost){ if(overV(obj,ost) && alto(obj)<basso(ost)){ return true; } else { return false; } }E adesso passo a modificare tutta la funzione OnMouseMove:
function OnMouseMove(){ prevDex=destro(oggetto); prevSin=sinistro(oggetto); prevAlt=alto(oggetto); prevBas=basso(oggetto); oggetto.style.left=(event.clientX-spiazzamentoX)+"px"; oggetto.style.top=(event.clientY-spiazzamentoY)+"px"; if(prevDex<=sinistro(ostacolo) && daSinistra(oggetto,ostacolo)){ oggetto.style.left=(sinistro(ostacolo)-larghezza(oggetto))+"px"; } else if(prevSin>=destro(ostacolo) && daDestra(oggetto,ostacolo)){ oggetto.style.left=(destro(ostacolo))+"px"; } else if(prevAlt<=alto(ostacolo) && daAlto(oggetto,ostacolo)){ oggetto.style.top=(alto(ostacolo)-altezza(oggetto))+"px"; } else if(prevBas>=basso(ostacolo) && daBasso(oggetto,ostacolo)){ oggetto.style.top=(basso(ostacolo))+"px"; } }che funziona egregiamente! L'ostacolo è solido come un mattone, l'oggetto non gli passa assolutamente attraverso!
Il bug si manifesta quando gli ostacoli sono più di uno, e forse ragionando ho capito bene perchè
Nessun commento:
Posta un commento