После долгих поворотов и поломки Flash я получил решение своей проблемы.Спасибо Стивену Брайчу за помощь в правильном направлении.
Хорошо, так что это решение немного сложное (и хакерское), но оно решает проблемы, которые я ранее обсуждал.
Сначала вам понадобится основная функция, которая просматривает все экранные объекты в конкретном мувиклипе.Я назвал мой LayerInIDE
.
Нужны две функции.ReplaceEnts
и Recreate
.ReplaceEnts
просматривает все объекты и определяет, простираются ли они от BaseClass
.Если они это сделают, он идет вперед и бросает их через Recreate
.Recreate
берет исходный класс и позицию и воссоздает класс, позволяющий нам правильно обращаться к активу во время выполнения.
import Game.entities.MyEntity;
import Game.entities.BaseClass;
import Game.entities.Layer;
var LayerInIDE:Layer = new Layer();
stage.addChild( LayerInIDE );
ReplaceEnts( LayerInIDE );
function ReplaceEnts( layer:Layer ):void
{
for ( var i:int = 0; i < layer.numChildren; i++ )
{
// Get the display object.
var original:DisplayObject = layer.getChildAt( i );
// Make sure we're only doing this to objects that extend from BaseClass
if ( original is BaseClass )
{
// Get the original class
var originalName:String = getQualifiedClassName( original );
var originalClass:Class = getDefinitionByName( originalName ) as Class;
// Remove the original
layer.removeChild( original );
// Recreate it with the original class
// Make sure we keep the original position and rotation.
var bc = Recreate( originalClass, original.x, original.y, original.rotation );
layer.addChild( bc );
// Test functions
trace( bc ); // outputs: [object MyEntity]
bc.TestFunc(); // outputs: test
bc.BaseTest(); // outputs: base
}
}
}
// This is the core function that does all the work.
// It recreates the entity with the proper class and sets it to its original position.
function Recreate( entClass:Class, iPosX:int = 0, iPosY:int = 0, iRot:int = 0 ):BaseClass
{
var newEnt:BaseClass = new entClass();
newEnt.x = iPosX; newEnt.y = iPosY;
newEnt.rotation = iRot;
return newEnt;
}
Тогда BaseClass
содержит:
package Game.entities
{
import flash.display.MovieClip;
public class BaseClass extends MovieClip
{
// The example function as mentioned above in the ReplaceEnts function.
public function BaseTest():void
{
trace( "base" );
}
}
}
После этоговсе готово, нам нужно также сделать класс MyEntity
:
package Game.entities
{
public class MyEntity extends BaseClass
{
// The example function as mentioned above in the ReplaceEnts function.
public function TestFunc():void
{
trace( "test" );
}
}
}
Просто последнее замечание, Games.entities.Layer
- это просто MovieClip
.Я только создал свой собственный класс для этого в организационных целях.
Решение здесь простое.Когда пользователь перетаскивает объект, который простирается от BaseClass
до уровня, функция запускается при запуске и заменяет актив соответствующим классом и позволяет менеджеру сущностей принять на себя и обработать актив соответствующим образом.Он позволяет достичь того, чего я хотел достичь, с помощью редактора уровней на основе IDE, который автоматически выполняет всю работу, размещая объекты там, где вы хотите.
Спасибо всем, кто помогал.