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

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

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

Регистрация: Jan 2010
Сообщений: 23
По умолчанию Удаление потомков по атрибутам

Здравствуйте! Только начала изучать Flash, поэтому вопрос может показаться глуповатым. И все же, побродив по интернету, так и не нашла ответ на нужный мне вопрос.
Мне надо удались экземпляр класса по значению его атрибута. Т.е. есть класс _myClass, в основном классе я создала экземпляры методом addChild(), и теперь мне надо удалить со сцены некоторые экземпляры, если, например, _myClass.x = 0. Как мне это сделать?
Метод getChildAt(), прокрученный в цикле, выдает ошибку. Может, я где-то запуталась?

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
покажите пациента-то )
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 31.01.2010, 20:08
envy вне форума Посмотреть профиль Отправить личное сообщение для envy Найти все сообщения от envy
  № 3  
Ответить с цитированием
envy

Регистрация: Jan 2010
Сообщений: 23
Сейчас попробую объяснить. Делаю тетрис. Есть класс Tetris - основной, класс block -
public function Block(index:int, initPos:Array) {
super();
_index = index;
for each(var pos:Object in initPos) {
var brick:Brick = new Brick(); к
addChild(brick);
...
И, соответсвенно класс Brick. Т.е. блоки состоят из кирпичиков.
Все сделала, все работает, но когда хочу удалить заполненную строку, не знаю, как обратиться к нужному экземпляру.

function DeleteByY() : void {
for (var i: int = 1; i< numChildren; i++) {
getChildAt(1);
//trace(_brick.x);
}
}
Начала писать вот что, но запуталась. Получается, мне надо удалить brick, который потомок класса block по его атрибуту х - местоположению в стакане тетриса.
Могу, конечно, выслать весь код, но он большой

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

Регистрация: Jun 2007
Адрес: Челябинск
Сообщений: 303
Отправить сообщение для dmitriev с помощью ICQ
Создайте массив, куда будете складывать ваши брики.

Код AS3:
private var _bricks:Array = [];
Потом, в функции где вы двигаете ваши брики, проходите по каждому элементу массива и проверяйте его «y» и удаляйте, если требуется.

Код AS3:
private function moveBricks():void {
     for each(var item:Brick in _bricks) {
          item.y += 20;
          if( item.y > ваша_высота ) {
               var deleteMovie:Brick = _bricks.shift(item);
               deleteMovie.parent.removeChild(deleteMovie); //исправил
               //отпишите от всех лисенеров, если есть и затем удалаяте
               deleteMovie = null; 
 
          }
     }
}
исправил
__________________
O God! The Aftermath.


Последний раз редактировалось dmitriev; 01.02.2010 в 00:09.
Старый 31.01.2010, 20:55
envy вне форума Посмотреть профиль Отправить личное сообщение для envy Найти все сообщения от envy
  № 5  
Ответить с цитированием
envy

Регистрация: Jan 2010
Сообщений: 23
Спасибо! Я как раз по этому пути только что пошла, буду пробовать!

Добавлено через 2 часа 47 минут
Неа, такая идея не прокатила. Выдает ошибку на removeChild - удаляемый объект должен быть потомком вызывающего. Причем в массив все записалось правильно.
Получается, я из класса тетрис пытаюсь напрямую удалить экземпляр класса brick, который был создан в классе блок.
Т.е. надо сначала обратиться к классу block? И никак не обойти?

Старый 01.02.2010, 02:38
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 6  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
после того как фигурка упала, можно всех ее детей перекладывать в общий спрайт (тетрис или как его + заносить в массив), а дальше уже по вышеописанному алгоритму. В ас3 обьекты могут менять контейнеры не напрягаясь.

Старый 01.02.2010, 10:38
envy вне форума Посмотреть профиль Отправить личное сообщение для envy Найти все сообщения от envy
  № 7  
Ответить с цитированием
envy

Регистрация: Jan 2010
Сообщений: 23
Код AS3:
removeChild(_block);
 
	for (k = 0; k < _block.numBricks; k++) {
	bricks.push(_block.getChildAt(k));
	_brick = new Brick();
	addChild(_brick);
	_brick.x = bricks[l].x;
	_brick.y = bricks[l].y;
Вот что сделала на падение блока - переместила в общий спрайт.
Но!
При попытке удалить элемент из массива выдает ту же ошибку. Если массив не менять, удаляет первый брик как надо, но потом, соответственно, выдает ошибку о не соответствии индексов (в массиве элемент есть, а потомка я удалила).



Добавлено через 13 минут
Код AS3:
function DeleteLine(y:int) : void {
		  for (var i: int = 0; i<l; i++) {
			if (bricks[i].y == y) {
				 var deleteMovie:Brick = bricks[i];
				 trace(deleteMovie.y);
				 deleteMovie.parent.removeChild(deleteMovie);
				 deleteMovie = null;
				 bricks[i] = [];
 
				}
			}
			}
Пробовала такой вариант, l - количество бриков. Ошибки не выдает, но ничего не удаляет.

Добавлено через 2 часа 17 минут
Функция shift у массива работает, но без аргумента
Код AS3:
function DeleteLine(y:int) : void {
		 for each(var item:Brick in bricks) {
          //item.y += 20;
		  trace(bricks);
          if( item.y > y - 1 ) {
               var deleteMovie:Brick = bricks.shift();
               deleteMovie.parent.removeChild(deleteMovie); 
               deleteMovie = null; 
           }
     }
			}
Такая конструкция удаляет первые брики, потом выдает ошибку. Помогите, пожалуйста, я уже все просмотрела, а решения найти не могу

Старый 01.02.2010, 14:10
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 8  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
Код AS3:
var bricks:Array = [...];
 
function DeleteLine(yPos:int) : void 
{
	var len:int = bricks.length;
	for(var i:int = 0; i < len; i++)
	{
		var brick:Brick = bricks[i] as Brick;
		if(brick.y >= yPos)
		{
			brick.parent.removeChild(brick);
			bricks.splice(i, 1);
			i--;
			len--;
		}
	}
}
я думаю можно как то так попробовать

Старый 01.02.2010, 14:23
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Код AS3:
brick.parent.removeChild(brick);
на
Код AS3:
if (brick && brick.parent) brick.parent.removeChild(brick);

Старый 01.02.2010, 14:30
envy вне форума Посмотреть профиль Отправить личное сообщение для envy Найти все сообщения от envy
  № 10  
Ответить с цитированием
envy

Регистрация: Jan 2010
Сообщений: 23
И в первом, и во втором варианте выдает ошибку:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display:: DisplayObjectContainer/removeChild()
at Tetris/ :: onTimer()
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()

Добавлено через 4 часа 28 минут
bricks.splice(i, 1); вот на эту строчку выдает
A term is undefined and has no properties. и первую ошибку.
Как же работать с массивом?

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

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

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


 


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


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