Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
==============================================================
Sistema di movimento del personaggio
==============================================================
--------------------------------------------------------------
Gestione dell'input utente
--------------------------------------------------------------
In base a quanto detto, alla pressione dei tasti 'RIGHT' e
'LEFT', 'xvect' deve essere incrementato o decrementato di una
quantità uguale alla velocità del personaggio espressa in
pixel/frame il cui valore è memorizzato nella costante
'speed':
> if (Key.isDown(Key.RIGHT)) xvect+=speed;
> if (Key.isDown(Key.LEFT)) xvect-=speed;
--------------------------------------------------------------
Collisioni
--------------------------------------------------------------
Come accennavo poc'anzi la funzione che gestisce le collisioni
è 'hitTest()'. Le collisioni da prendere in considerazione
sono quelle con il movieClip 'ground', che contiene i
pavimenti, le mura e via discorrendo, cioè tutto ciò che al
personaggio non è consentito di attraversare.
All'interno di 'player', vi sono ben 5 movieClip figli che si
occupando delle collisioni:
- 'D': collisioni sull'asse y
- 'R' e 'L': collisioni sull'asse x
- 'br' e 'bl': collisioni sull'asse x (con superfici
oblique)
--------------------------------------------------------------
Fisica
--------------------------------------------------------------
Per quanto riguarda la forza di gravità:
> if (!_root.ground.hitTest(this.d._x+_x, this.d._y+_y,
true)) yvect+=gforce;
cioè 'yvect' viene incrementato di una costante 'gforce'
contenente il valore dell'accelerazione di gravità.
--------------------------------------------------------------
Movimento
--------------------------------------------------------------
Dato che il movimento si arresta quando viene verificata la
collisione, per evitare che questo si arresti solo quando
ormai il 'player' ha già "sfondato" il 'ground', all'interno
di ogni frame, il movimento previsto da 'xvect' viene
scomposto in tanti piccoli movimenti unitari, alla fine di
ognuno dei quali viene effettuato 'hitTest()'.
--------------------------------------------------------------
Codice integrale
--------------------------------------------------------------
/*
Source code developed by Giuseppe Antonio Nanna
*/
onClipEvent (load) {
gforce = 2;
jump = 20;
friction = .6;
speed = 3;
yvect=0;
xvect=0;
}
onClipEvent (enterFrame) {
if ((_root.ground.hitTest(this.d._x+_x, this.d._y+_y,
true)||_root.ground.hitTest(this.bl._x+_x, this.bl._y+_y,
true)||_root.ground.hitTest(this.br._x+_x, this.br._y+_y,
true) )&& Key.isDown(Key.UP) ) yvect=-jump;
if (!_root.ground.hitTest(this.d._x+_x, this.d._y+_y,
true)) {
dvar=1;
yvect+=gforce;
} else if (yvect>0) yvect=0;
c=0;
while (!_root.ground.hitTest(this.d._x+_x, this.d._y+_y,
true) && c<yvect) {
_y++;
c++;
}
if (yvect<0) _y+=yvect;
if (Key.isDown(Key.RIGHT)) xvect+=speed;
if (Key.isDown(Key.LEFT)) xvect-=speed;
xvect*=friction;
}