2015-04-27 5 views
0

Я делаю игру с простым управлением мыши. В принципе, если игрок перемещает курсор вправо от символа, он движется вправо и наоборот. Но если вы перестанете перемещать мышь, Flash игнорирует условие, которое останавливает символ, пока вы не переместите мышь снова, так что парень просто продолжает двигаться в том же направлении, пока вы не переместите курсор. Почему это происходит, если mouseX и позиция игрока обновляются каждый кадр? Вот входные условия:AS3: mouseX не будет обновляться, пока мышь не будет перемещена

stage.addEventListener(MouseEvent.MOUSE_MOVE, CTRLupdateMousePosition) 

    private function CTRLupdateMousePosition(e:Event):void 
    { 
     if (mouseX > shaman_legs.x-2 - shaman_legs.width/2 && mouseX < shaman_legs.x+2 + shaman_legs.width/2) { 
      CTRLleftButtonDown = false 
      CTRLrightButtonDown = false 
     } else if (mouseX < shaman_legs.x - shaman_legs.width/2 && GlobalVariableLibrary.COREgamePaused == false) { 
      CTRLleftButtonDown = true 
      CTRLrightButtonDown = false 
     } else if (mouseX > shaman_legs.x + shaman_legs.width/2 && GlobalVariableLibrary.COREgamePaused == false) { 
      CTRLleftButtonDown = false 
      CTRLrightButtonDown = true 
     } 
    } 

А вот код, который реагирует на вход игрока при перемещении персонажа и играть анимации:

addEventListener(Event.ENTER_FRAME, playerControl) 

    private function playerControl(e:Event):void { 
     trace("LeftDown:"+CTRLleftButtonDown, "RightDown:"+CTRLrightButtonDown) 
     boxSensor.x = shaman_legs.x 
     soulCatcher.x = shaman_legs.x 
     if (CTRLleftButtonDown == false && CTRLrightButtonDown == false && GlobalVariableLibrary.COREgamePaused == false) { 
      shaman_legs.gotoAndPlay("idle") 
      shaman_armsDown.gotoAndPlay("idle") 
     } else if (CTRLleftButtonDown && shaman_legs.x > 40 && GlobalVariableLibrary.COREgamePaused == false) { 
      shaman_legs.gotoAndPlay("walkLeft") 
      shaman_armsDown.gotoAndPlay("walk") 
      shaman_legs.x -= GlobalVariableLibrary.CHARspeed 
      shaman_mask.x -= GlobalVariableLibrary.CHARspeed 
      shaman_armsDown.x -= GlobalVariableLibrary.CHARspeed 
      shaman_armsUp.x -= GlobalVariableLibrary.CHARspeed 
     } else if (CTRLrightButtonDown && shaman_legs.x < 760 && GlobalVariableLibrary.COREgamePaused == false) { 
      shaman_legs.gotoAndPlay("walkRight") 
      shaman_armsDown.gotoAndPlay("walk") 
      shaman_legs.x += GlobalVariableLibrary.CHARspeed 
      shaman_mask.x += GlobalVariableLibrary.CHARspeed 
      shaman_armsDown.x += GlobalVariableLibrary.CHARspeed 
      shaman_armsUp.x += GlobalVariableLibrary.CHARspeed 
     } 
    } 
+0

Вы не предоставляете достаточно информации. Где находится этот код, который вы разместили? О каком состоянии вы говорите, игнорируется? Что было результатом перехода вашего кода с помощью отладчика? Что случилось? И что вы ожидали? – null

+0

Это функция ввода приемника событий кадра. Условие, которое я имел в виду, было первым (момент, когда курсор расположен над игроком), который должен остановить движение персонажа и его анимацию. Я пробовал отслеживать этих Bools, и они оба не переключаются на false, когда выполняется первое условие. Должен ли я опубликовать код движения? –

+0

Измените свой вопрос, чтобы включить всю эту информацию. Это все еще очень расплывчато. введите кадр слушателя какого объекта? Да, пожалуйста, отправьте код движения. – null

ответ

0

Вы заявили решение самостоятельно: если мышь не двигается , MouseEvent не будет отправлен. Но только обработчик MouseEvent изменяет переменные. Переменные никогда не меняются, и символ не останавливается.

MouseEvent здесь просто не подходит.

Это также намного легче работать с координатами мыши объекта, так как вы хотите, чтобы они были по отношению к его положению в любом случае.

Вот очень простая примерная программа, иллюстрирующая использование свойств объекта mouseX и mouseY, вместо использования основных линий времени и добавления координат объекта. Он не использует MouseEvent, потому что, как вы себя пережили: он не делает то, что вы хотите.

import flash.display.Sprite; 
import flash.events.Event; 

const SPEED:Number = 1; 

var box:Sprite = new Sprite(); 
box.graphics.beginFill(0xff0000); 
box.graphics.drawRect(-50, -20, 100, 40); 
box.graphics.endFill(); 

addChild(box); 

box.x = box.y = 200; 

addEventListener(Event.ENTER_FRAME, onLoop); 

function onLoop(e:Event):void 
{ 
    var halfHeight:Number = box.height/2, halfWidth:Number = box.width/2;   
    if (box.mouseX > halfWidth) 
     box.x += SPEED; 
    else if (box.mouseX < -halfWidth) 
     box.x -= SPEED; 

    if (box.mouseY > halfHeight) 
     box.y += SPEED; 
    else if (box.mouseY < -halfHeight) 
     box.y -= SPEED; 
} 

Попробуйте на временной линии нового пустого проекта.


Это оффтоп, но, пожалуйста, поставить эти части шамана в контейнер, а не перемещать их все по отдельности на ту же сумму.

+0

После некоторого времени возиться, я понял это. Не совсем понятно, почему использование mouseX для сцены не подходит. Спасибо за наконечник контейнера, я не знаю, почему я сам этого не понял. –

Смежные вопросы