0

更新: OK、パッケージとクラスをあきらめる準備ができています。答えは来ません。何をすべきかわからない。質問を簡単にして新しい投稿を作成しようとしましたが、反対票を投じられました。as3 別のクラスの関数を呼び出す


私は、パッケージとクラスを使用することにまったく慣れていません。非常に多くの問題が発生した後、最終的にタイムラインから移行しています。知識不足ですがご容赦ください。親swfのメインタイムのコードからロードした子swfファイルで関数を呼び出す方法を知る必要があります。

2 つの swf ファイルがあります。Main.swf と pConent.swf 1. Main.swf には、最初のフレームのタイムラインにコードがあります。2. pConent.swf は PACKAGE CLASS をファイルとしてロードしています。

質問 親の Main.swf から関数を呼び出そうとしています。どうすればいいですか?両方のコードのセクションを次に示します。ありがとう

Main.swf CODE /// は Andrid swf の AIR です

function LoadContent()
{  
    TheContent.load(new URLRequest( "pContent.swf"));
    TheContent.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContentTWO);
    function LoadContentTWO(e:Event)
    {
        Content = TheContent.content as MovieClip;
        pContent = Content as Object;
        addChild(TheContent);

            var OSS:String = "device";
            trace(pContent); //// comes out as: [object pContent]
        pContent.GetOnlineStatus(OSS); ///// HOW DO I GET THIS TO CALL FUNCTION
    } 
}

私が呼び出そうとしている pContent.swf の「クラス」のセクション

 public function GetOnlineStatus(OS:String)

{

    if(OS=="online")
        trace("inside ONLINE" );
        }
    if(OS=="device")
        {
        trace("inside DEVICE" );
        }
}

私が得ているエラー

TypeError: エラー #1006: GetOnlineStatus は関数ではありません。

更新: 完全なパッケージ (私の最初の) を投稿して、正しく行っているかどうかを確認することにしました。

package  
{

import flash.display.MovieClip;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.display.*;
import flash.media.Sound;
import flash.system.*;
import flash.media.SoundChannel;
import flash.display.MovieClip;
import flash.events.MouseEvent;




    public class pContent extends MovieClip 
    { 
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

var ScreenY = flash.system.Capabilities.screenResolutionY;
var ScreenX = flash.system.Capabilities.screenResolutionX;
var swf:String;
var daSounds:String;
var images:String;
var videos:String;
var OnlineStatus:Boolean;



//++++++++++++++++++++++++
//++++++++++++++++++++++++

public function pContent()
    {
    BG.addEventListener(MouseEvent.CLICK, mouseHandlerdown);        
    }

//++++++++++++++++++++++++
//++++++++++++++++++++++++





    //-------- * FUNCTIONS * --------
    //-------------------------------

    public function mouseHandlerdown(event:MouseEvent):void 

        {
        alpha = .3; // testing
        }

    public function GetOnlineStatus(OS:String)
        {

        if(OS=="online")
            {
            OnlineStatus = true;
            Security.allowDomain("*");
            trace("inside THE PATH " + ThePath.text);
            daSounds = "http://mycontactcorner.com/upload/files/";
            swf =    "http://mycontactcorner.com/upload/files/";
            trace("inside THE DEVICE ONLINE" );
            OnlineStatus = false;
            swf = "";
            daSounds = "content/sounds/";
            //LoadMenu();
            LoadStage();
            LoadBeau();
            }
        if(OS=="device")
            {
            trace("inside THE DEVICE ONLINE" );

            }
        }

    //------ * END FUNCTIONS * -----            
    //------------------------------ 



    }// END FUNCTION pContent
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



}//// END PACKAGE
4

5 に答える 5

2

がっかりしないでください。しかし、あなたの質問に対する「本当の」答えはありません。また、あなたのすべてのコードを調べて解決するつもりもありません。これを行う方法を学ぶのはあなた自身の仕事であり、ここの人々が評判に非常に飢えている場合を除き、誰もあなたのためにそれを行うことはありません-私たちはあなたが正しい方法を見つけるのを助けるだけです.

あなたの問題は「パッケージとクラス」ではないので、あきらめないでください。それらを理解し始めると、それらは大いに役立ちます。あなたの問題は、あなたが直面している問題は 1 つではなく、実際には少なくとも 2 つ (そして非常に重要なもの、私が付け加えるかもしれません) であることです。

  1. ActionScript でのオブジェクト指向プログラミングの基本については、もう一度学習する必要があります。そうしないと、このような質問に対する回答を得ることはできません。それは単に複雑な問題であり、複雑な問題を表現する用語を知らない場合でも、相手がそれを知らない場合でも、複雑な問題を伝えるのは困難です。」それらを理解することはできません。高校の数学の問題のように考えてみてください。最初に基本的な代数を学ばなければ、三角法の問題の解決策を見つけることはできません (またはまともな答えを得ることができません)。

  2. また、ロード、アプリケーション ドメイン、およびFlash Player セキュリティ モデルに関連する問題もあります。これらはすべて、OOP を試すときに目指すべきものよりもはるかに複雑です。これは大きな障害になる可能性があり、イライラしたくない場合は、プログラムが実際に実行されるまで回避するようにしてください

これが私のアドバイスです。常に一度に 1 つの問題を解決するようにしてください。現在のような複雑なシナリオに身を投じるのではなく、自分がしていることに自信を持てるレベルに達するまで、一歩一歩進んでください。

最初の問題は、クラスとオブジェクトで何が起こっているかを理解することです。他のすべては後で来るでしょう。で問題を切り分けて、pContent.swfそれを最初に機能させるようにしてください。または、プログラムに必要なものすべてを 1 つのファイルにまとめてください。クラスを使用するように変換します。次に、これらの操作方法を理解したら、より高度な OO について学習し、インターフェイスを使用してコードを分離し型キャストして実行時にバイナリをロードします

于 2012-05-07T23:03:50.783 に答える
1

これが答えのように聞こえない場合は申し訳ありませんが、解決策につながる可能性のあるコードを読んでいるという疑問をいくつか書きます。

  • なぜ MovieClip にキャストするのですか? これを MovieClip としてキャストすると、コンパイラはメソッド「GetOnlineStatus」が存在しないことを通知します。これは、MovieClip クラスにメソッドがないためです。pContentとしてキャストする必要があると思います

  • TheContent.content をキャストしようとしているのはなぜですか? 「コンテンツ」とは?以前の投稿を見ましたが、「コンテンツ」と呼ばれるものが表示されませんか?

2 番目の疑問 (TheContent.content の問題) を無視する場合、コードを次のように変更します。

 Content = TheContent.content as pContent;  // your class it's called pContent
 addChild(Content);
 Content.GetOnlineStatus(OSS); // it calls now

また、一般に、変数ではなくクラスの名前を大文字にすることは良い習慣であることを覚えておいてください。お知らせ下さい!

于 2012-05-04T16:34:49.353 に答える
1

// クラスと接触しますが、次のようになります: [object pContent]

それはあなたが言ったからです

pContent = Content as Object;

なぜこの余分な手順を実行しているのかわかりません

これに変更

Content = TheContent.content as MovieClip;
// pContent = Content as Object; //NO NEED OF THIS
addChild(Content); // just in case this gives error change it as addChild(Content as Object);

var OSS:String = "device";
trace(Content); //now see the difference
Content.GetOnlineStatus(OSS); // it calls now

また、その恐ろしい質問を投稿したリンクを提供してください:Pに残りのコードがある場合

于 2012-05-04T15:35:45.560 に答える
0

プライベート関数GetOnlineStatus

代わりに、これをパブリック関数にしてみてください。プライベートの場合、それを所有するクラスのスコープ外にアクセスすることはできません。

于 2012-05-04T03:11:00.583 に答える
0

これを機能させるには、Loader の content プロパティが必要だと思います。呼び出そうとしているクラスとして、読み込まれた SWF への参照を作成する必要があります。このクラスは、メイン SWF のプロジェクトに含める必要があります。次に、子でその特定のクラスの関数を呼び出すことができます。

function LoadContent()
{  
    TheContent.load(new URLRequest( "pContent.swf"));
    TheContent.contentLoaderInfo.addEventListener(Event.COMPLETE,     LoadContentTWO);
}

function LoadContentTWO(e:Event)
    {
        var pContent:GetOnlineStatus = GetOnlineStatus(e.target.content);
        addChild(e.target.content); //Assuming that "TheContent was 
    //  declared as var TheContent:Loader , you'd be adding the loader to the stage when I think you actually wanted // to add the content. 

        var OSS:String = "device";
        trace(pContent); //// comes out as: [object pContent]
        pContent.GetOnlineStatus(OSS); ///// HOW DO I GET THIS TO CALL FUNCTION
    // This should work now. If not, try to loading a function that is not the class' main function. Because I think you might get an "unable to call static function error". I'm a begginner too though, so sorry if I'm wrong. Example: pContent.GetOnlineStatusFunction(OSS);
    } 

この回答は、pContent.swf に次のようなクラス ファイルが含まれていることを前提としています。

package {
    public class GetOnlineStatus {
        public function GetOnlineStatus (OSS:String) {
             //Do your GetOnlineStatus Logic. This is the main function.
        }
      /*public function GetOnlineStatusFunction (OSS:String) {
            //Example non-main function
        } */
    }
}  

ソース: http://www.scottgmorgan.com/accessing-document-class-of-externally-loaded-swf-with-as3/

于 2015-07-26T15:51:04.963 に答える