2011-10-20 9 views
2

壁を検出したときに私のキャラクターを止めるためにほとんどすべてを試みました。 これは、上向き、右向き、下向き、左向きにしか動作しますが、すべての4方向では動作しませんので、動きは1回、動きは1回だけです。 私は4つの機能を各方向に1つずつ作成することに決めました。 しかし、それは左のキーが押されて壁に当たったときにのみ機能します。AS3キャラクターは一方向の壁にしか止まらない

私の質問はあなたです。衝突検出がキャラクターを4つの方向すべてに動かすのを止めるためには何が必要ですか?あなたのコードが従うことがビットのスパゲッティ-Yので難しいですが、私は機能のいずれかの可能性を除去するであろう代わりに5の一の機能にすべてのENTER_FRAME-コードを移動しようとする

var leftArrow:Boolean; 
var upArrow:Boolean; 
var rightArrow:Boolean; 
var downArrow:Boolean; 
var speed:int = 10; 
var hitting:Boolean; 
var ismoving:Boolean; 
var wallsRect:Rectangle = bounds.getBounds(this); 
var charRect:Rectangle = char.getBounds(this); 

var boundsBmpData = new BitmapData(wallsRect.width, wallsRect.height, true, 0); 
var charBmpData = new BitmapData(charRect.width, charRect.height, true, 0); 

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
stage.addEventListener(Event.ENTER_FRAME, detectHit2); 
stage.addEventListener(Event.ENTER_FRAME, walkingLEFT); 
stage.addEventListener(Event.ENTER_FRAME, walkingUP); 
stage.addEventListener(Event.ENTER_FRAME, walkingDOWN); 
stage.addEventListener(Event.ENTER_FRAME, walkingRIGHT); 

boundsBmpData.draw(bounds); 
charBmpData.draw(char); 

function keyPressed(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT) 
      { 
       leftArrow = true; 

      } 
     if (event.keyCode == Keyboard.UP) 
      { 
       upArrow = true; 
      } 
     if (event.keyCode == Keyboard.RIGHT) 
      { 
       rightArrow = true; 
      } 
     if (event.keyCode == Keyboard.DOWN) 
      { 
       downArrow = true; 
      } 


    } 





function keyReleased(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT) 
      { 
       leftArrow = false; 

      } 
     if (event.keyCode == Keyboard.UP) 
      { 
       upArrow = false; 
      } 
     if (event.keyCode == Keyboard.RIGHT) 
      { 
       rightArrow = false; 

      } 
     if (event.keyCode == Keyboard.DOWN) 
      { 
       downArrow = false; 
      } 
    } 


function walkingLEFT(event:Event):void 
{ 
    if (leftArrow && ! hitting) 
     { 
      char.x -= speed; 

     }else 
           { 
            hitting = false; 
            ismoving = false; 

           } 
} 

function walkingRIGHT(event:Event):void 
{ 
    if (rightArrow && ! hitting) 
     { 
      char.x += speed; 

     }else 
           { 
            hitting = false; 
            ismoving = false; 

           } 
} 


function walkingUP(event:Event):void 
{ 

        if (upArrow && ! hitting) 
         { 
          char.y -= speed; 

         } 
          else 
           { 
            hitting = false; 
            ismoving = false; 

           } 
       } 

function walkingDOWN(event:Event):void 
{ 

        if (downArrow && ! hitting) 
         { 
          char.y += speed; 

         } 
          else 
           { 
            hitting = false; 
            ismoving = false; 

           } 
       } 




function detectHit2(e:Event):void 
{ 
    if(boundsBmpData.hitTest(new Point(bounds.x, bounds.y), 
           255, 
           charBmpData, 
           new Point(char.x, char.y), 
           255)) 
     { 

      hitting = true; 
      ismoving = false; 

     } 
      else 
       { 

         hitting = false; 

         bounds.filters = []; 
       } 
     } 
+0

あなたの他の質問(http://stackoverflow.com/questions/7704312/as3-stop-character-from-moving-through-walls)で提供されたコードは、このトリックを行う必要があります:) –

答えて

2

上記のコードは実際には他のすべての方向で機能しません。

リスナーの呼び出し順序は、追加した順序と同じです。

最初にdetectHit2()が実行され、オーバーラップがある場合にtrueになるように設定されます。

次は左がwalkingLEFT()でチェックされます。ユーザがleftを押さないと、変数hitは再びfalseに設定されます。

追加のwalkingXXXX()メソッドを使用するとヒットし、特定のキーが押された場合は常に座標が調整されます。

前の回答と同じように、1つのイベントリスナーを使用してみてください。このような

何か:

this.addEventListener(Event.ENTER_FRAME, handleEnterFrame); 

function handleEnterFrame(anEvent: Event): void 
{ 
    var newx: Number = char.x - (leftArrow ? speed : 0) + (rightArrow ? speed : 0); 
    var newy: Number = char.y - (upArrow ? speed : 0) + (downArrow ? speed : 0); 
    if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y), 
          255, 
          charBmpData, 
          new Point(newx, newy), 
          255)) 
    { 
    char.x = newx; 
    char.y = newy; 
    } 
} 

あなたのプレイヤーが複数の方向キーを押して許可した場合、あなたが最初にXを調整することにより、上記のコードを改良する必要があるかもしれませんし、その後、Y座標(そう2回必要hitTest呼び出し)。したがって、ユーザーが2つの方向キーを押したときにチャーが壁を横切って滑り、それらのキーの1つが壁にチャーを押し当て続けます。

+0

ありがとうございました:) – Opoe

1

事前に 感謝期待していない順序で呼び出されます。

+2

あなたの応答に感謝します、あなたはちょっと面倒なコードについては正しいです – Opoe

+0

@Opoe +1それを認めます。 –

関連する問題