0

さて、ゲームはありますが、ボタンを押すたびに、マウスボタンを離さずにカーソルをボタンから離すと、ボタンが押されたままボタンがアクティブになるという問題があります。マウスがボタンのヒットゾーンにないときはいつでもアクティブではないように解決するにはどうすればよいですか?それをよりよく簡単に説明するために..ボタンを押しても離さないでください。マウスをボタンゾーンからドラッグして離すと、ボタンは引き続きアクティブになります。どうすれば解決できますか?これがプレイヤーを歩かせるための私のコードです。

    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;

     }
}
4

2 に答える 2

0

mouseupイベントとは別に、mouseoutイベントで何かを行う必要があります。そうしないと、マウスが下がっているときにカーソルがボタンから移動したときに、マウスアップイベントがトリガーされることはありません(「ドラッグアウト」)。

イベントを使用するMouseEvent.MOUSE_OUTMouseEvent.RELEASE_OUTSIDE

MOUSE_UP最良の方法は、イベントリスナーをイベントに追加し、MOUSE_OUTまたはイベントがトリガーさRELEASE_OUTSIDEれたときに追加することMOUSE_DOWNです。

コード例:

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をもう少し汎用的にして、すべてのボタンにこれら2つの関数を使用できるようにしました。

それがあなたを助けてくれることを願っています、頑張ってください!

于 2013-03-24T20:09:28.453 に答える
0

これがあなたが探していたものだと思います。それで十分なはずです。

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;
   }
}

その用途は何ですか?!

于 2013-03-24T20:14:48.410 に答える