2011-10-20 2 views
2

Я пробовал почти все, чтобы остановить персонажа, когда он обнаруживает стену. Он работает только для UP и RIGHT или DOWN и LEFT, но не для всех 4 направлений, поэтому только одно движение y и одно движение x. Итак, я решил сделать 4 функции, по одному для каждого направления. Но тогда он работает только при нажатии левой клавиши и ударе о стену.AS3 Персонаж останавливается только на стенах в одном направлении

Мой вопрос к вам; Что мне нужно сделать, чтобы обнаружение столкновения остановило движение персонажа во всех четырех направлениях? Заранее спасибо

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

Вышеупомянутый код действительно не работает для всех остальных направлений, а затем слева.

Порядок звонков слушателя, тот же, что и вы их добавили.

Итак, выполняется первое обнаружениеHit2(), которое установит удар в true, если будет перекрытие.

Слева слева проверяется с помощью walkLEFT(); если пользователь не нажимает левую кнопку, то значение переменной будет установлено на значение false.

С помощью дополнительных методов walkXXXX() нажатие будет ложным, и координата всегда будет отрегулирована, если конкретная клавиша нажата.

Как и в предыдущем ответе, попробуйте использовать один прослушиватель событий.

Что-то вроде этого:

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

Ваш код немного Спагетти-у и, таким образом, трудно следовать, но я хотел бы попробовать переместить все ENTER_FRAME-кода в одну функцию вместо 5. Это устранило бы всякую возможность функций вызывается в том порядке, которого вы не ожидаете.

+2

благодарю вас за ответ , вы правы насчет грязного кода – Opoe

+0

@Opoe +1 за его признание. –