2012-05-10 5 views
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; 
     } 
} 

}AS3衝突過程は絶えず私が衝突ブール値は、常に私は_boundaries内のオブジェクトと衝突していた場合にも偽として返され、この問題を持っている...偽

私の衝突処理は上記で返します。 whileループが常にプレーヤーを境界線から引き離し、プレーヤーが一見無限に落ちるように、私のプレーヤーに振る舞いを与えます。また、私は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; 

} 
+0

_boundariesは何ですか、サイズ設定はどこですか?キャラクターを揺さぶっている場合でも、ある時点で衝突=真の状態になっていなければなりません。そうでなければ、プレイヤーの位置を「修正」するループに入ることはありません – shaunhusain

+0

それでは、衝突は本当に戻ります。 "揺れ"を止める? _境界は、さまざまなオブジェクトを含むステージの約2倍のムービークリップです。これは、レベル設計で構成されています。 – Cory

答えて

1

あなたwhile(collision == true)ループを残してきた後、(1)trace("Collision is " + collision);のみ、実行されますので、以下に含まれますトレースに"Collision is false"が表示されます。

(2)衝突を検出すると、Player.y -= 0.1;は0.1のステップでプレーヤーを上方向に移動させますので、は、あなたがと衝突したものから0.1を超えることはありません。

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

EDIT:これを修正する方法は、あなたが望む効果によって異なります:プレーヤーがトランポリンのようにオブジェクトから跳ね返るようにする場合は、を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; 
} 

これは完璧なソリューションではありません。それはプレイヤーがvyvxに応じて、対象物からある程度の距離を着陸させることがあり、その改良は、インパクトの正確なポイントを動作するようになります、停止する前にそこに移動します。

+0

Richardに感謝します。それは理にかなっている。私が選ぶより良い方法がありますが、衝突中に重力をオフにしますか? whileループでvy = 0に設定するのは簡単ですか?申し訳ありませんが、初心者のプログラマです。 – Cory

+0

それは依存しています - 私の編集された答えを見てください... –

+0

さて、私は彼が着陸し、誰かが地面に着陸するような物の上にとどまるようにします。私はPlayerの前でif文を動かしました。 - = .1しかし、今では "揺れ効果"が遅くなります。私はそれが重力のために常にオブジェクトに文字を引っ張っていると思うし、ループが常に修正されている間、それはあまり目立たないようにする方法ですか? if(collision == true)文とPlayer.vy = 0でなければならない。オブジェクトと接触しているときに私の重力をゼロにする?再び、助けをありがとう – Cory

関連する問題