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

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

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

Регистрация: Dec 2010
Сообщений: 177
По умолчанию Проблема определения класса ф-ей getDefinitionByName

Инструменты: FlashDevelop 3.3.2 + FlexSDK4

Есть задача создать класс с помощью строки и ф-ии getDefinitionByName();
В корневом каталоге есть класс Robot (файл *.as).
Код AS3:
var itemClass:Class =  getDefinitionByName(“Robot”) as Class;
var robot:* = new itemClass();
В итоге компилятор выдает:
[Fault] exception, information=ReferenceError: Error #1065: Переменная Robot не определена.

Если делаю так, то все работает:

Код AS3:
Robot; // т.е. как бы определяем класс, и компилятор сразу его видит/определяет …
 
var itemClass:Class =  getDefinitionByName(“Robot”) as Class;
var robot:* = new itemClass();
Импорт класса Robot тут ни при чем, т.к. перетаскивал класс в подпапку objects писал например:
import objects.Robot;

И опять работает, если только перед вызовом getDefinitionByName, написать класс Robot или ранее с помощью него создать объект обычным способом: new Robot.

Подскажите в чем проблема, почему ф-я getDefinitionByName не может сразу определить класс Robot?


Последний раз редактировалось Alexmody; 07.03.2011 в 11:22.
Старый 07.03.2011, 11:33
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Сразу - не может. Он должен быть где-то указан хоть как-то. Иначе в swf бы вкомпиливался весь наш 40-мегабайтный фреймворк (как пример, а вдруг getDifinionByName захочет какой-то класс найти, нужно быть подготовленным!)
http://www.flasher.ru/forum/blog.php?b=281 - тут можно почерпнуть для себя что-то из комментов.
__________________
тут я

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

Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
getDefinitionByName работает толька с runtime классами , а при случае толька импорта он не превращается в него . У меня есть паралельный вопрос , незнаю стоило открывать новую тему или писать вот здесь .
Вопрос следующий , как все импортированные классы превращать в рантайм классы не обьевляя переменные для всех них ?

Код AS3:
package {
	import flash.display.Sprite;
	import org.papervision3d.objects.primitives.Cone;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.ColorMaterial;
 
	import org.papervision3d.objects.parsers.Max3DS;
	import org.papervision3d.objects.parsers.DAE;
	import org.papervision3d.events.FileLoadEvent;
 
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.materials.BitmapColorMaterial;
	import org.papervision3d.materials.BitmapMaterial;
 
	import fl.controls.TextInput;
 
 
	import org.papervision3d.materials.shadematerials.PhongMaterial;
 
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.shaders.GouraudShader;
	import org.papervision3d.materials.shaders.ShadedMaterial;
	import org.papervision3d.materials.shaders.Shader;
 
	import org.papervision3d.view.AbstractView;
	import org.papervision3d.view.Viewport3D;
 
	import org.papervision3d.cameras.SpringCamera3D;	
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.cameras.DebugCamera3D;
	import org.papervision3d.core.view.IView;
	//import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
 
 
  import org.papervision3d.objects.primitives.Plane;
 
 
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.shaders.FlatShader;
import org.papervision3d.objects.primitives.Sphere;
 
 
 
 
	public class libr extends AbstractView implements IView{
		private var colorMaterial:ColorMaterial;
		private var materialsList:MaterialsList;
		private var cone:Cone;
 
		private var a1:Max3DS;
		private var a2:DAE;
		private var a3:FileLoadEvent;
		private var a4:DisplayObject3D;
		private var a5:BitmapColorMaterial;
		private var a6:BitmapMaterial;
		private var a7:PointLight3D;
 
		private var a8:GouraudMaterial;
		private var a9:GouraudShader;
		private var a10:ShadedMaterial;
		private var a11:Shader;
		private var a12:PhongMaterial;
 
		private var a13:Plane;
 
		private var a14:FlatShadeMaterial ;
		private var a15:FlatShader ;
		private var a16:Sphere ;
 
		private var a17:PointLight3D ;
		//private var a16:Sphere ;
 
 
 
		public function libr(viewportWidth:Number = 550, viewportHeight:Number = 400, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target") {
 
			super();
 
			scene = new Scene3D();
			viewport = new Viewport3D(viewportWidth, viewportHeight, scaleToStage, interactive);
			addChild(viewport);
			renderer = new BasicRenderEngine();
 
			switch(cameraType)
			{
				case CameraType.DEBUG:
					_camera = new DebugCamera3D(viewport);
					break;
				case CameraType.TARGET:
					_camera = new Camera3D(60);
					_camera.target = DisplayObject3D.ZERO;
					break;
				case CameraType.SPRING:
					_camera = new SpringCamera3D();
					_camera.target = DisplayObject3D.ZERO;		
					break;			
				case CameraType.FREE:
				default:
					_camera = new Camera3D(60);
					break;
			}
 
			cameraAsCamera3D.update(viewport.sizeRectangle);
 
			}//end constructor
 
 
			public function get cameraAsCamera3D():Camera3D
        {
 
                return _camera as Camera3D;
        }
 
        /**
         * Exposes the camera as a <code>DebugCamera3D</code>
         */
        public function get cameraAsDebugCamera3D():DebugCamera3D 
        {
                return _camera as DebugCamera3D;
        }
 
 
		}
 
	}
почему это нужно ? я сейчас использую papervision3d для большого проэкта , там кампиляция длитсяа более 1-1.5 минут , и так чтобы избежать этого я создал lib.swf и в нем все классы из фрайворков , загружаю lib.swf в проект и читаю классы из него .

Добавлено через 3 минуты
Цитата:
Сообщение от Aloran Посмотреть сообщение
А к чему такие ухищрения? Чем не устраивает:
Код AS3:
var robot:Robot = new Robot();
robot:Robot а разве класс Robot определена ?
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !!

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
а разве класс Robot определена ?
Если загружать в корневой ApplicationDomain приложения, то после окончания загрузки Вы сможете создавать экземпляры класса Robot при наличии только импорта (если он необходим)
__________________
...вселенская грусть

Старый 07.03.2011, 15:45
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 5  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
Цитата:
Сообщение от КорДум Посмотреть сообщение
Сразу - не может. Он должен быть где-то указан хоть как-то. Иначе в swf бы вкомпиливался весь наш 40-мегабайтный фреймворк (как пример, а вдруг getDifinionByName захочет какой-то класс найти, нужно быть подготовленным!)
http://www.flasher.ru/forum/blog.php?b=281 - тут можно почерпнуть для себя что-то из комментов.
Спасибо, за замечательную статью.
Получается в FD flex компилятор включает класс в swf файл, который где-либо использовался коде (как минимум его наименование), по аналогии, как в FlashIDE, если перетянуть любой клип в главный таймлайн, он включится в итоговый swf или поставить галочку Export for ActionScript.

Прочитав вашу статью, я вспомнил, что в книге Колина Мука это описывалось, и там чтобы экспортить *.as класс в swc из FlashIDE он привел класс (аналогия вашего символьного набора):

Код AS3:
package { 
import com.beavercore.effects.*; 
import flash.display.Sprite; 
public class BeaverCore extends Sprite { 
com.beavercore.effects.TextAni mati on; 
} 
}
Т.е. как видно, совсем не обязательно создавать приватную переменную, достаточно напечатать имя класса. В итоге у меня получилось:

Код AS3:
package com.xxx.common {
import com.xxx.objects.Robot;
import flash.display.Sprite;
 
public final class IncludedClasses extends Sprite{
Robot;
 …
}
}
>>или же следует вкомпилить весь SWC сразу через настройки FD
У меня swc из FlashIDE имеет только графику без кода, я хотел бы включить весь swc (все графические глассы в swf), подскажите где это можно указать в FD? В настройках FD у меня swc подключена в пункте SWC Libraries.

Добавлено через 4 минуты
Цитата:
Сообщение от Vishapakahr Посмотреть сообщение
А к чему такие ухищрения? Чем не устраивает:
Код AS3:
var robot:Robot = new Robot();
Вот тут можно почитать: http://www.anegmetex.com/devblog/201...-po-ego-imeni/

Вообще очень полезная штука getDefinitionByName, главное не злоупотреблять.

Добавлено через 8 минут
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Если загружать в корневой ApplicationDomain приложения, то после окончания загрузки Вы сможете создавать экземпляры класса Robot при наличии только импорта (если он необходим)
Хранение классов в корне это не очень удобно и хорошо, обычно достаточно сложная игра имеет несколько уровней иерархий вложенных папок (пакетов), поэтому в данной ситуации без класса (напр. IncludedClasses) с предварительным объявлением классов, кажется не обойтись.


Последний раз редактировалось Alexmody; 07.03.2011 в 15:58.
Старый 07.03.2011, 16:01
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 6  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
Очевидно надо использовать опцию компилятора: (когда нету ссылок на класс)
Код:
-includes [symbol] [...]
    a list of symbols to always link in when building a SWF (advanced,
    repeatable)
Цитата:
подскажите где это можно указать в FD? В настройках FD у меня swc подключена в пункте SWC Libraries.
выше есть другой пункт:
SWC Include Libraries
__________________
...

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

Регистрация: Dec 2010
Сообщений: 177
Спасибо, всем за разнообразное количество ответов и их полноту.

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

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

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


 


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


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