0

私は現在、フラッシュプラットフォーマーエンジンの作成に取り組んでいます...しかし、私の衝突検出にはいくつかの深刻な助けが必要です。私のキャラクターが「ジャンプ」して衝突オブジェクトに着地するたびに、彼はその中途半端に一瞬進み、次にトップに戻ります(私が彼になりたい場所)。私が何度もジャンプし続けると、あなたがそうするのであれば、一瞬だけ現れる彼の影が衝突オブジェクトにどんどん入り込み、最終的に彼はそれを完全に通り抜けてしまいます。これが私のメインクラスのコードです。何か明確にする必要がある場合は、質問してください。

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;
    }
}

}

4

3 に答える 3

3

この問題を抱えている人は、衝突からの再配置に加えて、衝突に応じて力を加えていることを確認してください。この場合、速度が重力によって合成されているように聞こえます。つまり、オブジェクトを後方に移動し続けますが、速度はゼロにされていないため、更新ステップごとに床にさらに移動します。

法線力を加えると重力がキャンセルされ、これが修正されます。

于 2011-12-08T17:26:07.423 に答える
2

使いやすい衝突検出が必要な場合は、Actionscript 3用の衝突検出キットをご覧ください。これまでに使用したことがあり、これまでに使用した他のすべての衝突検出フレームワークに勝っています。

于 2009-10-17T18:10:42.550 に答える
1

あなたが言ったことから、時間't'の時点では、プレーヤーはまだオブジェクトにヒットしていませんが、時間' t + 1'の時点では、プレーヤーは10px移動しているため、衝突ハンドラーまでオブジェクトにスタックしているように見えます。プレーヤーを正しい場所に移動します。

また、上下にジャンプすると、衝突後、位置が増加する前にプレーヤーが正しく戻されなかった可能性があります。そのため、ジャンプを続けると、時間の経過とともにプレーヤーは最終的に失敗します。

数字の比較には注意してください。if(_player.scaleX == .1)が表示されます。AS3の数値は、他の言語では浮動小数点数と呼ばれます。浮動小数点数の処理方法が原因で、誤解を招く結果が生じる可能性があります。1.0のような値が実​​際には0.9999998である場合があり、その場合、compareステートメントは常に失敗します。

ヒントとして、ハードコードされた値が多数あるため、一部の値をCONSTに変更することをお勧めします。一部の値は関連しており、CONSTにすることで簡単に変更できます。

于 2009-10-18T02:46:17.847 に答える