Flash AS3 MouseOver не работает

У меня возникают проблемы с тем, чтобы событие MOUSE_OVER запускалось постоянно и по назначению. У меня есть собственный курсор (фрагмент ролика), прикрепленный к моей мыши, и он имеет 2 кадра (курсор первого кадра черный, а второй - белый).

Вот код из моего скрипта курсора:

    private function onAddedToStage(event:Event):void
    {
        gotoAndStop(1);
        this.mouseChildren = false;
        this.mouseEnabled = false;
    }
    public function rollover():void
    {
        gotoAndStop(2);
        trace("change cursor");
    }

Вот класс объекта, который будет реагировать при наведении курсора на него:

public class DoorHS01 extends MovieClip
{
    public var cursor:Cursor;
    public function DoorHS01() 
    {
        cursor = new Cursor();

        this.addEventListener(MouseEvent.MOUSE_OVER, rollover);
    }

    public function rollover(e:MouseEvent):void
    {
        cursor.rollover();
        trace("rollover");
    }
}

}

Таким образом, в классе DoorHS01 событие MouseEvent не всегда срабатывает, иначе оно действительно будет отложено. Вызывается функция cursor.rollever, и она выполняется в классе курсора (я знаю по трассировкам), но курсор никогда не изменяется.

Что мне не хватает?


person Nick Lozano    schedule 23.02.2016    source источник
comment
Я подумал, что, возможно, пользовательский курсор вызывает проблемы, поэтому я попытался добавить все фрагменты роликов в массив, например: _hotSpotArr = [mc1, mc2], а затем просто проверить наличие столкновений в энтерфрейме, например: for (var i:Number = 0; i < _hotSpotArr.length; i++) { if (cursor.hitTestObject(_hotSpotArr[i])) { cursor.gotoAndStop(2); } else (cursor.hitTestObject(_hotSpotArr[1])) { cursor.gotoAndStop(1); } } Но, похоже, это тоже не работает .. .   -  person Nick Lozano    schedule 23.02.2016
comment
^ Я хотел сказать, что он работает только с mc2, но не с mc1   -  person Nick Lozano    schedule 23.02.2016
comment
в DoorHS01 Поскольку вы сделали cursor = new Cursor(); вместо неопределенного this., почему бы не добавить в него конкретный cursor.addEventListener(MouseEvent.MOUSE_OVER, rollover);, чтобы гарантировать, что вы обращаетесь к курсору? Вам не нужен код внутри самого клипа курсора (за исключением stop(); на его кадре 1, чтобы остановить автоматическое воспроизведение). Наконец, в этой DoorHS01 вместо cursor.rollover() просто сделайте cursor.gotoAndStop(2); .. это поможет?   -  person VC.One    schedule 23.02.2016
comment
^ Я решил, что не хочу создавать класс для каждого отдельного объекта в игре, который будет случайно перемещать курсор, а вместо этого просто добавлю их в массив и проверю столкновение с курсором. НО я только что заметил кое-что очень странное ... В моем классе курсора я удалил все функции, кроме OnAddedToStage, который вы видите выше. Затем я удалил команду gotoAndStop (1), просто чтобы наблюдать за миганием курсора (переключаться между кадром 1 (черный курсор) и кадром 2 (белый курсор) ... и он остается на кадре 1. Почему? не имеет смысла.   -  person Nick Lozano    schedule 23.02.2016
comment
Неважно, я это исправил. Черт, я бы хотел сделать большой пост в верхней части этой темы, а не только добавлять комментарии. Я чувствую, что код в комментариях выглядит так плохо ... Возможно, мне просто придется начать новую публикацию. Мой вопрос в моем первом комментарии ^^^^ - это то, с чем у меня проблемы. Я не понимаю, почему курсор изменится только со вторым объектом в массиве, но не с первым. Команды трассировки показывают, что он распознает первый объект в массиве внутри цикла ...   -  person Nick Lozano    schedule 23.02.2016
comment
@NickLozano, как вы сами заметили: код в комментариях - беспорядок. В следующий раз отредактируйте свой вопрос и добавьте к нему релевантную информацию. Комментарии на этом сайте являются гражданами второго сорта. Думайте о них так, как будто они могут быть удалены в любой момент. На данный момент это довольно беспорядочный вопрос. Вам следует опубликовать ответ, в котором объясняется, что решило проблему. Таким образом становится ясно, что на этот вопрос есть ответ.   -  person null    schedule 23.02.2016
comment
@null Я смог придумать решение, и да, код в комментариях - полный беспорядок. Я бы хотел отредактировать свой вопрос, но не знаю как. Как ты? Извините, я не часто пользуюсь этим сайтом ...   -  person Nick Lozano    schedule 24.02.2016
comment
Не редактируйте ответ в своем вопросе! опубликуйте ответ как ответ. Ответить на свой вопрос - это нормально.   -  person null    schedule 24.02.2016
comment
@null о, ха-ха, хорошо, извини, я скучаю по тебе. Для справки в будущем, вы упомянули, что можно отредактировать вопрос ... как мне это сделать?   -  person Nick Lozano    schedule 24.02.2016
comment
Под вопросом у вас есть несколько ссылок для меня, они share edit close flag они могут отличаться для вас, но edit должны быть доступны. Щелкните по нему.   -  person null    schedule 24.02.2016
comment
@null geez ... Я слепой. Спасибо null за вашу помощь и терпение. Я очень ценю это.   -  person Nick Lozano    schedule 24.02.2016


Ответы (1)


Я решил, что лучший способ добиться того, чего я хотел, - это протестировать столкновение с моим настраиваемым курсором, а не создавать классы для всего объекта, которому нужна функция ролловера. Я также в настоящее время не знаю, сколько объектов потребуют этой функции опрокидывания, поскольку дизайнер, с которым я работаю, все еще разрабатывает детали игры, поэтому будет проще просто добавить то, что необходимо в массив, когда это необходимо. Я закончил с этим:

            for (var i:int = 0; i < _hotSpotArr.length; i++)
            {
                if (cursor.hitTestObject(_hotSpotArr[i]))
                {
                    cursor.gotoAndStop(2);
                    break;
                }
                else
                {
                    cursor.gotoAndStop(1);
                }
            }
person Nick Lozano    schedule 24.02.2016
comment
Просто +1 за решение вашего собственного вопроса. Я думаю, что вы можете добиться того же эффекта, используя event.currentTarget в функции rollOver. Это автоматически определит, какой из отображаемых объектов переместится, и вы сможете сделать с ним if / else. Попробуйте trace("rollover Obj was : " + e.currentTarget); в коде rollOver, чтобы понять, что я имею в виду, - person VC.One; 25.02.2016