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

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

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

Регистрация: Nov 2012
Сообщений: 43
Arrow Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего

Режим отладки
Код:
ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
	at flash.display::DisplayObjectContainer/removeChild()
	at src::Bullet/clearBullet()[E:\FlashWorks\FerdnProject\src\Bullet.as:69]
	at src::Enemy/delBullets()[E:\FlashWorks\FerdnProject\src\Enemy.as:90]
Код AS3:
package src {
	import flash.display.Sprite;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.MovieClip;
	import flash.events.Event;
    import flash.events.MouseEvent;
 
	public class Bullet extends MovieClip{
	private var speedx:Number = 0;
	private var speedy:Number = 0;
	private var DEFAULT_BUL_SIZE:int = 6;
	private var DEFAULT_LIFE:int = 150; //Количество фремов к-е будет жить пуля 
	private var DEFAULT_COLOR:uint = 0xFFCC66;
	private var TAKE_POSITIONX:int;
	private var TAKE_POSITIONY:int;
	private var BULLET:*;
 
		public function Bullet(TAKE_X:int, TAKE_Y:int) {
			var bullet:Sprite = new Sprite();
			BULLET = bullet;
			TAKE_POSITIONX = TAKE_X;
			TAKE_POSITIONY = TAKE_Y;
			bullet.graphics.lineStyle(0,DEFAULT_COLOR,0);
			bullet.graphics.beginFill(DEFAULT_COLOR, 1);
			bullet.graphics.drawRect(TAKE_POSITIONX, TAKE_POSITIONY, DEFAULT_BUL_SIZE, DEFAULT_BUL_SIZE);
			bullet.graphics.endFill();
			addChild(BULLET);
 
			addEventListener(Event.ADDED, funcAttack);
			addEventListener(Event.ENTER_FRAME, polet);
		}
 
		private function funcAttack(event:Event):void{
			this.x += DEFAULT_BUL_SIZE/2;
			this.y += DEFAULT_BUL_SIZE/2;
 
			var xc:Number = mouseX - TAKE_POSITIONX;	
			var yc:Number = mouseY - TAKE_POSITIONY;
			var tan:*;
			var ugol:*;
 
			if(mouseX > TAKE_POSITIONX){
				tan = yc/xc; 
				ugol = Math.atan(tan)*57;
			}
			if(mouseX < TAKE_POSITIONX){
				tan = yc/xc; 
				ugol = Math.atan(tan)*57;
			}
 
			if(mouseX > TAKE_POSITIONX){
				speedx = 7*Math.cos(ugol*(Math.PI/180));
				speedy = 7*Math.sin(ugol*(Math.PI/180));
			}
 
			if(mouseX < TAKE_POSITIONX){
				speedx = -7*Math.cos(ugol*(Math.PI/180));
				speedy = -7*Math.sin(ugol*(Math.PI/180));
			}
		}	
 
		private function polet(e:Event):void{
			this.x += speedx / 2;
			this.y += speedy / 2;
		}
 
		public function clearBullet():void{
			removeChild(BULLET); //69 СТРОКА ЗДЕСЬ
 
			removeEventListener(Event.ADDED, funcAttack);
			removeEventListener(Event.ENTER_FRAME, polet);
		}
	}
}
Я таки не пойму в чем проблема, в иных классах removeChild работает вне функции где был addChild

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Вроде все хорошо, не считая некоторых моментов. Мой диагноз - множественный вызов clearBullet().
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 06.12.2012, 21:26
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 3  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
Код AS3:
removeChild(BULLET); //69 СТРОКА ЗДЕСЬ
Поменяй на
Код AS3:
if(contains(BULLET)) removeChild(BULLET);
в иных классах removeChild работает вне функции где был addChild - ты заблуждаешься. Если объекта нет в списке отображения эта ошибка будет возникать всегда. Для уточнения есть ли объект в списке есть функция contains

Старый 06.12.2012, 21:32
PasserBy вне форума Посмотреть профиль Найти все сообщения от PasserBy
  № 4  
Ответить с цитированием
PasserBy
Banned

Регистрация: Nov 2012
Сообщений: 43
Цитата:
Сообщение от inozemcev Посмотреть сообщение
Код AS3:
removeChild(BULLET); //69 СТРОКА ЗДЕСЬ
Поменяй на
Код AS3:
if(contains(BULLET)) removeChild(BULLET);
в иных классах removeChild работает вне функции где был addChild - ты заблуждаешься. Если объекта нет в списке отображения эта ошибка будет возникать всегда. Для уточнения есть ли объект в списке есть функция contains
Помогло, спасибо.

Но что значит вне класса?...
addChild и removeChild прописаны в одном классе, или же Вы имеете ввиду, что вызов removeChild из других классов провоцирует "сторонний" вызов removeChild?

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
contains хитрая функция. В некоторых случаях ошибка сохранится
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
"гарантированная" конструкция

Код AS3:
if (this._bullet && this._bullet.parent === super) {
	super.removeChild(this._bullet);
}
__________________
местонахождение

Старый 06.12.2012, 21:43
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 7  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
GBee дал правильный диагноз - множественный вызов clearBullet(), а точнее ты методом clearBullet() пытался убрать объект которого уже не было в списке отображения.

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
я только по этому и написал, с моим подходом ошибок в подобных ситуациях не возникнет.
__________________
местонахождение

Старый 06.12.2012, 21:59
PasserBy вне форума Посмотреть профиль Найти все сообщения от PasserBy
  № 9  
Ответить с цитированием
PasserBy
Banned

Регистрация: Nov 2012
Сообщений: 43
Цитата:
Сообщение от inozemcev Посмотреть сообщение
GBee дал правильный диагноз - множественный вызов clearBullet(), а точнее ты методом clearBullet() пытался убрать объект которого уже не было в списке отображения.
Спасибо, это вероятнее всего.

Цитата:
Сообщение от СлаваRa Посмотреть сообщение
я только по этому и написал, с моим подходом ошибок в подобных ситуациях не возникнет.
Не могли бы Вы объяснить свой код?

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

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
А что тут объяснять то?
Проверили, если вообще _bullet и сранили его родителя с super (только не пойму, почему не с this). Логично, что если parent равен super'у, то это значит что _bullet лежит на сцене и его можно removeChild.

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

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

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


 


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


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