|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
Проблема определения класса ф-ей getDefinitionByName
Инструменты: FlashDevelop 3.3.2 + FlexSDK4
Есть задача создать класс с помощью строки и ф-ии getDefinitionByName(); В корневом каталоге есть класс Robot (файл *.as). var itemClass:Class = getDefinitionByName(“Robot”) as Class; var robot:* = new itemClass(); [Fault] exception, information=ReferenceError: Error #1065: Переменная Robot не определена. Если делаю так, то все работает: Robot; // т.е. как бы определяем класс, и компилятор сразу его видит/определяет … var itemClass:Class = getDefinitionByName(“Robot”) as Class; var robot:* = new itemClass(); import objects.Robot; И опять работает, если только перед вызовом getDefinitionByName, написать класс Robot или ранее с помощью него создать объект обычным способом: new Robot. Подскажите в чем проблема, почему ф-я getDefinitionByName не может сразу определить класс Robot? Последний раз редактировалось Alexmody; 07.03.2011 в 11:22. |
|
|||||
Сразу - не может. Он должен быть где-то указан хоть как-то. Иначе в swf бы вкомпиливался весь наш 40-мегабайтный фреймворк (как пример, а вдруг getDifinionByName захочет какой-то класс найти, нужно быть подготовленным!)
http://www.flasher.ru/forum/blog.php?b=281 - тут можно почерпнуть для себя что-то из комментов.
__________________
тут я |
|
|||||
Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
|
getDefinitionByName работает толька с runtime классами , а при случае толька импорта он не превращается в него . У меня есть паралельный вопрос , незнаю стоило открывать новую тему или писать вот здесь .
Вопрос следующий , как все импортированные классы превращать в рантайм классы не обьевляя переменные для всех них ? 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; } } } Добавлено через 3 минуты robot:Robot а разве класс Robot определена ?
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !! |
|
|||||
Цитата:
__________________
...вселенская грусть |
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
Цитата:
Получается в FD flex компилятор включает класс в swf файл, который где-либо использовался коде (как минимум его наименование), по аналогии, как в FlashIDE, если перетянуть любой клип в главный таймлайн, он включится в итоговый swf или поставить галочку Export for ActionScript. Прочитав вашу статью, я вспомнил, что в книге Колина Мука это описывалось, и там чтобы экспортить *.as класс в swc из FlashIDE он привел класс (аналогия вашего символьного набора): package { import com.beavercore.effects.*; import flash.display.Sprite; public class BeaverCore extends Sprite { com.beavercore.effects.TextAni mati on; } } package com.xxx.common { import com.xxx.objects.Robot; import flash.display.Sprite; public final class IncludedClasses extends Sprite{ Robot; … } } У меня swc из FlashIDE имеет только графику без кода, я хотел бы включить весь swc (все графические глассы в swf), подскажите где это можно указать в FD? В настройках FD у меня swc подключена в пункте SWC Libraries. Добавлено через 4 минуты Цитата:
Вообще очень полезная штука getDefinitionByName, главное не злоупотреблять. Добавлено через 8 минут Хранение классов в корне это не очень удобно и хорошо, обычно достаточно сложная игра имеет несколько уровней иерархий вложенных папок (пакетов), поэтому в данной ситуации без класса (напр. IncludedClasses) с предварительным объявлением классов, кажется не обойтись. Последний раз редактировалось Alexmody; 07.03.2011 в 15:58. |
|
|||||
Очевидно надо использовать опцию компилятора: (когда нету ссылок на класс)
-includes [symbol] [...] a list of symbols to always link in when building a SWF (advanced, repeatable) Цитата:
SWC Include Libraries
__________________
... |
|
|||||
Регистрация: Dec 2010
Сообщений: 177
|
Спасибо, всем за разнообразное количество ответов и их полноту.
|
Часовой пояс GMT +4, время: 15:43. |
|
« Предыдущая тема | Следующая тема » |
|
|