2015-04-27 66 views
0

我正在製作一個簡單的鼠標控制遊戲。基本上,如果玩家將光標移動到角色的右側,他會向右移動,反之亦然。但是如果你停止移動鼠標,Flash會忽略一個停止該角色的狀態,直到你再次移動鼠標爲止,所以這個人只是繼續向相同的方向移動,直到你移動光標。爲什麼如果mouseX和玩家的位置每幀更新都會發生這種情況?下面是輸入條件:AS3:鼠標將不會更新,直到移動鼠標

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

這是輸入幀事件偵聽器的功能。我的意思是第一個(光標位於播放器上的那一刻),它應該阻止角色的移動和他的動畫。我試圖追蹤那些布爾人,並且當滿足第一個條件時他們都不會切換爲假。我是否也應該發佈移動代碼? –

+0

請修改您的問題以包含所有信息。它仍然非常模糊。輸入幀監聽器的什麼對象?是的,請張貼移動代碼。 – null

回答

0

你說自己的解決方案:如果鼠標不動,MouseEvent將不會被分派。但只有MouseEvent的處理程序纔會更改變量。變量永遠不會改變,角色也不會停下來。

MouseEvent在這裏根本就不合適。

使用對象的鼠標座標也很容易,因爲無論如何您都希望它們相對於其位置。

下面是一個非常簡單的示例程序,演示如何使用對象的mouseXmouseY屬性,而不是使用主時間線的屬性和添加對象的座標。它不會使用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

經過一段時間的搞亂之後,我弄明白了。沒有完全得到爲什麼使用舞臺的鼠標X不適合。感謝容器提示,我不知道爲什麼我自己不知道。 –