AS3:鼠标移动前不会更新mouseX

时间:2015-04-27 18:33:51

标签: actionscript-3 flash

我正在制作一个简单的鼠标控制游戏。基本上,如果玩家将光标移动到角色的右侧,则向右移动,反之亦然。但是如果你停止移动鼠标,Flash会忽略一个停止角色的条件,直到你再次移动鼠标为止,这样你就可以继续向同一个方向移动,直到移动光标为止。如果每帧都更新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
        }
    }

1 个答案:

答案 0 :(得分: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;
}

在新的空项目的时间线上尝试。

这是offtopic,但请将萨满的那些部分放入容器中,而不是将它们全部单独移动相同的数量。