Невозможно получить правильный класс из Flash IDE - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь заменить экземпляры, созданные путем перетаскивания в MovieClip через IDE Flash, реальными классами, чтобы я мог добавить их в игровой цикл и использовать их в качестве реальных объектов. Другими словами, я пытаюсь создать оптимизированный способ, позволяющий разработчикам визуально добавлять свои объекты в платформенный движок, над которым я работаю.

Это моя третья попытка, и я полностью застрял.

Приведенный ниже код перебирает мувиклип, который содержит экспортированный символ со связанным с ним классом с именем MyEntity. Однако он теряет расширение до BaseClass и, следовательно, не перемещается при компиляции.

наследует: MovieClip > BaseClass > MyEntity. Однако при компиляции с IDE он игнорирует BaseClass и просто делает MovieClip > MyEntity.

Мой код предназначен для поиска и сохранения позиции MyEntity, удаления ее из видеоклипа контейнера, добавления нового экземпляра (с надлежащей основой) и установки этого нового экземпляра в ту же позицию оригинал.

for ( var i:int = 0; i < LayerInIDE.numChildren; i++ )
{
    // first we want to get all the display objects in the layer
    // these are objects that were placed from within the Flash IDE (ie. dragged and dropped into the MovieClip
    var original:DisplayObject = LayerInIDE.getChildAt( i );            

    // we want to get the class of the display object so we can recreate it as a specific entity class that it 
    var originalName:String = getQualifiedClassName( original );
    var originalClass:Class = getDefinitionByName( originalName ) as Class;

    // debug trace, see output below
    trace( originalName, originalClass, originalClass is BaseClass );

    // filter out movieclips
    if ( originalClass != MovieClip )
    {
        // remove the original
        LayerInIDE.removeChild( original );

        // recreate the class with the correct extension
        var newEnt = originalClass();
            newEnt.x = original.x; newEnt.y = original.y;
        LayerInIDE.addChild( newEnt );
    }
}

Это не работает.

Выводит Game.entities::MyEntity [class MyEntity] false. MyEntity - это правильный класс, который расширяется от BaseClass. Однако проблема в том, что IDE странным образом удаляет ссылку на базовый класс - как будто MyEntity никогда не имел базового класса. Я не могу воссоздать его, так как получение ссылки на класс также возвращает то, что MyEntity никогда не имела BaseClass. Однако, если я наберу var newEnt = MyEntity(); вместо получения имени класса через getDefinitionByName, оно будет работать нормально и расширяется от BaseClass.

Мне нужно расширить его от BaseClass, так как это основной класс, который требуется использовать всем сущностям в моем игровом движке.

Есть идеи? Или есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

После долгих поворотов и поломки 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, который автоматически выполняет всю работу, размещая объекты там, где вы хотите.

Спасибо всем, кто помогал.

0 голосов
/ 14 августа 2011

Так что, если я вас правильно понимаю, то, что вы пытаетесь сделать, это позволить людям перетаскивать библиотечные активы на сцену, которую вы можете проверить и, возможно, преобразовать во время выполнения?Например, в IDE кто-то создает тупой спрайт, состоящий только из иллюстраций, перетаскивает его на рабочую область и устанавливает для экспорта в качестве класса «MyEntity».Затем во время выполнения вы хотите проверить, имеет ли он тип «MyEntity», чтобы вы могли внедрить в него функциональность, определенную в BaseClass.Если это так, вы можете подойти к этому следующим образом:

var do:DisplayObject = LayerInIDE.getChildAt( i );
if (do is MyEntity){
    var bc:BaseClass = new BaseClass(do);
    addChild(bc);
}

// then inside of BaseClass.as

private var entity:MyEntity;
public function BaseClass(view:MyEntity)
{
    entity = view;
    addChild(entity);
// from here you can script your MyEntity object as needed.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...