AS3: Как заставить это определение положения мыши работать должным образом? - PullRequest
0 голосов
/ 22 сентября 2011

Я новичок в AS3, поэтому, пожалуйста, ознакомьтесь с моими основными вопросами.

Что я хочу сделать, так это иметь левую стрелку MC на левой стороне сцены и стрелку вправо MC на правой сторонеэтап.Когда мышь находится над левой 1/3 сцены, появляется стрелка влево, справа 1/3 сцены появляется стрелка вправо, но в средней 1/3 стрелки исчезают.

Я НЕ хочу создавать большие невидимые МС и таким образом определять движение мыши.Я просто хочу, чтобы это было относительно положения мыши на сцене.

Я думал, что это будет очень легко, но eventListener запускается каждый раз, когда мышь движется, поэтому левая и правая стрелка MC анимация постоянно запускаетсяи они выглядят так, словно «трясутся» из-за отсутствия лучшего слова.

То, что я имею до сих пор, заключается в следующем.Может ли кто-нибудь помочь мне с этим?

var stagePos:int = stage.width/3;

addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent) {
    var mouseArrow:int = mouseX;

    if (mouseArrow<stagePos) {
        arrowLeft_mc.gotoAndPlay("Show");
        trace ("left arrow show");
    } else if (mouseArrow>stagePos && mouseArrow<stagePos*2) {
        arrowLeft_mc.gotoAndPlay("Hide");
        arrowRight_mc.gotoAndPlay("Hide");
        trace ("nothing happens");
    } else if (mouseArrow>stagePos*2) {
        arrowRight_mc.gotoAndPlay("Show");
        trace ("right arrow show");
    }
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2012

Проблема в том, что ваш код вызывается неоднократно. Если вы слушаете MouseEvent.MOUSE_MOVE, это может произойти слишком быстро для любого бизнеса 'gotoAndPlay'.

Так как вы не хотите делать невидимые мувиклипы (которые дают вам очень удобные MouseEvent.ROLL_OVER и MouseEvent.ROLL_OUT события), то вам остается опросить, чтобы оценить координаты, как у вас в коде.

Вам нужно запомнить последний «ответ», который дал ваш код, а затем игнорировать случай, который уже верен в следующий раз. Вам придется мириться с моим предпочтением утверждений о смене.

var stagePos:int = stage.width/3;
var _arrowShowing : int = 0;
addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent)
{
    var mouseArrow:int = mouseX;

    switch( true )
    {
        case ( !_arrowShowing == 1 && mouseArrow < stagePos ) :
            _arrowShowing = 1;
            arrowLeft_mc.gotoAndPlay("Show");
            trace ("left arrow show");
            break;
        case ( !_arrowShowing == 0 && mouseArrow > stagePos && mouseArrow < stagePos * 2 ) :
            _arrowShowing = 0;
            arrowLeft_mc.gotoAndPlay("Hide");
            arrowRight_mc.gotoAndPlay("Hide");
            trace ("nothing happens");
            break;
        case ( !_arrowShowing == 2 && mouseArrow>stagePos*2 ) :
            _arrowShowing = 2;
            arrowRight_mc.gotoAndPlay("Show");
            trace ("right arrow show");
            break;
    }
}
0 голосов
/ 22 сентября 2011

if...else вроде бы в порядке. Единственное, что может решить проблему - это mc.gotoAndPlay. Попробуйте вместо этого использовать альфа-свойство:

var stagePos:int = stage.width/3;

addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent) {
    var mouseArrow:int = mouseX;

    if (mouseArrow<stagePos) {
        arrowLeft_mc.alpha = 1; //alpha is 1, arrow is shown
        trace ("left arrow show");
    } else if (mouseArrow>stagePos && mouseArrow<stagePos*2) {
        arrowLeft_mc.alpha = 0; //alpha is 0, arrow is hidden
        arrowRight_mc.alpha = 0;
        trace ("nothing happens");
    } else if (mouseArrow>stagePos*2) {
        arrowRight_mc.alpha = 1;
        trace ("right arrow show");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...