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

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

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

Регистрация: Mar 2014
Сообщений: 27
Question Удаление объекта при клике по нему

Приветствую всех.
Я новичок и это мой первый пост на форуме.

Столкнулся с задачей, для которой нашел на форуме решение: Удалить объект из массива по клику на него на сцене - http://www.flasher.ru/forum/showthread.php?t=206342

Немного изменив код под себя, столкнулся с ошибкой:
Код:
ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
at flash.display::DisplayObjectContainer/removeChild()
at Main/mouseClickHandler()
Вроде все работает за исключением удаления объектов.

Привожу код:

Код AS3:
package {
 
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
 
	public class Main extends MovieClip	{
 
		var objectList:Array = new Array();
 
		public function Main() {
			var A:a = new a();
			objectList.push(A);
			addChild(A);
			A.x = 0; 
			A.y = 0;
 
			var B:b = new b();
			objectList.push(B);
			addChild(B);
			B.x = 150;
			B.y = 0;
 
			var C:c = new c();
			objectList.push(C);
			addChild(C);
			C.x = 300;
			C.y = 0;
 
			stage.addEventListener(MouseEvent.CLICK, mouseClickHandler);
		}
 
		function mouseClickHandler(event:MouseEvent) {
			var currObj:MovieClip = event.target as MovieClip;
			if (currObj) {
				removeChild(currObj);
				objectList.splice(objectList.indexOf(currObj), 1);
			}
		}
 
	}
 
}


Последний раз редактировалось lesnoj; 13.03.2014 в 16:25.
Старый 11.03.2014, 01:24
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 2  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Скорее всего у вас есть вложенные визуальные элементы, которые реагируют на мышь, внутри ваших A B C.
Попробуйте написать:
Код AS3:
A.mouseChildren = false;

Старый 11.03.2014, 02:52
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 3  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Код AS3:
function mouseClickHandler(event:MouseEvent) {
			var currObj:MovieClip = event.target as MovieClip;
			if (currObj) {
                               stage.removeEventListener(MouseEvent.CLICK, mouseClickHandler);
				removeChild(currObj);
				objectList.splice(objectList.indexOf(currObj), 1);
			}
		}
Не уверен, но когда у меня была подобная проблема, я удалял слушатель и объект. В итоге объект удалялся без ошибок

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

Регистрация: Mar 2014
Сообщений: 27
Работает со следующим кодом:
Код AS3:
function mouseClickHandler(event:MouseEvent) {
	var currObj:MovieClip = event.target as MovieClip;
	if (currObj) {
		var displayObject:DisplayObject = (DisplayObject) (event.target);
		displayObject.parent.removeChild(displayObject);
		objectList.splice(objectList.indexOf(currObj), 1);
	}
}
Добавлено через 6 минут
Так же работают все предложенные варианты. Спасибо.

Старый 13.03.2014, 11:23
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 5  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
не понятно только зачем 2 раза делать преобразование типов, и по хорошему нужно знать родителя, чтобы не было такой записи
Код:
currObj.parent
Код AS3:
function mouseClickHandler(event:MouseEvent) {
	var currObj:MovieClip = event.target as MovieClip;
	if (currObj) {
 
		currObj.parent.removeChild(currObj);
		objectList.splice(objectList.indexOf(currObj), 1);
	}
}

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Код AS3:
var displayObject:DisplayObject = (DisplayObject) (event.target);
Что это за хрень? ) В ас3 приведение к типу делается не так, а так:
Код AS3:
var displayObject:DisplayObject = event.target as DisplayObject;

Старый 13.03.2014, 16:24
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 7  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Подскажите, какие корректировки нужно внести, чтобы вместо удаления, происходило проигрывание анимации MC, по которому был совершен клик? И если будет не трудно, то прокомментируйте пожалуйста каждую строку подробно.

Код AS3:
function mouseClickHandler(event:MouseEvent) {
	var currObj:MovieClip = event.target as MovieClip;
	if (currObj) {
		var displayObject:DisplayObject = event.target as DisplayObject;
		displayObject.parent.removeChild(displayObject);
	}
}
Я только начал изучать AS3, но такое ощущение, что чем больше узнаю, тем меньше понимаю. Вроде немного с php знаком и jQuery ежедневно использую в работе, но AS3 с его классами и списком отображения до сих пор для меня остается неприступной крепостью Такое ощущение что не хватает ни конкретного, а обобщенного понимания, как в нем все устроено.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Код AS3:
function mouseClickHandler(event:MouseEvent) {
       if (event.target is MovieClip) { // проверяем, чтобы объект был действительно мувиклипом
	   var currObj:MovieClip = event.target as MovieClip;
	   currObj.gotoAndPlay(0); // переходим в первый кадр и начинаем проигрывание
       }
}

Старый 13.03.2014, 17:34
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 9  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
  1. caseyryan, данный код не работает.
    Код AS3:
    package {
    	import flash.display.MovieClip;
    	import flash.events.MouseEvent;
    	import flash.display.DisplayObject;
     
    	public class Main extends MovieClip	{		
    		public function Main() {
    			var A:a = new a();
    			addChild(A);
    			A.x = 0; 
    			A.y = 0;
     
    			var B:b = new b();
    			addChild(B); 
    			B.x = 150;
    			B.y = 0;
     
    			var C:c = new c();
    			addChild(C);
    			C.x = 300;
    			C.y = 0;
     
    			stage.addEventListener(MouseEvent.CLICK, mouseClickHandler);
    		}
     
    		function mouseClickHandler(event:MouseEvent) {
    			if (event.target is MovieClip) {
    				var currObj:MovieClip = event.target as MovieClip;
    				currObj.gotoAndPlay(0);
    			}
    		}
     
    	}
     
    }
  2. Код AS3:
    if (event.target is MovieClip) { // проверяем, чтобы объект был действительно мувиклипом
    А как он может не быть мувиклипом, если слушатель установлен на мувиклип? Или данная проверка это чтото вроде правил хорошего тона в AS3?
  3. Код AS3:
    var currObj:MovieClip = event.target as MovieClip;
    Если я правильно понимаю, тут создается ссылка на объект по которому был совершен клик. Нельзя ли к нему обратиться напрямую по имени экземпляра? Ведь с ним есть связь через слушатель и нам в конце концов известно его имя:
    Код AS3:
    var A:a = new a();
  4. Есть ли возможность вывести некую визуальную карту объектов в списке отображения и их связей? Например как это делается с массивами в php:
    Код:
    var_dump()
    или
    Код:
    print_r()


Последний раз редактировалось lesnoj; 13.03.2014 в 18:32.
Старый 13.03.2014, 20:04
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 10  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
А как он может не быть мувиклипом, если слушатель установлен на мувиклип?
stage - это не мувиклип. Мувиклипом у вас является документ класс, который лежит на стейдж. Большинство новичков путаются в этом, и часто считают что методы addChild() addEventListener() и т.д. равнозначны stage.addChild(), stage.addEventListener() ... Хотя на самом деле они эквивалентны этому this.addChild(), this.addEventListener()...
Цитата:
Если я правильно понимаю, тут создается ссылка на объект по которому был совершен клик. Нельзя ли к нему обратиться напрямую по имени экземпляра? Ведь с ним есть связь через слушатель и нам в конце концов известно его имя:
Нет, нельзя. Имя это условность. В данном случае A (кстати это моветон, писать названия переменных с большой буквы, а названия классов с маленькой, надо наоборот) не является именем объекта, как это происходит с instance name во flash ide. Это название переменной, причем локальной, доступной только в конструкторе Main. В обработчике mouseClickHandler к ней уже нет никакого доступа.

Цитата:
Есть ли возможность вывести некую визуальную карту объектов в списке отображения и их связей? Например как это делается с массивами в php:
нет

Цитата:
caseyryan, данный код не работает.
А так?
Код AS3:
stage.addEventListener(MouseEvent.CLICK, mouseClickHandler, true);

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

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

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


 


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


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