按钮仍然是活动的,即使当我从它移除光标,ActionScript 3



好的,所以我有我的游戏,但我有一个问题,每当我按下按钮,而按钮仍然被按下,如果我从它移走我的光标没有释放鼠标按钮,它仍然是活跃的。我如何解决它,使它无论何时鼠标不在按钮的点击区域,它是不活跃的----解释它更好和简单..如果我按下按钮,不放手,如果我把鼠标拖出按钮区域,放手按钮仍然是活跃的,我该如何解决这个问题?这是我的代码,使玩家行走。

    var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var upPressed:Boolean = false;
var shootDown:Boolean = false;
var onGround:Boolean = true;

var level:Number = 1;
var bullets:Array = new Array();
var container_mc:MovieClip; 
var enemies:Array = new Array();
var score:Number = 0;
var tempEnemy:MovieClip;
var tempLaser:MovieClip;
var timesHit:uint = 0;
// BUTTON EVENTS EITHER CLICKED OR NOT
left_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveLeft);
right_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveRight);
up_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveUp);
shoot_btn.addEventListener(MouseEvent.MOUSE_DOWN, shootPressed);
left_btn.addEventListener(MouseEvent.MOUSE_UP, leftUp);
right_btn.addEventListener(MouseEvent.MOUSE_UP, rightUp);
up_btn.addEventListener(MouseEvent.MOUSE_UP, upUp);

player.gotoAndStop('still');

stage.addEventListener(Event.ENTER_FRAME,onenter);
function onenter(e:Event):void{
    if (rightPressed == true && leftPressed == false){
        player.x += 8;
        player.scaleX = 1;
        player.gotoAndStop("walking");
        cloud.x -= 8;

    } else if (leftPressed == true && rightPressed == false){
        player.x -= 8;
        player.scaleX = -1;
        player.gotoAndStop('walking');
        cloud.x += 8;
   } else if(upPressed == true && leftPressed == false && rightPressed == false){

       }
        else{  
        rightPressed = false;
        leftPressed = false;
        player.gotoAndStop('still')}
}
// **** MOVEMENT CONTROLS *********

function shootPressed(e:MouseEvent):void{
    shootDown = true;
    if(shootDown == true){
        fireBullet();
        }
    }

function fireBullet():void
{
    var playerDirection:String;
    if(player.scaleX < 0){
        playerDirection = "left";
    } else if(player.scaleX > 0){
        playerDirection = "right";
    }
    var bullet:Bullet = new Bullet(player.x, player.y, playerDirection);
    //bullets = new Array();
    bullet.y = player.y + 8;
    stage.addChild(bullet);
    bullets.push(bullet);
    trace(bullets);
}
// BUTTON FUNCTIONS
function moveLeft(e:MouseEvent):void
{
    if(MouseEvent.MOUSE_DOWN){
    leftPressed = true;
    }else if (MouseEvent.MOUSE_UP) {
        leftPressed = false;
        }
}
function moveRight(e:MouseEvent):void
{
    if (MouseEvent.MOUSE_DOWN){
    rightPressed = true;
    }else if (MouseEvent.MOUSE_UP){
        rightPressed = false;
        }
}
function moveUp(e:MouseEvent):void
{
    if(MouseEvent.MOUSE_DOWN){
        upPressed = true;
        onGround = false;
        player.y -= 100;
        } 

}

function leftUp(e:MouseEvent):void
{
    leftPressed = false;
}
function rightUp(e:MouseEvent):void
{
    rightPressed = false;
}
function upUp(e:MouseEvent):void
{
    upPressed = false;
 if(upPressed == false){
     player.y += 100;
     }
}

我想这就是你要找的。这应该足够了。

left_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveLeft);
left_btn.addEventListener(MouseEvent.MOUSE_UP, LeftUp);
function moveLeft(e:MouseEvent):void
{
  leftPressed = true;
  left_btn.addEventListener(MouseEvent.MOUSE_OUT, LeftOut);
}
function leftUp(e:MouseEvent):void
{
  leftPressed = false;
  left_btn.removeEventListener(MouseEvent.MOUSE_OUT, LeftOut);
}
function leftOut(e:MouseEvent):void
{
  leftPressed = false;
  left_btn.removeEventListener(MouseEvent.MOUSE_OUT, LeftOut);
}

MOUSE_OUT只是在鼠标离开对象时触发,所以你只需要为这种类型的事件添加一个EventListener。当然,您可能会理解,如果您之前没有单击过btn,那么侦听此事件是不明智的,这就是为什么我选择仅在侦听MOUSE_DOWN时添加MOUSE_OUT。因为你想要的只是设置leftPressed当你上你的鼠标,我猜你想要相同的,当你的鼠标是出去。在此之后,我删除无用的侦听器(MOUSE_OUT),以便能够再次侦听它们,因为这是一种常见的内存浪费。

但是,我真的不明白你为什么这样做:

function moveLeft(e:MouseEvent):void
{
   if(MouseEvent.MOUSE_DOWN){
       leftPressed = true;
   }else if (MouseEvent.MOUSE_UP) {
       leftPressed = false;
   }
}

有什么用?

除了mouseup事件之外,还需要处理鼠标退出事件。如果不这样做,当光标从按钮移动而鼠标处于下("拖出")时,鼠标向上事件永远不会触发。

使用事件MouseEvent.MOUSE_OUTMouseEvent.RELEASE_OUTSIDE

最好的方法是在MOUSE_DOWN事件触发时,为MOUSE_UP事件和MOUSE_OUTRELEASE_OUTSIDE添加事件侦听器。

代码示例:

left_btn.addEventListener(MouseEvent.MOUSE_DOWN, handleButtonDown);

function handleButtonDown(e:MouseEvent):void 
{
   // activate "up" listeners
   e.target.addEventListener(MouseEvent.MOUSE_UP, handleButtonUp);
   e.target.addEventListener(MouseEvent.MOUSE_OUT, handleButtonUp);
   e.target.addEventListener(MouseEvent.RELEASE_OUTSIDE, handleButtonUp);
   // call your button action function
   // e.target is your button
   buttonDownAction(e.target);
}

function handleButtonUp(e:MouseEvent):void 
{
   // activate "up" listeners
   e.target.removeEventListener(MouseEvent.MOUSE_UP, handleButtonUp);
   e.target.removeEventListener(MouseEvent.MOUSE_OUT, handleButtonUp);
   e.target.removeEventListener(MouseEvent.RELEASE_OUTSIDE, handleButtonUp);
   // call your button action function
   // e.target is your button
   buttonUpAction(e.target);
}
function buttonDownAction(button:MovieClip) {
   switch(button) {
      case left_btn: 
          // do your thing here
      case right_btn:
          // do something else here
    }
}

在这个例子中,我让handleButtonDown和handleButtonUp更通用一些,这样你就可以对所有的按钮使用这两个函数。

希望它能帮助你,祝你好运!

最新更新