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

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

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

Регистрация: Sep 2009
Сообщений: 3
По умолчанию вопрос по As3, удаление объекта, stage

Здравствуйте, столкнулся с проблемой. Плиз хелпи ми ))
As3 изучаю не так давно
Собственно трабла:

Есть Document Class
Код AS3:
package {
	import flash.display.Sprite;
 
	// Класс Tetris
	public class Tetris extends Sprite {
 
		public var play_screen:Game;
 
		// Конструктор
		public function Tetris() {
			play_the_game();
		}
 
		public function play_the_game() {
			if (play_screen) {
				removeChild(play_screen);
				play_screen = null;
			}
			play_screen = new Game(this);
			addChild(play_screen);
		}
	}
}
далее есть класс Game:
Код AS3:
package {
    import flash.display.Stage;
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.events.*;
 
    public class Game extends Sprite {
 
		public var main_class:Tetris;		
 
		var block:BlockType;
		// Конструктор класса Game
		public function Game(passed_class:Tetris)
		{
			main_class = passed_class;
			addEventListener(Event.ENTER_FRAME, render, false, 0, true);
 
	   	} // Game
 
                function render(e:Event):void {
			if (!isBlock)
			{
				// пробуем сгенерировать одну фигуру
				block = new BlockType(this);
				main_class.stage.addChild(block);
			}
                } // render()
	}
}
Далее класс BlockType:
Код AS3:
package {// Класс для типов блоков, фигур
	import flash.display.Stage;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.ui.*;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
	public class BlockType extends Sprite{
 
		private var gameClass:Game;
 
		var stageRef:Stage;
 
		// конструктор
		public function BlockType (Cls:Game): void
		{
			gameClass = Cls;
			this.stageRef = gameClass.stage;
			makeBlock();
		} // BlockType
 
		// строим блок на сцене
		function makeBlock ()
		{
			for (var i:int = 0; i < 4; i++)
				for(var j:int = 0 ; j < 4; j++)
				{
					if(bMatrix[i] != null)
						if (bMatrix[i][j] != null && bMatrix[i][j] == 1)
						{
							var box:Box = new Box(this.stageRef);
							box.x = j*20;
							box.y = i*20;
							this.addChild(box);
							boxArray.push(box);
						}
				}
		} // makeBlock()
 
		function timerHandler (e:Event)
		{
			// удаляем боксы
			for each (var obj:* in boxArray)
			{
				gameClass.tetrisMatrix[(obj.x+this.x)/20][(obj.y+this.y)/20] = obj;
					obj.removeSelf();
				removeSelf();
			}
 
		} // timerHandler()
 
		// удаление блока
		private function removeSelf() : void 
		{
			if (gameClass.contains(this))
				gameClass.removeChild(this);
		} // removeSelf()
 
 
	}
}
Далее класс Box:
Код AS3:
package {
	import flash.display.Sprite;
	import flash.display.Stage;
 
	public class Box extends Sprite {
 
		private var stageRef:Stage;
 
		// Конструктор класса Box
		public function Box(stageRef:Stage) 
		{
			this.stageRef = stageRef
		} // Box
 
		// удаление бокса
		public function removeSelf() : void 
		{
//			if (stageRef.contains(this))
				stageRef.removeChild(this);
		} // removeSelf()
 
	}
}
Выводит ошибку:
Код AS3:
ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
Бокс не удаляется. Парюсь и не пойму че к чему.
Косяк именно в методе removeSelf класса Box.


Последний раз редактировалось KaBELSEA; 27.09.2009 в 13:47.
Старый 27.09.2009, 15:03
divinus вне форума Посмотреть профиль Отправить личное сообщение для divinus Найти все сообщения от divinus
  № 2  
Ответить с цитированием
divinus
 
Аватар для divinus

Регистрация: Dec 2005
Адрес: мухосранск
Сообщений: 661
Отправить сообщение для divinus с помощью ICQ
даже разбираться не хочется, зачем такие жесткие связи, мне наверно уже не понять.
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет...

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

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Первое:
Код AS3:
if (play_screen) {
	removeChild(play_screen);
	play_screen = null;
}
То, что play_screen не равен null еще не говорит о том, что он есть в дисплей листе
Надо так:
Код AS3:
if (play_screen && this.contains(play_screen)) {
	removeChild(play_screen);
	play_screen = null;
}
Ваще жесть:
Код AS3:
main_class.stage.addChild(block);
Хотя-бы так, хотя изначально пипец (к слову сказать обращения к родителям нужно свести к минимуму):
Код AS3:
main_class.addChild(block);
Ну и да, в последнем классе раскомментируйте проверку.
__________________
#flasher@irc.trg.ru:6667

Старый 27.09.2009, 16:05
KaBELSEA вне форума Посмотреть профиль Отправить личное сообщение для KaBELSEA Найти все сообщения от KaBELSEA
  № 4  
Ответить с цитированием
KaBELSEA

Регистрация: Sep 2009
Сообщений: 3
Obi. Фенк, ошибку понял.

Переписал все по нормальному....
Изменил класс Box
не привязывался к родителю.

И все норм. Оч рад, спасиб )))

Больше такой *****Код наврятли сюда выложу

Добавлено через 13 минут
Тему можно закрыть!

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

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

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


 


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


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