0
function ProcessCollisions():void{

//respawn if player died
if(percentHP == 0){
    Player.x = _startMarker.x;
    Player.y = _startMarker.y;
    Gun.x = Player.x;
    Gun.y = Player.y - 45;
    _boundaries.x = 0;
    _boundaries.y = 0;
    Player.vy = 0;
    currentHP = maxHP;
}
//when Player is Falling
if(Player.vy > 0){
    //Otherwise process collisions of boundaires
        var collision:Boolean = false;
        if(_boundaries.hitTestPoint(Player.x, Player.y, true)){collision = true;}
        if(collision == true){
            while(collision == true){
                Player.y -= 0.1;
                Gun.y -= 0.1;
                collision = false;
                if(_boundaries.hitTestPoint(Player.x, Player.y, true)){collision = true;}
            }
            trace("Collision is " + collision);
            currentHP -= Player.vy * .1
            Player.vy = 0;
            Gun.vy = 0;
            JumpCount = 0;
        }
}

}

私の衝突処理は上にあります...私は_boundaries内のオブジェクトと衝突しているときでさえ、衝突ブール値が常にfalseとして返されるというこの問題を抱えています。whileループが常にプレーヤーを境界から引き離し、プレーヤーが無限にその境界に陥っているように見えるため、プレーヤーに揺れの効果をもたらします...誰かがこれを手伝ってくれるでしょうか?また、Enter Frame Timerによって呼び出されるフレームハンドラーで、Player.vyにさらにいくつかの変更を加えます。これは以下に含まれています。

function FrameHandler(e:Event):void{
    //If Statements to slow character
    if(aKeyPressed == false && Player.vx > 0){
        Player.vx -= 1
    }
    else if(dKeyPressed == false && Player.vx < 0){
        Player.vx += 1
    }
    //Gravitates Player
     Player.vy += 1.5;
    //Controls arrays of bullets for Weapons
    //Process Collisions
    ProcessCollisions();
    //Scroll Stage
    scrollStage();
    //Attunes for multiple keypresses
    MultipleKeypresses();
    //Keeps Gun attached to Players Arm
    Gun.x = Player.x
    Gun.y = Player.y - 45;
    if(sKeyPressed){
        Gun.y = Player.y - 13;
        Gun.x = Player.x + 8;
    }
    //Checks Health
    updateHealthBar()
    //move Player and Gun
    Gun.y += Player.vy;
    Gun.x += Player.vx;
    Player.x += Player.vx;
    Player.y += Player.vy;

}
4

1 に答える 1

1

(1)は、ループtrace("Collision is " + collision);を離れたときにのみ実行されるため、トレースにのみ表示されます。while(collision == true)"Collision is false"

(2)衝突を検知したらPlayer.y -= 0.1;、プレイヤーを0.1刻みで上に動かし、衝突したものから0.1以上離れることはありません

次に、を設定Player.vy=0すると、次のフレームで1.5(by Player.vy += 1.5;)にリセットされPlayer.yます。これは1.5ずつ増加します...これにより、常に別の衝突が発生します。

編集:これを修正する方法は、必要な効果によって異なります。プレーヤーにトランポリンのようにオブジェクトを跳ね返らせたい場合は、に置き換えることができPlayer.vy = 0;ますPlayer.vy = -Player.vy;

または、プレーヤーをオブジェクトに着地させてそこにとどまらせるには、を更新する前に衝突の可能性をテストできますPlayer.y。このようなもの:

//move Player and Gun, if we're not about to collide
if(_boundaries.hitTestPoint((Player.x+Player.vx), (Player.y + Player.vy), true)==false){
    Player.y += Player.vy;
    Gun.y += Player.vy;
    Player.x += Player.vx;
    Gun.x += Player.vx;
} else {
    // we're about to collide: stop moving
    Player.vy = 0;
    Player.vx = 0;
}

vyこれは完璧な解決策ではありません。とによっては、プレーヤーがオブジェクトからある程度離れた場所に着地する可能性があるためvx、正確な衝撃点を特定し、停止する前にそこに移動することをお勧めします。

于 2012-05-10T22:55:44.643 に答える