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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.01.2011, 11:37
GrabMaPaw вне форума Посмотреть профиль Отправить личное сообщение для GrabMaPaw Найти все сообщения от GrabMaPaw
  № 1  
Ответить с цитированием
GrabMaPaw

Регистрация: Oct 2009
Сообщений: 3
По умолчанию Не удаляются элементы массива

Здравствуйте!
Я в данный момент только начал изучать ActionScript и в учебных целях решил сделать игру аналогичную вот этой.
У меня возникла проблема с генерацией "потолка" и "пола". Вот какой алгоритм я избрал:
1. У нас есть "кирпичик" в виде movieclip'а, из которого мы будем строить неровную поверхность.
2. В цикле Event.ENTER_FRAME:
  • добавляем кирпичик на сцену и помещаем его в массив
  • для последнего элемента массива устанавливаем положение на экране
  • пробегаем по каждому элементу массива, где проверяем: если элемент массива вышел за пределы экрана, то удаляем его

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

Вот кусочек кода, который за это отвечает:
Код AS3:
for (var i:uint = 0; i < wallArr.length; i++) {
	if (wallArr[i].x < 0) {
		trace(i+" is OUT!");
		wallArr.splice(i,1);
	}
}
Как видите, для проверки корректности работы я трейсом вывожу на экран элементы массива, которые удовлетворяют этому условию. Всё выводится правильно - как только movieclip'ы начинают выходить за пределы экрана, мы начинаем получать "0 is OUT!". Соответственно, если закомментировать "wallArr.splice(i,1);" то начинаем получать номера всех элементов массива, находящихся за пределами экрана. То есть, условие поставлено верно и, вроде бы, элементы массива даже удаляются.
Однако, если трейсить wallArr.length, то мы увидим, что массив абсолютно не уменьшается. И в результате, когда он разрастается до неимоверных пределов, всё начинает дико тормозить (что естественно).
И ещё, справедливы ли мои подозрения, что у меня неправильный подход, и удаление элемента из массива в данном случае не повлечёт за собой удаление movieclip'a со сцены?

Я, честно говоря, уже голову сломал над этой загадкой и был бы благодарен, если бы кто-то смог пролить хоть какой-то свет на неё. Искал уже не только в рунете, но и в зарубежном интернете подобные проблемы - ничего нет.

Кстати, сдаётся мне, что тут можно сделать всё проще, но я не знаю, как. Может, можно в AS3 как-то удалить со сцены все movieclip'ы, которые удовлетворяют тем или иным условиям (в данном случае выходят за пределы экрана)?


Последний раз редактировалось iNils; 08.01.2011 в 11:42.
Старый 08.01.2011, 12:47
vinch вне форума Посмотреть профиль Отправить личное сообщение для vinch Найти все сообщения от vinch
  № 2  
Ответить с цитированием
vinch

Регистрация: Feb 2010
Сообщений: 95
1) Да, при удалении элемента из массива он не удалится со сцены

2) Я особо не вникал проблему, но на лицо промах с циклом. Для простоты заменим клипы числами и поставим задачу удалить из массива числа > 3. Пусть наш массив - [4, 5, 6]. Тогда на каждой итерации будет вот что:

1. i == 0, массив == [5, 6] после удаление i-го элемента
2. i == 1, массив == [5] после удаление i-го элемента
3. i == 2, длина массива == 1 => остановка

После цикла массив == [5]

Как видно, это не то, что нам надо

Старый 08.01.2011, 13:22
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 3  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Код AS3:
for (var i:uint = 0; i < wallArr.length; i++) {
	if (wallArr[i].x < 0) {
		trace(i+" is OUT!");
		wallArr.splice(i,1); 
                       removeChild(MovieClip(wallArr[i]));
                       i--
	}
}


Последний раз редактировалось samana; 08.01.2011 в 13:46.
Старый 08.01.2011, 16:18
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 4  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Цитата:
Сообщение от samana Посмотреть сообщение
Код AS3:
for (var i:uint = 0; i < wallArr.length; i++) {
	if (wallArr[i].x < 0) {
		trace(i+" is OUT!");
		wallArr.splice(i,1); 
                       removeChild(MovieClip(wallArr[i]));
                       i--
	}
}
Можно проще (пройтись с конца массива)

Код AS3:
for (var i:int = wallArr.length -1;i >= 0;i--)
{
   if (wallArr[i].x < 0) 
   {
      trace(i+" is OUT!");
      wallArr.splice(i,1); 
      removeChild(wallArr[i]);
   }
}
и лучше не использовать wallArr.length в цикле


Последний раз редактировалось andrew911; 08.01.2011 в 16:23.
Старый 08.01.2011, 18:56
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 5  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Цитата:
и лучше не использовать wallArr.length в цикле
Преждевременная оптимизация - корень всех зол!
__________________
тонкий тролль, осеянный благодатью

Старый 08.01.2011, 21:26
GrabMaPaw вне форума Посмотреть профиль Отправить личное сообщение для GrabMaPaw Найти все сообщения от GrabMaPaw
  № 6  
Ответить с цитированием
GrabMaPaw

Регистрация: Oct 2009
Сообщений: 3
Уважаемые господа, огромное всем спасибо.
Ваши советы очень помогли, буду многое переосмысливать

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

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

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


 


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


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