Frage

Im arbeitet derzeit ein Flash-Jump'n'Run-Engine auf machen ... aber meine Kollision erkennen braucht einige ernsthafte Hilfe. Jedes Mal, wenn mein Charakter ‚springt‘, und landet auf dem Kollisionsobjekt, er etwa auf halbem Weg durch sie für einen Bruchteil einer Sekunde geht, dann geht wieder nach oben (wo ich ihn sein will). Wenn ich weiterhin mehrere Male springen, um den Schatten von ihm, wenn man so will, das erscheint für den Bruchteil geht Sekunde weiter und weiter in die Kollisionsobjekt, schließlich macht ihn den ganzen Weg durch sie fallen. Hier ist der Code für meine Hauptklasse, und wenn Sie mich brauchen, etwas zu klären, fragen Sie bitte.

package {


import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.Stage;
import Player;
import HitObject;

public class TestGame extends MovieClip {

    private var _hitObject:HitObject; 
    private var _player:Player;
    private var _leftArrow:Boolean;
    private var _rightArrow:Boolean;
    private var _upArrow:Boolean;
    private var _hit:Boolean;
    private var _fall:Boolean;
    private var _jump:Boolean = true;
    private var _velR:Number = 0;
    private var _velL:Number = 0;
    private var _scale:Number = .1;
    private var _jumpCount:Number = 0;
    private var _i:Number = .5;
    private var _i2:Number = 7;
    private var _i3:Number = 0;
    private var _adjustHit:Number;
    private var _jumpRL:Number;
    private var _jumpVel:Number;

    public function TestGame() {
        _hitObject = new HitObject();
        _player = new Player();
        addChild(_hitObject);
        addChild(_player);
        _hitObject.x = (stage.width * 0.5) + 50;
        _hitObject.y = (stage.height * 0.5) + 150;
        _hitObject.scaleY = 3;
        _hitObject.alpha = .5;
        _player.scaleX = _scale;
        _player.scaleY = _scale;
        _player.x += 200;
        _player.y += 250;
        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
    }

    private function enterFrameHandler(e:Event) {
        if(_player.hitTestObject(_hitObject)) {
            _adjustHit = _hitObject.y - _hitObject.height/2 - _player.height/2;
            _player.y = _adjustHit;
            _hit = true;
            _jump = false;
            if(_i3 > 8) {
            _jump = true;
            }
            _jumpCount = 0;
            _i2 = 7;
            _fall = false;
            _i3++;
        }

        else if(!_player.hitTestObject(_hitObject) && !_upArrow) {
            _fall = true;
        }


        if(_fall) {
            _player.y += _i;
            _i += .5;
            if(_i < 3) {
                _i = 3;
            }
            _hit = false;
        }
        if(_upArrow && _hit && _jump) {
            if(_velR > 0) {
                _jumpRL = _velR;
                _jumpVel = _velR;
            }
            else if(_velL > 0) {
                _jumpRL = -_velL;
                _jumpVel = _velL;
            }
            else {
                _jumpVel = 1;
                if(_player.scaleX == .1) {
                    _jumpRL = 1;
                }
                else {
                    _jumpRL = -1;
                }
            }

            _player.y -= _i2 + _jumpVel/2;
            _player.x += _jumpRL/2;
            _jumpCount += _i2;
            _i2 -= .5;
            _fall = false;
            if(_i2 < -3) {
              _jumpCount = 61;
            }
            if(_jumpCount > 60) {
                _i2 = 7;
                _jump = false;
                _fall = true;
                _jumpCount = 0;
            }
            _i3 = 0;
        }
        if(_rightArrow) {
            _player.startRun();
            _player.scaleX = _scale;
            _velL = 0;
            _player.x += _velR;
            if(_velR < 20) {
                _velR += 2;
            }
            if(_velR > 20) {
                _velR = 20;
            }  
        }

        else if(_leftArrow) {
            _player.startRun();
            _player.scaleX = -_scale;
            _velR = 0;
            _player.x -= _velL;
            if(_velL < 20) {
                _velL += 2;
            }
            if(_velL > 20) {
                _velL = 20;
            }  
        }

        if(_velR > 0) {
        _player.x += _velR;
        _velR -= .7;
        }
        else if(_velL > 0) {
        _player.x -= _velL;
        _velL -= .7;
        }
        if(_velR < 0 || _velL < 0) {
            _velR = 0;
            _velL = 0;
        }
    }

    private function keyDownHandler(e:KeyboardEvent):void {
        if(e.keyCode == 39) {
        _rightArrow = true;
        }
        if(e.keyCode == 37) {
        _leftArrow = true;
        }
        if(e.keyCode == 38) {
        _upArrow = true;
        }
    }
    private function keyUpHandler(e:KeyboardEvent):void {
        _upArrow = false;
        _rightArrow = false;
        _leftArrow = false;
    }
}

}

War es hilfreich?

Lösung

Wenn Sie nur leicht zu bedienende Kollisionserkennung wollen, werfen Sie einen Blick auf die Collision Detection Kit für Actionscript 3. habe ich es vor und es schlägt alle anderen Kollisionserkennung Framework verwendet die ich je benutzt habe.

Andere Tipps

Für alle, mit diesem Problem, stellen Sie sicher, dass Sie eine Kraft in Reaktion auf Kollision zusätzlich Anlegen eines Zusammenstoßes Neupositionierung aus. Dieser Fall klingt wie vielleicht wird die Geschwindigkeit durch die Schwerkraft zusammengesetzt werden, so dass Sie das Objekt wieder in Bewegung bleiben, aber es ist Geschwindigkeit wird auf Null gesetzt nicht zu werden, so dass es mit jedem Update Schritt weiter und weiter in den Boden bewegt.

Normalkraft Anwendung wird die Schwerkraft aufheben und diese beheben.

Von dem, was Sie gesagt haben, es klingt wie zum Zeitpunkt ‚t‘ der Spieler hat das Objekt nicht getroffen, als noch nicht, aber zum Zeitpunkt ‚t + 1‘ der Spieler 10px bewegt hat (zum Beispiel), so erscheint nun fest in dem Objekt, bis Ihre Kollision Handler den Player an der richtigen Stelle bewegt.

Auch mit dem Springen nach oben und unten vielleicht hat der Spieler nicht korrekt nach einer Kollision vor seinem Lageinkrementen verschoben weshalb im Laufe der Zeit ist der Spieler schließlich fällt durch, wenn Sie Springen halten.

Seien Sie vorsichtig, um Zahlen zu vergleichen. Ich sehe ein, wenn (_player.scaleX == 0,1). Die Zahlen in AS3 Gleitkommazahlen in anderen Sprachen genannt. Aufgrund der Art und Weise Gleitkommazahlen vom Computer verarbeitet werden, können sie irreführende Ergebnisse liefern. Manchmal ist ein Wert wie 1,0 ist wirklich 0,999998 und wenn das der Fall ist eine Vergleichsrechnung wird immer scheitern.

Als Tipp Sie könnten einige der Werte zu CONST ändern möchten, wie Sie eine Menge fest einprogrammiert Werte haben, einige, die verwandt sind und leichter geändert werden könnte, indem sie eine CONST zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top