0

ドキュメント クラスのアクション スクリプトで動的にステージに追加されるムービークリップがライブラリにあります。このムービークリップには、Photoshop から元の位置に直接インポートされた多くの子イメージが含まれています (保持する必要があります)。

何十ものイメージ インスタンスがあるため、すべてのイメージ インスタンスに手動で名前を付けたくありません。

どうやらフラッシュは「ビットマップ」オブジェクトをAS3の親ムービークリップの子として認識しないため、画像を手動でシンボルに変換しました(numChildrenはビットマップを認識しませんが、シンボルを認識します)。

数十の子への参照で満たされた配列があり、それをループして、クリックしたときにそれぞれがマウスの下にあるかどうかを確認します。ただし、どういうわけか、子シンボルに手動で名前を付けない限り、項目をクリックしても検出されません(いくつかの名前を手動で付けてテストしましたが、それらはクリックに敏感になりました)。

私はすでにtrace()コード全体のデバッグを行っており、配列がデータでいっぱいであること、実際にはデータがインスタンスの名前 (自動的に名前が付けられる、IE instance45、instance46、instance47 など) であることを確認しています。関数をクリックすると実行され、シンボルに手動で名前を付けた場合にコードが正しく機能することを確認します。

何が問題なのか、またはフラッシュのどの側面を理解できていないのか、誰にもわかりますか?

コードは次のとおりです。

    //check each animal to see if it was clicked on
    private function check_animal_hits():void
    {


        var i:int = 0;
        var animal:Object = this.animal_container;

        for (i=0; i<animal.mussels.length; i++)
        {

            if (this.instance_under_cursor(animal.mussels[i].name))
            {

                var animal_data = new Object();
                animal_data.animal = "mussel";
                this.send_data(animal_data);

            }
        }


    }

instance_under_cursor()メソッドのコードは次のとおりです。

    // Used for finding out if a certain instance is underneath the cursor the instance name is a string 
    private function instance_under_cursor(instance_name)
    {
        var i:Number;
        var pt:Point = new Point(mouseX,mouseY);
        var objects:Array = stage.getObjectsUnderPoint(pt);
        var buttons:Array = new Array  ;
        var o:DisplayObject;
        var myMovieClip:MovieClip;


        // add items under mouseclick to an array
        for (i = 0; i < objects.length; i++)
        {
            o = objects[i];
            while (! o.parent is MovieClip)
            {
                o = o.parent;
            }
            myMovieClip = o.parent as MovieClip;

            buttons.push(myMovieClip.name);
        }


        if (buttons.indexOf(instance_name) >= 0)
        {
            return true;
        }



        return false;
    }

アップデート:

getObjectsUnderPoint() 手動で名前を付けない限り、オブジェクトを検出できないという問題に絞り込んだと思います。

4

1 に答える 1

0

これは、マウス ポインターの下にあるオブジェクトを見つける最も奇妙な方法です... まさにそれを行う組み込み関数があります。しかし、それはさておき、歴史的な理由だけで無関係/変更/保持される可能性があるため、おそらくインスタンス名に依存するべきではありません。このプロパティを利用するコードはリファクタリングの対象です。

しかし、あなたが観察したことは次のようなものかもしれません: Flash CS のシーンに画像を配置すると、Flash はそれらすべてをビットマップ塗りつぶしの形状に縮小して最適化しようとします。それらをシンボルに変換すると、それを行うことはできません (後でそれらを使用したいと想定しているため) が、代わりに Bitmpas を作成します - Bitmap はインタラクティブなオブジェクトではありません - つまり、マウスイベントを登録しません- getObjectsUnderPoint() から返されるものに追加しても意味がありません。明らかに、やりたいことは、それらをインタラクティブなものにすることです-たとえばスプライトのように。したがって、親が MovieClip であるというテストはポイントを逃します。親が MovieClip である必要はないためです (Sprite、SimpleButton、または Loader である可能性があります)。

しかし、その機能が何のために必要なのかを説明できれば、instance_under_cursor本来の目的を達成するためのより良い方法があるかもしれません。

于 2012-05-13T11:57:31.953 に答える