2011-10-20 5 views
2

벽을 감지하면 거의 모든 것을 시도하여 캐릭터를 멈추게했습니다. 위쪽 및 아래쪽과 왼쪽에서만 작동하지만 모든 4 방향에서 작동하지 않으므로 한 번의 동작과 한 번의 x 번 동작 만 가능합니다. 그래서 각 방향에 하나씩 4 가지 기능을 만들기로 결정했습니다. 하지만 왼쪽 키를 누르고 벽에 부딪 힐 때만 작동합니다.AS3 캐릭터는 한 방향으로 만 벽에서 멈 춥니 다.

내 질문에 대한 답변입니다. 충돌 감지로 인해 캐릭터가 4 방향으로 움직이지 않도록하려면 어떻게해야합니까? 귀하의 코드가 수행하는 비트와 spagetti-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를 누르지 않으면 변수 타격이 다시 false로 설정됩니다.

추가 walkingXXXX() 메소드를 사용하면 특정 키를 누르면 좌표가 항상 false로 조정됩니다.

이전 답변과 마찬가지로 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 그렇게 두 번을 요구 (좌표 hitTest 호출). 따라서 사용자가 두 개의 방향키를 누를 때 그 틈새가 벽을 가로 질러 활공합니다. 그 중 하나의 키가 숯을 벽에 부딪 치는 것을 계속합니다.

+0

답변 해 주셔서 감사합니다 :) – Opoe

1

사전에 감사합니다 예상하지 못한 순서로 호출됩니다.

+2

응답 해 주셔서 감사합니다. , 지저분한 코드에 대해서는 바로 당신 – Opoe

+0

@Opoe +1 그것을 인정합니다. –