Actionscript 3 AS3:mouseX赢得';在移动鼠标之前,请不要更新

Actionscript 3 AS3:mouseX赢得';在移动鼠标之前,请不要更新,actionscript-3,flash,Actionscript 3,Flash,我正在做一个简单的鼠标控制游戏。基本上,如果玩家将光标移动到角色的右侧,他将向右移动,反之亦然。但是如果你停止移动鼠标,Flash会忽略一个条件,这个条件会停止角色直到你再次移动鼠标,所以这个家伙会一直朝着相同的方向移动,直到你移动光标。如果mouseX和玩家的位置在每帧更新,为什么会发生这种情况?以下是输入条件: stage.addEventListener(MouseEvent.MOUSE_MOVE, CTRLupdateMousePosition) private functio

我正在做一个简单的鼠标控制游戏。基本上,如果玩家将光标移动到角色的右侧,他将向右移动,反之亦然。但是如果你停止移动鼠标,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
        }
    }
stage.addEventListener(MouseEvent.MOUSE_MOVE,CTRLupdateMousePosition)
私有函数CTRLupdateMousePosition(e:事件):无效
{
if(mouseX>saman_legs.x-2-萨满_legs.width/2&&mouseXsaman_legs.x+saman_legs.width/2&&globalvariableblibrary.coregameplaused==false){
CTRLleftButtonDown=错误
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
        }
    }
addEventListener(Event.ENTER\u FRAME,playerControl)
专用功能播放控制(e:事件):无效{
跟踪(“左下:”+CTRLleftButtonDown,“右下:”+CTRLrightButtonDown)
boxSensor.x=萨满双腿.x
Soulcacher.x=萨满_legs.x
如果(CTRLleftButtonDown==false&&CTRLrightButtonDown==false&&GlobalVariableLibrary.COREgamePaused==false){
萨满的腿。去玩(“空闲”)
萨满·阿姆斯敦。去玩(“空闲”)
}否则如果(CTRLleftButtonDown&&Saman_legs.x>40&&GlobalVariableLibrary.COREgamePaused==false){
萨满的腿。去玩(“左行走”)
萨满·阿姆斯敦。去玩(“散步”)
萨满_legs.x-=全局变量库.CHARspeed
萨满面具.x-=全局变量库.CHARspeed
shaman_armsDown.x-=GlobalVariableLibrary.CHARspeed
萨满_armsUp.x-=全局变量库.CHARspeed
}else if(CTRLrightButtonDown&&Saman_legs.x<760&&GlobalVariableLibrary.COREgamePaused==false){
萨满的腿。去玩(“右行走”)
萨满·阿姆斯敦。去玩(“散步”)
萨满_legs.x+=全局变量库.CHARspeed
萨满_mask.x+=globalvariableblibrary.CHARspeed
shaman_armsDown.x+=globalvariablebleLibrary.CHARspeed
萨满_armsUp.x+=globalvariableblibrary.CHARspeed
}
}

您自己说明了解决方案:如果鼠标不移动,则不会调度
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;
}
导入flash.display.Sprite;
导入flash.events.Event;
恒速:数字=1;
变量框:Sprite=新Sprite();
box.graphics.beginll(0xff0000);
盒。图形。drawRect(-50,-20,100,40);
box.graphics.endFill();
addChild(box);
框x=框y=200;
addEventListener(Event.ENTER_FRAME,onLoop);
函数onLoop(e:事件):void
{
变量halfHeight:Number=box.height/2,halfWidth:Number=box.width/2;
如果(box.mouseX>halfWidth)
box.x+=速度;
else if(box.mouseX<-半宽)
box.x-=速度;
如果(box.mouseY>半高)
box.y+=速度;
else if(box.mouseY<-半高)
box.y-=速度;
}
在一个新的空项目的时间线上尝试它



这是离题的,但请将萨满的这些部分放在一个容器中,而不是按相同的数量单独移动它们。

您没有提供足够的信息。您发布的代码在哪里?你说的是什么条件被忽略了?使用调试器单步执行代码的结果是什么?怎么搞的?您希望发生什么?这是enter frame事件侦听器的一个函数。我指的是第一个条件(光标位于播放器上方的时刻),它应该停止角色的移动和动画。我试着跟踪那些bool,当第一个条件满足时,它们都不会切换为false。我是否也应该发布移动代码?请编辑您的问题,以包含所有这些信息。还是很模糊。输入什么对象的帧侦听器?是的,请同时发布移动代码。更新了我的帖子。这个信息似乎足够了。我不太确定你在这里做什么。每次鼠标移动后都会更新CTRLleftButtonDown/CTRLrightButtonDown。然后在enterframe中检查这些值。它到底应该如何工作?在胡闹了一段时间后,我明白了这一点。但我不太明白为什么使用stage的mouseX不合适。谢谢你的容器提示,我不知道为什么我自己没弄明白。