Розробка та Монетизація Флеш ігор
Завдання: зациклити анімацію, поки масив не висохне. Герой проходить послідовно від точки до точки. Здавалося, все просто, але вирішити мені не вдалося
Дано:path - масив точок (шлях героя);tween - starling.animation.Tween;
. if (path.length) // check path -> move hero tween = new Tween (hero, 0.5); moveHeroOnPath(); Starling.juggler.add(tween); > .
private function moveHeroOnPath():void // Рух героя var xTo:uint = 64 + path[0].x * 200; var yTo:uint = 44 + path[0].y * 200;
tween.onComplete = function():void path.shift(); // remove first point if (path.length) moveHeroOnPath(); > else Starling.juggler.remove(tween); tween = null; trace ("End of animation"); > >; >
Підсумок: герой проходить перший крок і все! Довжина масиву зменшується на 1, координати xTo, yTo трейсить правильно, але герой чомусь по них не йде. На цьому анімація зупиняється. "End of animation" не відбувається.
Допоможіть вирішити. Або може їсти більш кошерний варіант реалізації руху, підкажіть!
| Автор: | TheRabbit[ від П'ят лютого 07, 2014 2:32 pm ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
| Якщо тобі треба рухати з точки А до точки Б – у тебе занадто гемморойна система якась. |
import flash.events.MouseEvent; import flash.events.Event;
stage.addEventListener(MouseEvent.CLICK, updateWaypoint); stage.addEventListener(Event.ENTER_FRAME, onFrame);
var isMoving: Boolean = false; var delta_x: Number = 0; var delta_y: Number = 0; var speed: Number = 5;
function updateWaypoint(e:MouseEvent): void target.x = e.stageX; target.y = e.stageY; isMoving = true; >
function onFrame(e: Event): void if (isMoving)
delta_x = target.x – unit.x; delta_y = target.y - unit.y;
distance = Math.sqrt(delta_x * delta_x + delta_y * delta_y) / speed;
if (distance
| Автор: | soniko[ від П'ят лютого 07, 2014 4:19 pm ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
| TheRabbit, дякую! Але я не вловлюю суті. На одну точку у мене теж рухається. Мені потрібно не А->Б, а циклом А->Б->В->Г без зупинок. Також не зрозумів у чому геморойність системи? не потрібно, твін тут всього один, сподіваюся що не "задовбаю". |
Може, хтось знає, чому мій варіант не працює, або запропонує альтернативний?
| Автор: | johny6.5[ від П'ят лютого 07, 2014 4:39 pm ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
| А як робити так? |
| Автор: | TheRabbit[ Пт Лют 07, 2014 4:49 pm ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
Ймовірно, тут доведеться робити один таймлайн з кількох твинів, що йдуть один за одним. Визначаєш заздалегідь кількість точок, у циклі додаси твини в загальний твін-таймлайн і після циклу його запускаєш. Це можна зробити на TweenLite, на вбудованому Старлінг не знаю, але швидше за все теж можна. І чому в тебе функція сама себе викликає, то можна робити? ) |
| Автор: | Elegar[ Сб Лют 08,2014 11:37 pm ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
| З опису класу Tween: Загалом, твін автоматично видаляється з джаглера після завершення. Тобто вам треба засунути juggler.add(tween) всередину moveHeroOnPath(), щоб повернути його в джагглер. І ще непогано б твину reset() зробити там же. А взагалі ви з твинами неправильно працюєте: судячи з каментів Даніеля на оф.форумі старлінга, цей клас не розрахований на перевикористання екземплярів. Правильніше було б створювати щоразу новий твін у moveHeroOnPath(), а старі утилізуються автоматично. Поки у вас це не відбувається на кожному апдейті, проблем з продуктивністю не повинно бути:) private function moveHeroOnPath():void // Рух героя var xTo:uint = 64 + path[0].x * 200; var yTo:uint = 44 + path[0].y * 200; var tw: Tween = New Tween (hero, 0.5); tw.moveTo(xTo, yTo); Starling.juggler.add(tw); tween.onComplete = function():void path.shift(); // remove first point if (path.length) moveHeroOnPath(); > else /* Це зайве, тому що. твін і так відійде Starling.juggler.remove(tween); |
| Автор: | TheRabbit[ Нд лютого 09, 2014 12:20 am ] |
| Заголовок повідомлення: | Re: Starling Не вдається зациклити анімацію Juggler'а. |
| Тримайте прототип коду. У ньому не все оптимально, але твоє завдання з головою покриє. Їздить по точках нескінченно. Оновлення шляху відбувається при віджиманні мишки з точки. Під час усунення точки оновлюється лише зв'язувальна лінія. Після того, як вейпоінт точку оновлено - спрацьовує скидання кеша і береться x, y точки. Це щоб ми щоразу незверталися до об'єкта за його координатами. import flash.events.MouseEvent; import flash.events.Event; import flash.utils.Dictionary; import flash.geom.Rectangle; import flash.ui.Mouse; import flash.ui.MouseCursor; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.display.Shape; stage.addEventListener(Event.ENTER_FRAME, onFrame); var pathLayer : Shape = новий Shape(); addChildAt(pathLayer,0); var targets_updated: Boolean = true; var target_x: Number = 0; var target_y: Number = 0; var delta_x: Number = 0; var delta_y: Number = 0; var speed: Number = 5; var nextPoint: int = 0; var totalPoints: int = 7; var activePoint : Sprite; |