0

問題を示すテストケースがあります。

次の4つの短いファイルをFlashBuilder4.6の新しいFlexMobileプロジェクトに追加すると、すぐに実行されます。

スクリーンショット

src / TestFXG.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    firstView="Home">
</s:ViewNavigatorApplication>

src / Assets / en / Star.fxg:

<?xml version='1.0' encoding='UTF-8'?>
<fxg:Graphic xmlns:fxg="http://ns.adobe.com/fxg/2008" version="2">    
    <fxg:Path x="9.399" y="10.049" data="M 82.016 78.257 L 51.895 69.533 L 27.617 89.351 L 26.621 58.058 L 0.231 41.132 L 29.749 30.52 L 37.714 0.241 L 56.944 24.978 L 88.261 23.181 L 70.631 49.083 Z">
        <fxg:fill>
            <fxg:SolidColor color="#FFFFFF"/>
        </fxg:fill>
        <fxg:stroke>
            <fxg:SolidColorStroke 
                caps="none" 
                color="#FFFF66" 
                joints="miter" 
                miterLimit="4" 
                weight="10"/>
        </fxg:stroke>
    </fxg:Path>
</fxg:Graphic>

src / Home.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:my_components="*"
        title="Display random amount of stars">

    <fx:Script>
        <![CDATA[
            import Star;
            import spark.core.SpriteVisualElement;

            private static const STAR:SpriteVisualElement = new Star();
        ]]>
    </fx:Script>    

    <my_components:MyComp />
</s:View>

src / MyComp.as:

package {
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;
    import mx.core.UIComponent;
    import spark.core.SpriteVisualElement;
    import assets.Star;

    public class MyComp extends UIComponent {
        private static const WHAT:String = "assets.en.Star";

        override protected function createChildren():void {
            super.createChildren();

            for (var i:uint = 0; i < 3; i++) {
                var star:Star = new Star();
                //var star:SpriteVisualElement = new (getDefinitionByName(WHAT) as Class)();
                star.x = Math.random() * 100;
                star.y = Math.random() * 100;
                addChild(star);
            }
        }
    }
}

私の質問は次のとおりです。assetsサブディレクトリに適切な名前のFXGファイルが多数ある場合(実際のアプリケーションでは、spades_queen.fxg、spades_king.fxg、spades_ace.fxgなどがあります)-実行時にFXGファイルを選択するにはどうすればよいですか? ?

上記のコメント行は、ランタイムエラーを示しています。

ReferenceError: Error #1065: Variable Star is not defined.
    at global/flash.utils::getDefinitionByName()

src / Assets / en/Star.fxgsrc/Star.fxgに移動すると、すべてが機能します...

4

2 に答える 2

1

Star.fxg は名前で使用されていないため、完成したアプリにコンパイルされていないため、このランタイム エラーが発生していると思います。ファイルの場所を移動するとエラーが回避される理由はわかりにくいです。

ただし、ファイル参照を追加してみてください。それをインポートします。

import assets.en.Star

そして、決して使用しないダム インスタンスを作成して、ファイルがアプリに確実にコンパイルされるようにします。

private var myStart :Star;

次に、この行が機能するはずです:

var star:SpriteVisualElement = new (getDefinitionByName(WHAT) as Class)();

また、コンパイラ引数を使用して、FXG クラスを完成したアプリケーションに強制的にコンパイルすることもできます。

Flex で構築されたカジュアル ゲームでも、これとまったく同じアプローチを使用します。

ただし、奇妙なことに、ファイルを別のディレクトリに移動すると、問題なく動作するようになります。間違ったパッケージを参照していない限り、これは難問です。(assets.en.Star別名-コードで使用するように-src/assets/Star質問で参照する詩)。

于 2012-04-17T03:46:42.643 に答える
0

getDefinitionByName で何もする必要はありません。単に Start の新しいインスタンスを作成し、addElement を使用してそれをステージに配置できます。

        for (var i:uint = 0; i < 3; i++) {
            var star:Star = new Star();
            star.x = Math.random() * 100;
            star.y = Math.random() * 100;
            addElement(star);
        }

これが機能するためには、FXP が入っているパッケージをインポートする必要があります。おそらく assets.Star

新しいインスタンスを作成してタイプを切り替えることもできます。

アセットに Star.fxg と King.fxg があるとします。

import assets.Star;
import assets.King;

var star:Star = new Star();
var king:King = new King();
于 2012-04-16T13:25:23.273 に答える