![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Переписал свой код по созданию частиц, теперь удобней с ним работать (двумерный массив).
Чтобы избежать этого "косяка" с зависанием стандартного Твина я решил очищать массив как он заполняется под сотню Спрайтов и их твинов. По коду видно, я хотел бы, чтобы спрайты и твины создавались снова с 0 в массиве, после того, как их число дойдет до сотни. Но, увы и ах, ссылка в массив не заменяет старые твины и спрайты. Как мне сделать проверку на существование уже этих твинов и спрайтов и полностью их стереть? Вы понимаете, думаю, о чем я. Помните игры, экшны, где следы от пуль на стене не бесконечные. Старые особенно. Например Half-Life 1. Там если есть к примеру 50 следов, следующие следы появляются с удалением самых старых следов. Так же и я хочу сделать. Частиц 100 - начинает с начала. Самые первые частицы и следующие за ними по очереди исчезают. На выводе - непрерывное создание частиц, никаких зависаний. Вот код, тоже можно протестировать: import fl.transitions.*; import fl.transitions.easing.*; import flash.events.Event; import flash.display.MovieClip; import flash.display.Sprite; var where:String = new String(); var c_radius:Number = new Number(); var _ypos:Number = new Number(); var ground:Number = new Number(); var howlong:Number = new Number(); var howlongdrop:Number = new Number(); var maxnumber:Number = new Number(20); var totalnumber:Number = new Number(0); var particles:Array = new Array(); ground = stage.stageHeight; function startspawning() { addEventListener(Event.ENTER_FRAME, spawn); } function stopspawning() { removeEventListener(Event.ENTER_FRAME, spawn); } function spawn(e:Event) { if (totalnumber > maxnumber) { totalnumber = 0; } howlongdrop = Math.ceil(Math.random() * 300) / 100; howlong = Math.ceil(Math.random() * stage.stageWidth); _ypos = Math.ceil(Math.random() * stage.stageHeight); c_radius = Math.ceil(Math.random() * 10); particles[totalnumber] = new Array(); particles[totalnumber][0] = new Sprite(); particles[totalnumber][0].graphics.beginFill(0x000000, 2); particles[totalnumber][0].graphics.drawCircle(0,0,c_radius); particles[totalnumber][0].graphics.endFill(); particles[totalnumber][0].y = _ypos; particles[totalnumber][0].alpha = Math.ceil(Math.random() * 100) / 100; addChild(particles[totalnumber][0]); particles[totalnumber][1] = new Tween(particles[totalnumber][0],"x",Strong.easeOut,particles[totalnumber][0].x,particles[totalnumber][0].x + howlong,2,true); particles[totalnumber][2] = new Tween(particles[totalnumber][0],"y",Bounce.easeOut,particles[totalnumber][0].y,ground,howlongdrop,true); totalnumber++; } startspawning(); Для теста можете условие про totalnumber>maxnumber полностью удалить - посмотрите, зависания исчезнут, но все начнет заполняться пока не затормозит как невесть что. Хотелось бы эти вот "зависалки" и удалять ![]() Добавлено через 1 час 11 минут По сути существует два варианта. Оставить массив расширяться до бесконечности просто делая removeChild у каждой частицы после окончания движения, или же сделать как я хотел - с 100 элементов максимум. Первый вариант уже есть готовый, но я не знаю, чем чревато бесконечно расширение массива и по моему более оптимизированный вариант с удалением старых, только я не знаю как. |
|
|||||
|
Эх...
.... Все маты-перематы я уже написал, а потом удалил. Нервы мои немного успокоились. Перейдем к делу. Все ваши частици (они же Спрайты) занимают много памяти, все их твинеры тоже не подарочки... Все создания экземпляров классов занимают время. Теперь умножим эти расходы на 100 (предел количества частиц) и получим внушительный результат. Но если не ограничить количество частиц, тогда все нормально - ваш ролик сожрет все ресурсы и либо плеер его "выплюнет", либо вы сами его выключите (возможно даже через диспетчер задач если сильно зависнет), так что это безобразие долго не продлится ![]() С вашим кодом не особо знакомился, но могу сказать одно - "ПЛОХО". Подойдите к задаче следующим образом: Создаете все, что связано с частцей кждий раз, пока длинна массива частиц не будет равна максимальному их количеству. Если уже достаточно, тогда выбрасываете из массыва частиц првую, ту что с индексом "0" (Array#shift()), переопределяете ее параметры и добавляете ее в конец массива (Array#push()). Таким образом у вас не только расход памяти не превысит заданый димит, но и тратиь процессорное время на создание новой частици не прийдется! Также посоветовал бы создать отдельный класс для частицы, который умеет начинать "жизнь" (в вашем коде это рисование круга определенного радиуса, установка определенной прозрачности, назначение начальных координат и т.д.), собственно жить (у вас - твинить свое положение) и умирать (останавливать твиннер, удалять нарисованный круг, сбрасывать прозрачность). Потом создадите класс коллекции частиц, который будет их создавать, назначать им стартовые параметры существования, следить за количеством частиц и по необходимости брать самую старую, убивать ее и воскрешать с новыми параметрами. Конечно, в итоге получится больше кода, но он будет понятнее и не будеть жрать больше ресурсов, чем положено. |
|
|||||
|
ParticleSystemExample.rar - наваял пример того, что написал в предыдущем посте.
На сцене 60 секунд будут выбрасываться черные круги разних размеров, разной прозрачности, на разной высоте, в разных горизонтальных направлениях и падать на "дно" ролика. Перед компиляцией поставил лимит 1000 частиц. |
|
|||||
|
Большое спасибо за потраченное время. Я постараюсь сделать теперь свой вариант с классами.
|
|
|||||
|
.
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 22:09. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|