Eine schnell und einfach implementierte Physik bzw Collisions-Erkennung und -Behandlung ist eine wie in dem recht bekannten Spiel "Super Mario". Man kann von unten durch Platformen durchspringen, und beim runterfallen drauf landen.

Z.b. kann man in den Platform Movie-Clips mit

public var l,r,t,b : Number; // left,right,top,bottom
...
var bounds:Object = this.getBounds(_parent);
l = bounds.xMin;
r = bounds.xMax;
t = bounds.yMin;
b = bounds.yMax;

(z.b. im Construktor) die Bounding-Box des Movie-Clips "this" im Coordinaten-System vom "_parent" auslesen, und in Member-Var speichern.

Ausserdem registrieren sich die Platformen in einem globalen Array in _root.gBlocker damit man von überall aus drauf zugreiffen kann.

Im Spieler-Objekt speichert man die geschwindigkeit als vx und vy.

Die "Step" methode des Spieler-Objekts schaut dann in etwa so aus :

public function Step() {
   isOnGround = false; // if there is no collision later, we are airborne
   
   // apply gravity and friction
   vy += GRAVITY; // 0.981 -> 10 pixel ~ 1m 
   vx *= FRICTION_RUN; // 0.8 : stop fast if not running 
   
   // subdivide movement so we don't miss any collisions when moving fast
   var vlen = Math.sqrt(vx*vx+vy*vy); // calculate the length of the velocity vector
   var steps = Math.ceil(vlen/MAXMOVEPERFRAME); // MAXMOVEPERFRAME = 3 (pixel, can also be set to radius of player figure)
   var t;
   for (t=0;t<steps;++t) {
      // apply velocity
      _x += vx/steps;
      _y += vy/steps;
      
      // do collision
      if (vy >= 0) { // only when moving down
         var o;
         for (var i in _root.gBlocker) { //  iterate over all platforms
            o = _root.gBlocker[i];
            if (_x >= o.l && _x <= o.r &&
               _y >= o.t && _y <= o.b) {
               _y = o.t; // set player position  on top of platform
               vy = 0.0; // stop moving down
               isOnGround = true; // enable ground controlls (jump)
            }
         }
      }
   }
      
   // run left and right = accellerate in x direction
   if(Key.isDown(Key.LEFT))            vx -= 2.0;
   if(Key.isDown(Key.RIGHT))            vx += 2.0;
   
   // jump = SET (not accel) velocity in y direction  (negative = up)
   if(isOnGround && Key.isDown(Key.UP))   vy = -12.0;
}

Das Abbremsen geschieht über Reibung (englisch friction).

-- RobertNoll - 30 May 2006
Topic revision: r1 - 30 May 2006, RobertNoll
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Medieninformatik-Wiki? Send feedback