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

Posted

技术标签:

【中文标题】AS3:mouseX 在鼠标移动之前不会更新【英文标题】:AS3: mouseX won't update until the mouse is moved 【发布时间】:2015-07-06 08:37:30 【问题描述】:

我正在用简单的鼠标控制制作游戏。基本上,如果玩家将光标移动到角色的右侧,他就会向右移动,反之亦然。但是如果你停止移动鼠标,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
        
    

【问题讨论】:

您没有提供足够的信息。您发布的这段代码在哪里?你说的什么条件被忽略了?使用调试器单步执行代码的结果是什么?发生了什么?你预计会发生什么? 这是一个进入帧事件监听器的功能。我的意思是第一个条件(光标位于玩家上方的那一刻),它应该停止角色的移动和他的动画。我尝试跟踪这些布尔值,当满足第一个条件时,它们都不会切换为 false。我也应该发布移动代码吗? 请编辑您的问题以包含所有这些信息。它仍然非常模糊。输入什么对象的帧监听器?是的,请同时发布移动代码。 更新了我的帖子。这些信息似乎足够了。 我不太确定你在这里做什么。每次鼠标移动后更新 CTRLleftButtonDown / CTRLrightButtonDown。然后在 enterframe 中检查这些值。它应该如何运作? 【参考方案1】:

您自己陈述了解决方案:如果鼠标没有移动,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;

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


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

【讨论】:

搞砸了一段时间后,我明白了这一点。不太明白为什么使用舞台的 mouseX 不合适。感谢容器提示,我不知道为什么我自己没有弄清楚。

以上是关于AS3:mouseX 在鼠标移动之前不会更新的主要内容,如果未能解决你的问题,请参考以下文章

as3 判断鼠标移动方向

As3在mouseX和mouseY周围绘制位图+copyPixel

Flash AS3:将鼠标保持在特定范围内

as3 判断移动方向

窗口只会在鼠标移动时更新

actionscript 2 到 actionscript 3 我的代码