Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проигрывание клипа по клику (http://www.flasher.ru/forum/showthread.php?t=211191)

lesnoj 09.07.2015 23:54

[Решено] Проигрывание клипа по клику
 
Объясните, почему trace отображается все время, а play через раз?

На сцену добавляется три кнопки-позиции и указатель.
При клике по кнопкам указатель будет перемещаться (анимация внутри указателя, своя для каждой позиции)
Но пока проблема с проигрыванием анимации - пропуск каждого второго клика.

Код AS3:

package src {
        import flash.display.MovieClip;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
 
        public class Main extends MovieClip {
                private var pointer:Pointer = new Pointer();
                private var startRoom:StartRoom = new StartRoom();
                private var leftRoom:LeftRoom = new LeftRoom();
                private var rightRoom:RightRoom = new RightRoom();
 
                public function Main() {                       
                        pointer.x = 250; pointer.y = 200;
                        startRoom.x = 250; startRoom.y = 250;
                        leftRoom.x = 50; leftRoom.y = 250;
                        rightRoom.x = 450; rightRoom.y = 250;
 
                        addChild(startRoom);
                        addChild(leftRoom);
                        addChild(rightRoom);
                        addChild(pointer);
 
                        startRoom.addEventListener(MouseEvent.CLICK, startRoomClick);
                        leftRoom.addEventListener(MouseEvent.CLICK, leftRoomClick);
                        rightRoom.addEventListener(MouseEvent.CLICK, rightRoomClick);
                }
 
                public function startRoomClick(event:MouseEvent):void {trace("startRoom"); pointer.play()}
                public function leftRoomClick(event:MouseEvent):void {trace("leftRoom"); pointer.play()}
                public function rightRoomClick(event:MouseEvent):void {trace("rightRoom"); pointer.play()}
        }
}


Tails 10.07.2015 08:47

Поставьте gotoAndPlay вместо play.

lesnoj 10.07.2015 18:44

Цитата:

Сообщение от Tails (Сообщение 1184730)
Поставьте gotoAndPlay вместо play.

С gotoAndPlay срабатывает на данном этапе, но задача чуть сложнее.
Внутри объекта Pointer содержится четыре анимации перемещения между тремя точками.
После нескольких движений происходит сбой. Причем текущая позиция (pointer.pos) выводится корректно на любом шаге, но с анимацией творится чехарда.

Код AS3:

package src {
        import flash.display.MovieClip;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
 
        public class Main extends MovieClip {
                private var pointer:Pointer = new Pointer();
                private var startRoom:StartRoom = new StartRoom();
                private var leftRoom:LeftRoom = new LeftRoom();
                private var rightRoom:RightRoom = new RightRoom();
 
                public function Main() {                       
                        pointer.pos = "startRoom";
                        pointer.x = 250; pointer.y = 200;
                        startRoom.x = 250; startRoom.y = 250;
                        leftRoom.x = 50; leftRoom.y = 250;
                        rightRoom.x = 450; rightRoom.y = 250;
 
                        addChild(startRoom);
                        addChild(leftRoom);
                        addChild(rightRoom);
                        addChild(pointer);
 
                        startRoom.addEventListener(MouseEvent.CLICK, startRoomClick);
                        leftRoom.addEventListener(MouseEvent.CLICK, leftRoomClick);
                        rightRoom.addEventListener(MouseEvent.CLICK, rightRoomClick);
                } // Конец конструктора
 
                public function startRoomClick(event:MouseEvent):void {
                        if (pointer.pos == "leftRoom") {
                                pointer.gotoAndPlay("leftToStart");
                                pointer.pos = "startRoom";
                                trace("Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "rightRoom") {
                                pointer.gotoAndPlay("rightToStart");
                                pointer.pos = "startRoom";
                                trace("Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "startRoom") {
                                trace("Клик по себе. Текущая позиция: " + pointer.pos);
                        };
                }
                public function leftRoomClick(event:MouseEvent):void {
                        if (pointer.pos == "startRoom") {
                                pointer.gotoAndPlay("startToLeft");
                                pointer.pos = "leftRoom";
                                trace("Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "rightRoom") {
                                trace("Не доступно. Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "leftRoom") {
                                trace("Клик по себе. Текущая позиция: " + pointer.pos);
                        };
                }
                public function rightRoomClick(event:MouseEvent):void {
                        if (pointer.pos == "startRoom") {
                                pointer.gotoAndPlay("startToRight");
                                pointer.pos = "rightRoom";
                                trace("Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "leftRoom") {
                                trace("Не доступно. Текущая позиция: " + pointer.pos);
                        } else if (pointer.pos == "rightRoom") {
                                trace("Клик по себе. Текущая позиция: " + pointer.pos);
                        };
                }
 
        } // Конец класса
}


Tails 10.07.2015 18:51

Сделайте gotoAndPlay для всех вложенных мувиклипов.
Или настройте внутреннюю анимацию таким образом, чтоб она сбрасывалась.

lesnoj 10.07.2015 19:05

Цитата:

Сообщение от Tails (Сообщение 1184745)
Сделайте gotoAndPlay для всех вложенных мувиклипов.
Или настройте внутреннюю анимацию таким образом, чтоб она сбрасывалась.

В данный момент использую только gotoAndPlay.
Уточните что значит чтобы она сбрасывалась?

Tails 10.07.2015 20:34

Вложений: 2
Сброс можно устроить, если создать пустой ключевой кадр и перейти на него.
Например так:
ResetClip.swf   (1.4 Кб)

lesnoj 10.07.2015 23:58

Цитата:

Сообщение от Tails (Сообщение 1184748)
Сброс можно устроить, если создать пустой ключевой кадр и перейти на него.

Пустой кадр заметен при проигрывании анимации.
Возможно я стараюсь решить задачу не самым подходящим способом. Тогда прошу подсказать.

Я стараюсь реализовать перемещение между некоторым количеством точек.
К примеру есть точки A, B и C, лежащие на одной плоскости.
Начальная позиция указателя над точкой B.

При клике по точкам происходит проигрывание анимации перемещения.
Причем перемещение важно сделать именно анимацией а не программно.

Tails 11.07.2015 09:15

Цитата:

Сообщение от lesnoj (Сообщение 1184750)
Пустой кадр заметен при проигрывании анимации.

В моём примере же не заметен.

lesnoj 12.07.2015 01:17

Цитата:

Сообщение от Tails (Сообщение 1184755)
В моём примере же не заметен.

Насчет этого я ошибся.
Но в вашем примере всего одна анимация и кадр reset имеет строку gotoAndStop(1) на нее ссылающуюся.
Если анимаций больше, то в данном методе наверно придется использовать условие и ссылаться на первый кадр нужной анимации.
Вообще эти манипуляции с reset это стандартное решение или что то вроде костыля? Почему анимация себя так ведет, где можно про это почитать?

Tails 12.07.2015 14:28

Да это костыль.
Суть вот в чём: Когда проигрывание переходит на пустой кадр (reset), все вложенные клипы с анимацией удаляются. Снова вернувшись на первый кадр (gotoAndStop(1)), эти клипы заново создаются. Перейдя на пустой кадр, можно таким образом устроить сброс.

Команда gotoAndStop(1) не позволяет отрисоваться пустому кадру, так как при переходе на него сразу же происходит переход на 1 кадр.

Это совсем не тривиальное решение. Можно ещё рекурсивной функцией пройтись по всем мувиклипам и вызвать gotoAndStop(1). Тоже самое по сути будет.

Вообщем, конечно всё это можно сделать красивее и аккуратнее. Но я не знаю, как у вас устроена анимация. Вы задали вопрос, как сделать так, чтоб при каждом вызове вложенная анимация проигрывалась заново, я предложил вам решение.


Часовой пояс GMT +4, время: 10:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.