Сбой Flash с библиотекой RSL, когда основной класс расширяет класс и реализует интерфейс - PullRequest
1 голос
/ 14 марта 2011

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

У меня есть очень простой класс для расширения:

import flash.display.Sprite;
public class MySprite extends Sprite 
{

    public function MySprite() 
    {

    }
}

Основной класс с TestSymbol, который является символом из библиотеки RSL:

import flash.display.Sprite;
public class MainApp extends MySprite implements ITest
{
    public var bug:TestSymbol = new TestSymbol();

    public function MainApp() 
    {
        addChild(bug);
    }
    //To meet interface requirements
    public function test():void {

    }
}

}

и очень простой интерфейс

    public interface ITest 
{
    function test():void
}

Библиотека RSL тоже очень простая - всего один символ с квадратным рисунком. Это указывается в настройках ActionScript. Все работает хорошо, если я изменю класс MainApp на:

public class MainApp extends MySprite

или

public class MainApp extends Sprite implements ITest

но если мне нужны оба, я получаю VerifyError: Ошибка # 1014 с MySprite не найдена и ReferenceError: Ошибка # 1065.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 марта 2011

У меня была такая же проблема. На самом деле это будет продолжаться с этой ошибкой, даже если вы выходите из класса в RSL, который реализует интерфейс из RSL. Похоже, что rsl нужно некоторое время для загрузки и интерпретации проигрывателем. Если вы будете использовать во втором фрейме классы или интерфейсы, инкапсулированные в rsl, они будут работать нормально. Как бы то ни было, они не работают нормально в первом кадре.

Мое решение, связанное с моим делом, было: 1) Основное приложение с использованием внешней библиотеки rsl.swf. 2) Приложение модуля, имеющее основной класс документов ModuleBase, реализующий модуль IModule, инкапсулированный в rsl.swf, поэтому приложение модуля также использует extaernal lib rsl.swf. 3) Основное приложение загружало приложение модуля и приводило его к ModuleBase.

Похоже, время, необходимое приложению Main для загрузки приложения модуля, достаточно, чтобы инициализировать / зарегистрировать типы внутри rsl.

Как бы то ни было внутри Flash IDE: 1) тестирование приложения модуля, имеющего основной документ расширяющего ModuleBase типа, предоставляемого rsl, завершится в VerifyError: Ошибка # 1014 2) компиляция модуля приложения работает просто отлично 3) прекрасно работает компиляция и тестирование основного приложения

Внутри браузера: 1) тестирование приложения модуля не выполняется с VerifyError: Ошибка # 1014 2) тестирование основного приложения работает нормально

Таким образом, мое решение состоит в том, чтобы скомпилировать модули, расширяющие некоторый внешний класс, и использовать их внутри приложения, в котором уже доступны типы RSL.

Надеюсь, это кому-нибудь поможет.

// РГБ

package interfaces {
    public interface IModuleFactory
    {
      //...
    }
}

package app.models {
    import interfaces.IModuleFactory;
    public class ModuleBase extends MovieClip implements IModuleFactory
    {
      //...
    }
}

// * Модуль 1018 *

package {
   import app.models.ModuleBase;
   // main document class
   public class Module extends app.models.ModuleBase
   {
      //..
   }
}

// где-то внутри Основное приложение

protected function onModuleLoaded(event:Event):void
{
        var lInfo:LoaderInfo = event.currentTarget as LoaderInfo;
        setTimeout( function(){ extractFactory(lInfo); },200);

}

protected function extractFactory(lInfo:LoaderInfo):void
{
    if( lInfo )
    {
        if( !(lInfo.content is ModuleBase) )
        {
                trace(lInfo.content ,' is not ModuleBase');
        }

        var m:DisplayObject = lInfo.content;
        if( !(m is IModuleFactory) )
        {
                trace(m ,' is not IModuleFactory');
        }
        if(m)
        {
            var factory:Function = (lInfo.content as IModuleFactory).factory;
            if( null != factory)
            {
                factories[key] = factory;
                trace('module loaded',m,key);
                dispatchEvent(new Event('moduleloaded'));
            }else{
                trace('could not get a reference to module factory!');
            }
        }else{
            trace('could not cast to ModuleBase');
        }

    }else{
        trace('could not get a reference to a LodearInfo!');
    }
}
0 голосов
/ 31 марта 2011

Спасибо, что объяснили это. Ваш сценарий кажется немного более сложным с модулем, расширяющим и реализующим RSL. В моем случае (класс модуля MainApp реализует и расширяет не-RSL класс / интерфейс и просто использует класс из RSL в качестве переменной). Реализация интерфейса родительским (например, ModuleBase) классом вместо класса Module работает хорошо. Это даже не выдает ошибку при тестировании в Flash IDE.

...