Показать сообщение отдельно
Старый 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 элементов максимум.

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