2011-12-08 3 views
1

저는 molehill 이점을 사용하여 FP11에서 작동하며 FP11에서 이전 소프트웨어 블리 팅을 사용하는 범용 그래픽 엔진을 작성하고 있습니다.다른 버전의 Flash Player에 대해 다른 코드

그래서 나는 이것을 채우기위한 최선의 방법을 찾고있다.

먼저 FP11 용 swf를 컴파일하고 플레이어 버전이 11이 아닌 경우 새 클래스를 사용하지 않으면 모든 것이 잘 작동한다고 생각했습니다. 그러나 나는 틀렸다. 놀랍게도 나는 "VerifyError : Error # 1014. Couln't find class flash.display3D :: Context3D"오류가 발생합니다. 가져온 FP11 라이브러리가 호출되지 않아도 코드를 실행하면 오류가 발생합니다.

필자는 FP가 결석 한 클래스에 액세스하려고 시도 할 때만이 메시지를 던질 것이라고 생각했지만 그게 옳지 않습니다. 실행하려고 할 때 오류가 발생합니다 .swf

그래서 어떤 방법이 있습니까? 프리 로더를 사용하는 버전에 따라 다른 SWF를로드하는 것을 생각했지만 2 개의 다른 SWF를 유지 관리하고 컴파일하는 것은 매우 혼란 스럽습니다.

다른 방법이 있습니까?

답변

2

Flex를 사용하는 경우 (Flex 또는 다른 도구와 달리) 유일한 옵션은 조건부 컴파일 일 수 있습니다. CS5에서이 문제를 처리해야 할 때, 다른 것을 찾을 수 없었습니다.

내가 끝낸 것은 다양한 구성을위한 몇 가지 상수를 정의한 다음 .swf의 여러 버전을 컴파일 한 것입니다. 브라우저에서 플레이어 감지 코드를 기반으로 올바른 .swf 파일을로드했습니다. Newgrounds 같은 곳에서 .swf를 원한다면 정말 엉망이됩니다.

1

flash apis는 호환되지 않습니다. 플래시 11 API를 원하면 플래시 11+ swf를 만들어야합니다. 그 이유는 swf 10이 자신이 만든 Stage3D 클래스를 기쁘게 만들 수 있기 때문입니다. 갑자기 swf 11의 내장 클래스와 충돌하면 하위 호환이 중단됩니다. 따라서 하나, 역방향 또는 순방향 호환성 만 가질 수 있습니다.

1

편집

미안 해요, 난 당신이 라이브러리의 다른 버전을 지원하지 않는다는 것을주의하지 않았다. 이 경우에는 FP가 SWF의 바이트 코드를 처리하고 알 수없는 참조를 찾으면 VerifyError가 throw됩니다. 물론 getDefinitionByName()과 동적 액세스를 사용할 수 있지만 은 매우입니다.

별도로 지원되는 코드의 양을 최소화하려면 주 기능이있는 SWC와 버전 종속 기능이있는 SWF를 사용할 수 있습니다. 따라서 초기화 단계에서 lib 클래스의 기본 클래스가 FP 버전을 확인하고 해당 SWF .


이는 동적 링크라고하며, 방법이있다 :

  1. 모든 플레이어 버전에 의존 기능 (public interface MyInterface...)의 인터페이스를 만들기. 이 인터페이스에는 버전 종속적 인 API에 대한 참조가 없어야합니다. SWC에이 인터페이스 (하나의 .as 파일 일 수도 있음)를 컴파일하십시오 (lib-intf.swc).

  2. 두 개의 구현을이 인터페이스로 만듭니다. 첫 번째는 새 API를 사용하고 두 번째 API는 사용하지 않습니다 (단지 자리 표시 자일 수도 있지만 대안 구현 일 수도 있음). 나중에 이러한 구현을 SWF로 컴파일해야하므로 Sprite까지 확장되는 기본 클래스가 필요합니다. 트릭을 수행하는 가장 간단한 방법은이 기본 클래스가 인터페이스 (예 : public class MyImplementationA extends Sprite implements MyInterface...MyImplementationB과 동일)를 구현하도록하는 것입니다. 그들은 단지 비어있을 것입니다 Sprites,하지만 그들은 인터페이스 방법을 포함합니다.

  3. 별도 SW에 F S (lib-a.swflib-b.swf)를 두 구현 독립적 컴파일. 컴파일 할 때 lib-intf.swc을 외부 라이브러리 (-external-library-path 컴파일러 매개 변수 또는 IDE의 "외부"연결 유형)로 포함하십시오.

  4. 이제 루트 응용 프로그램을 컴파일 할 때 평소 라이브러리 (-library-path 컴파일러 매개 변수 또는 IDE에 연결되는 코드에 병합)로 lib-intf.swc을 포함하십시오. 버전 종속 클래스를 전혀 포함하지 마십시오. 따라서 루트 응용 프로그램에서는 버전에 독립적 인 인터페이스에 대한 참조 만 갖게됩니다. 응용 프로그램이 시작되면 FP 버전을 확인하고 Loader 클래스를 사용하여 적절한 SWF를로드합니다. 하위 응용 프로그램 도메인 (기본 옵션 인 more details)이 아닌 기본 응용 프로그램 도메인에로드해야합니다.

  5. SWF가로드되면 인터페이스 : var versionDependentImpl:MyInterface = loader.content as MyInterface으로 전송하십시오. SWF의 기본 클래스는 MyInterface을 구현하므로이 캐스트가 작동합니다.

  6. 이제 끝났습니다. 이제 구현을 사용할 수 있습니다 : versionDependentImpl.someMethod(). 물론 someMethodMyInterface에 정의되어야합니다.

그래서 여기서 트릭은 SWF 파일에서 구현을 동적으로로드하는 것입니다. 루트 애플리케이션은이 SWF 내부의 클래스에 대해 알지 못하지만 루트 애플리케이션으로 컴파일 한 인터페이스를 구현했기 때문에 기본 클래스의 메소드를 사용할 수 있습니다.

이 접근법은 확장 가능합니다. 예를 들어 다른 인터페이스를 반환하는 메소드가있는 기본 인터페이스를 정의 할 수 있습니다. 버전 의존 API를 사용하지 않는 한 구현간에 공유되는 구체적인 클래스를 lib-intf.swc에 포함시킬 수도 있습니다.

관련 문제