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

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

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

Регистрация: Mar 2013
Сообщений: 290
По умолчанию Обнуление при конверсии типов.

Есть следующая функция:

Код AS3:
public static function playInto(mc:DisplayObjectContainer):void 
{
var cont:MovieClip = mc as MovieClip;
trace("mc = ", mc, mc.name);
trace("cont = ", cont, cont.name);
}
Первый трэйс отрабатывает нормально (значит в функцию приходит не null).
А вот второй выдает ошибку:
Цитата:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Если перепрописать первую строчку вот так:
Код AS3:
var cont:MovieClip = MovieClip(mc);
То возникает другая ошибка:
Цитата:
TypeError: Error #1034: Type Coercion failed: cannot convert Clip_container@2df5401 to flash.display.MovieClip.
И как же это понимать, выходит нельзя что-ли вообще конвертировать DOC в MovieClip. Или может быть специфика какая-то влияет.

Старый 10.12.2013, 14:27
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вообще у меня Ваш код работает. Возможно ошибка из-за обращения в статическом методе к не статическим свойствам...
Код AS3:
package 
{
	import flash.display.DisplayObjectContainer;
	import flash.display.MovieClip;
	import flash.display.Sprite;
 
	public class DOCTest extends Sprite 
	{
		private var test:String = 'test';
		public function DOCTest() 
		{
			var mc:MovieClip = new MovieClip();
			mc.name = 'mc';
			DOCTest.test(mc);
		}
		private static function test(doc:DisplayObjectContainer):void
		{
			var mc:MovieClip = doc as MovieClip;
			trace(mc.name);//mc
		}
	}
 
}


Последний раз редактировалось Akopalipsis; 10.12.2013 в 14:41.
Старый 10.12.2013, 14:50
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 3  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Но у вас mc изначально MovieClip, это может влиять на успешность, наверное.
А у меня ссылка на объект которая прилетает в функцию, и ссылка, скорее всего, указывает на объект DOC.

Хотя, точно не знаю.
Объект, который "прилетает" в функцию - это экземпляр класса, который расширяет Sprite.
Я вообще думал у него тип Sprite (ну или MovieClip).

А похоже... стоп, а почему я решил, что это DOC, может это и правда DC...
Можно ли кстати как-то определить на лету, "чьим наследником" является данный объект?
Он так и остается Sprite? Или типность может считатся и как-то иначе, вверх по иерархии уходя.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Вообще у меня Ваш код работает
Ну так если мувиклип передавать, то конечно))) Автор же видимо считает что можно любой контейнер ПЕРЕДЕЛАТЬ в МувиКлип.
Во-первых, as это не конверсия а кастинг, то есть "проба на роль". Возвращается null, если испытуемый не может играть роль, то есть не является сам и не содержит в цепочке наследования нужный класс. При этом не выбрасывается исключение (не генерится ошибка, Error). Ваш Error не при кастинге, а при попытке вызвать у null методы, которых у него нет.
Конверсия это MovieClip(mc). Если конверсия невозможна (по тем же причинам что и выше), то выбрасывается исключение "несоответствие типов". Вообще, никакого волшебного преобразования одного типа в другой нет, если Вы на такое надеялись. Не сделать МувиКлип из других классов. И кастинг, и конверсия в итоге говорят только "можно рассматривать данный экземпляр как экземпляр класса МувиКлип". Но с самим объектом, естественно, ничего при этом не происходит.
__________________
Reality.getBounds(this);

Старый 10.12.2013, 14:54
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Код AS3:
package
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.MovieClip;
	import flash.display.Sprite;
 
	public class DOCTest extends Sprite 
	{
		private var test:String = 'test';
		public function DOCTest() 
		{
			var mc:MovieClip = new MovieClip();
			var sprite:Sprite = new Sprite();
			DOCTest.test(mc);
			DOCTest.test(sprite);
		}
		private static function test(target:DisplayObject):void
		{
			if (target is MovieClip)
			{
				var mc:MovieClip = target as MovieClip;
			}else if (target is Sprite)
			{
				var sprite:Sprite = target as Sprite;
			}
		}
	}
 
}


Последний раз редактировалось Akopalipsis; 10.12.2013 в 15:06.
Старый 10.12.2013, 15:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Akopalipsis, (исправьте "doc" на "target"), и что дальше с этим делать?
if (mc != null)... if (sprite != null)
так что-ли? А сразу нельзя было?))
__________________
Reality.getBounds(this);

Старый 10.12.2013, 15:04
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 7  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Wolsh, интересно, спасибо за разьяснения.
Не знал что это всего лишь роль, думал флэш насильно трансмутирует объект, засовывая его в прокрустово ложе.

Akopalipsis, да точно, можно же и так, а то я уже было полез искать хитрые методы идентификации класса.
Добавил такой блок проверки:
Код AS3:
if (mc is MovieClip)
			{
				trace("is MovieClip");
			}
			else if (mc is DisplayObject)
			{
				trace("is DisplayObject");
			}
			else if (mc is DisplayObjectContainer)
			{
				trace("is DisplayObjectContainer");
			}
			else if (mc is Sprite)
			{
				trace("is Sprite");
			}
			else 
			{
				trace("Holly crap!");
			}
И получилось, что это DisplayObject.
Вы были правы в первом (удаленном) камменте.

А вот почему так..?
Он же extends Sprite. Или все объекты, которые попали в список отображения, автоматически меняют типа на DisplayObject?

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

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Помнится, однажды у меня были проблемы при попытке конвертировать экспортированный MovieClip в собственно MovieClip. Ругался на несовместимость типов и всё тут.

Точно не вспомню как порешалось, но была обнаружена странность: Flash считал что MovieClip с одним кадром это Sprite.

Использовался и Flash Builder (для кастинга) и Flash CS (для экспорта swf).
__________________
adobe AS3 manual

Старый 10.12.2013, 15:12
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
и что дальше с этим делать?
Вот тут я не понял... Если в методе ожидать конкретно mc, то да, можно сделать как Вы написали - if (mc != null). Но скорее всего в методе ожидаются любые классы, которые нужно присвоить на некоторое время какой то переменной и для этого нужно проверить лишь принадлежность к MC либо Sprite. Ну или в крайнем случаи if (target is MovieClip&&target!=null)

Старый 10.12.2013, 15:13
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 10  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
strangedk, кстати у меня похожий случай. (Использую пока только Flash IDE, к слову).

Этой функции передается объект, класс которого в библиотеке создан как MovieClip.
Но он имеет один кадр, и я для него написал еще и кустомный класс, в котором много всего.
Внутри этого кустомного класса, он кстати расширяет Sprite, что... является наверное некоторым косячком : ))
Возможно не стоило вообще ему extends дописывать, ведь в библиотеке этот extends (если я всё правильно понимаю) уже назначен на MovieClip.

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

Теги
конверсия типов

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

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


 


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


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