2016-04-24 15 views
0

私はキャラクタージャンプに成功しましたが、プラットフォームの上部には完全な衝突しかありませんが、浮動プラットフォームの底面に当たったとき、プラットフォームを通過し、プレイヤーはこれらのプラットフォームの端から落ちます。代わりに、彼はインスタンスのy軸で動作します。また、ゲームが最初に始まったとき、プレーヤーは特定のy座標で空中で走っています。とにかく私は問題を取り消すことができますか?これを0にAs3ジャンプ衝突問題

if(multiplePlatforms.hitTestPoint(warMage.x,warMage.y , true))//Check if the player hits any platforms in the array 
       { 
        warMage.y --;//Place the character a pixel above the platforms 
        grav = 0;//Gravity isnt applied 
        vsp = 0; 
        jumped = false; 

       } 
      } 

これはプラットフォーム上warmageを移動し、重力(およびVSP)を設定します彼:

import flash.events.KeyboardEvent; 
import flash.events.Event; 
import flash.text.engine.EastAsianJustifier; 
import flash.sensors.Accelerometer; 

var Key:KeyObject = new KeyObject(stage);//Help the stage checks for keypressed objects   
//Initialized variable integers 
var hsp:Number = 0;// horizontal speed 
var vsp:Number = 0;// vertical speed 
var grav:Number = 2;//Gravity 
var fric:Number = 4//Friction 

//Arrays list for platforms 


//All Booleans 
var lDown:Boolean = false; 
var rDown:Boolean = false; 
var jumped:Boolean = false; 
var attacking:Boolean = false; 

warMage.gotoAndStop("idleWarmage");//Initially starts at idle state 
stage.addEventListener(Event.ENTER_FRAME, keyPressed);//Listens for buttons pressed 
stage.addEventListener(Event.ENTER_FRAME, gameloop);// The physics applied to character 
stage.addEventListener(Event.ENTER_FRAME, platformCollision); 

function keyPressed(e:Event):void 
{ 
if(Key.isDown(Key.LEFT))//If we pressed the left arrow button 
    { 
     lDown = true;//Condition to check if player is in running state 
     if(lDown = true)//If we are running left 
      { 
      warMage.x -= 15;//Move left 
      warMage.gotoAndStop("RunWarmage");//Play the running animation 
      warMage.scaleX = -1;//Flip the image scale 
      } 
    }else if(Key.isDown(Key.RIGHT))//If we pressed the right arrow button 
    { 
     rDown = true;//Condition to check if player is in running state 
     if(rDown = true)//If we are moving right 
      { 
      warMage.x += 15;//Move the position right 
      warMage.gotoAndStop("RunWarmage");//Play the animation 
      warMage.scaleX = 1//Face right 
      } 
    }else if(Key.isDown(Key.SPACE))//If we press the spacebar 
     { 
      warMage.gotoAndStop("AttackWarmage");//Play teh attack animation 
      warMage.x += 5; //Lunge right 
      if(warMage.scaleX == -1)//If we are initially facing left 
       { 
        warMage.x -= 10;//Lunge left 
       } 

     }else if(Key.isDown(Key.UP) || jumped == true)//If we press the up arrow or we've jumped 
      { 

       vsp = -25;;//vertical speed goes up to 20 
       jumped = true;//We know that player has jumped 
       warMage.gotoAndStop("JumpWarmage");//Play teh jump animation 

      }else if(jumped == false)//If we're not jumping 
      { 
       warMage.gotoAndStop("idleWarmage");//Return to idle position 
      } 
    } 

function gameloop(e:Event)//This checks the laws per frame 
{ 

    if(warMage.x < 0)//Sets room boundaries for left 
    { 
     warMage.x = 0; 
    } 
if(warMage.x > 1000)//Sets room boundaries for right 
    { 
     warMage.x = 1000; 
    } 

} 

function platformCollision(e:Event):void//Collision for the platforms 
{ 
      vsp += grav; 
      if(!multiplePlatforms.hitTestPoint(warMage.x,warMage.y , true) && jumped == true) 
       { 

        grav++; 
        warMage.y += vsp; 
        warMage.gotoAndStop("JumpWarmage");//Play teh jump animation 
       } 
      for(var i:Number = 0;i < 34; i++) 
      { 
      if(multiplePlatforms.hitTestPoint(warMage.x,warMage.y , true))//Check if the player hits any platforms in the array 
       { 
        warMage.y --;//Place the character a pixel above the platforms 
        grav = 0;//Gravity isnt applied 
        vsp = 0; 
        jumped = false; 

       } 
      }  
      } 

答えて

0

ブロックが起こる場合は、次のようにジャンプアップし、プラットフォームを打ちます落ちることはありません。重力を0に設定した後に重力を戻しているコードのどこにも表示されません(ジャンプしない限り)。私はあなたがいくつかのことをするべきだと思います。

1.)おそらくhitTestPointを使用せず、代わりに独自のヒット検出を構築するべきです。 https://gamedev.stackexchange.com/questions/586/what-is-the-fastest-way-to-work-out-2d-bounding-box-intersection

2.)プレイヤーがプラットフォームの下にあるか、それとも衝突したプラットフォームの上にいるかを判断し、適切な変更をvspに適用します(プレイヤーが上にある場合やプレーヤーを作る場合は0にします)。彼が下にいる場合は落ちる)。

3)プレイヤーが任意のプラットフォームでブロックされていない場合は、あなたの加速を設定してください(GRAV)プレイヤーは再び下降を開始しますので、それに戻って、デフォルト値です。あなたが本当にしていないときに、2つのフレームイベントを入力してください使用している

4)(オプション)。おそらく、フレームごとにプラットフォームコリジョン関数をあなたのガーネットの内部から呼び出すべきです。

+0

申し訳ありませんが、私は実際にはゲーム開発でこれまでそうではなかったとして、その例を本当に理解できませんでした。 – user199845

+0

自分の衝突コードを使用する場合、どのように複数のプラットフォームに適用することができますか? – user199845

+0

あなたは関数内に衝突検出を置き、各プラットフォーム+プレイヤーを関数に渡します。それをやりたくないし、hitTestPointを使い続けたい場合は、問題を解決することができます。プラットフォームに触れたときに、異なるコードが実行されても、プラットフォームの上部または下部に触れるかどうかにかかわらず同じコードを実行していることが問題です。 – Snukus