Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.08.2012, 06:02
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 1  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
По умолчанию Как проверить существование child и tween и удалить их?

Переписал свой код по созданию частиц, теперь удобней с ним работать (двумерный массив).
Чтобы избежать этого "косяка" с зависанием стандартного Твина я решил очищать массив как он заполняется под сотню Спрайтов и их твинов.
По коду видно, я хотел бы, чтобы спрайты и твины создавались снова с 0 в массиве, после того, как их число дойдет до сотни.
Но, увы и ах, ссылка в массив не заменяет старые твины и спрайты. Как мне сделать проверку на существование уже этих твинов и спрайтов и полностью их стереть?

Вы понимаете, думаю, о чем я. Помните игры, экшны, где следы от пуль на стене не бесконечные. Старые особенно. Например Half-Life 1. Там если есть к примеру 50 следов, следующие следы появляются с удалением самых старых следов.
Так же и я хочу сделать. Частиц 100 - начинает с начала. Самые первые частицы и следующие за ними по очереди исчезают.
На выводе - непрерывное создание частиц, никаких зависаний.

Вот код, тоже можно протестировать:

Код AS3:
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();
Добавлено через 2 минуты
Для теста можете условие про totalnumber>maxnumber полностью удалить - посмотрите, зависания исчезнут, но все начнет заполняться пока не затормозит как невесть что.

Хотелось бы эти вот "зависалки" и удалять

Добавлено через 1 час 11 минут
По сути существует два варианта. Оставить массив расширяться до бесконечности просто делая removeChild у каждой частицы после окончания движения, или же сделать как я хотел - с 100 элементов максимум.

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

Старый 07.08.2012, 09:05
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 2  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Эх...
....
Все маты-перематы я уже написал, а потом удалил. Нервы мои немного успокоились. Перейдем к делу.

Все ваши частици (они же Спрайты) занимают много памяти, все их твинеры тоже не подарочки... Все создания экземпляров классов занимают время. Теперь умножим эти расходы на 100 (предел количества частиц) и получим внушительный результат. Но если не ограничить количество частиц, тогда все нормально - ваш ролик сожрет все ресурсы и либо плеер его "выплюнет", либо вы сами его выключите (возможно даже через диспетчер задач если сильно зависнет), так что это безобразие долго не продлится

С вашим кодом не особо знакомился, но могу сказать одно - "ПЛОХО".

Подойдите к задаче следующим образом:
Создаете все, что связано с частцей кждий раз, пока длинна массива частиц не будет равна максимальному их количеству. Если уже достаточно, тогда выбрасываете из массыва частиц првую, ту что с индексом "0" (Array#shift()), переопределяете ее параметры и добавляете ее в конец массива (Array#push()). Таким образом у вас не только расход памяти не превысит заданый димит, но и тратиь процессорное время на создание новой частици не прийдется!

Также посоветовал бы создать отдельный класс для частицы, который умеет начинать "жизнь" (в вашем коде это рисование круга определенного радиуса, установка определенной прозрачности, назначение начальных координат и т.д.), собственно жить (у вас - твинить свое положение) и умирать (останавливать твиннер, удалять нарисованный круг, сбрасывать прозрачность).
Потом создадите класс коллекции частиц, который будет их создавать, назначать им стартовые параметры существования, следить за количеством частиц и по необходимости брать самую старую, убивать ее и воскрешать с новыми параметрами.

Конечно, в итоге получится больше кода, но он будет понятнее и не будеть жрать больше ресурсов, чем положено.

Старый 07.08.2012, 23:35
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от elder_Nosferatu Посмотреть сообщение
Эх...
....
Все маты-перематы я уже написал, а потом удалил. Нервы мои немного успокоились. Перейдем к делу.
Добавлю, что это шаблон проектирования "пул объектов".
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 07.08.2012, 10:21
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 4  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
ParticleSystemExample.rar - наваял пример того, что написал в предыдущем посте.

На сцене 60 секунд будут выбрасываться черные круги разних размеров, разной прозрачности, на разной высоте, в разных горизонтальных направлениях и падать на "дно" ролика. Перед компиляцией поставил лимит 1000 частиц.

Старый 07.08.2012, 23:14
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 5  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Большое спасибо за потраченное время. Я постараюсь сделать теперь свой вариант с классами.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:45.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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