2016-04-10 19 views
0

私は、このチュートリアルのログインチュートリアルを行っています。Flash AS3のスタックオーバーフロー

package { 

    /* 
    always extend a class using movieclip instead of sprite when using flash. 
    */ 

    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.text.*; 


    /* 
    create our class 
    */ 



public class login extends MovieClip { 

; 


public function login():void { 

      var login_form:login = new login(); 
      addChild(login_form); 
      var username:TextField = new TextField(); 
      addChild(username); 
      var password:TextField = new TextField(); 
      addChild(password); 
      var login_button:MovieClip = new MovieClip(); 
      addChild(login_button); 

      /* 
      buttonMode gives the submit button a rollover 
      */ 

      login_button.buttonMode = true; 

      /* 
      what this says is that when our button is pressed, the checkLogin function will run 
      */ 

      login_button.addEventListener(MouseEvent.MOUSE_DOWN, checkLogin); 

      /* 
      set the initial textfield values 
      */ 

      username.text = ""; 
      password.text = ""; 

     } 

public function checkLogin (e:MouseEvent):void { 

      var username:TextField = new TextField(); 
      addChild(username); 
      var password:TextField = new TextField(); 
      addChild(password); 

    /* 
    check fields before sending request to php 
    */ 

    if (username.text == "" || password.text == "") { 

     /* 
     if username or password fields are empty set error messages 
     */ 

     if (username.text == "") { 

     username.text = "Enter your username"; 

     } 

     if (password.text == "") { 

     password.text = "Enter your password"; 

     } 

    } else { 

     /* 
     init function to process login 
     */ 

     processLogin(); 

    } 

} 

public function processLogin():void { 

      var username:TextField = new TextField(); 
      addChild(username); 
      var password:TextField = new TextField(); 
      addChild(password); 

    /* 
    variables that we send to the php file 
    */ 

    var phpVars:URLVariables = new URLVariables(); 

    /* 
    we create a URLRequest variable. This gets the php file path. 
    */ 

    var phpFileRequest:URLRequest = new URLRequest("php/controlpanel.php"); 

    /* 
    this allows us to use the post function in php 
    */ 

    phpFileRequest.method = URLRequestMethod.POST; 

    /* 
    attach the php variables to the URLRequest 
    */ 

    phpFileRequest.data = phpVars; 

    /* 
    create a new loader to load and send our urlrequest 
    */ 

    var phpLoader:URLLoader = new URLLoader(); 
    phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 
    phpLoader.addEventListener(Event.COMPLETE, showResult); 

    /* 
    now lets create the variables to send to the php file 
    */ 

    phpVars.systemCall = "checkLogin"; 
    phpVars.username = username.text; 
    phpVars.password = password.text; 

    /* 
    this will start the communication between flash and php 
    */ 

    phpLoader.load(phpFileRequest); 

} 

    public function showResult (event:Event):void { 


        var result_text:TextField = new TextField(); 
      addChild(result_text); 


    /* 

    this autosizes the text field 

    ***** You will need to import flash's text classes. You can do this by adding: 

    import flash.text.*; 

    ...to your list of import statements 

    */ 

    result_text.autoSize = TextFieldAutoSize.LEFT; 

    /* 
    this gets the output and displays it in the result text field 
    */ 

    result_text.text = "" + event.target.data.systemResult; 

} 

} 
} 

私は、ボタンのムービークリップやテキストフィールドのすべてのそれらのインスタンスを配置する場所を正確にはわからないが、私は私のプログラムを実行したとき、私はこのエラーを得ました。

Error: Error #1023: Stack overflow occurred. 
    at flash.display::DisplayObject() 
    at flash.display::InteractiveObject() 
    at flash.text::TextField() 
    at flash.display::Sprite/constructChildren() 
    at flash.display::Sprite() 
    at flash.display::MovieClip() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 
    at login() 

私が理解できるものの、役に立たない答えを探してみました。助けていただければ幸いです。ありがとうございます。

答えて

0

loginクラスのインスタンスを作成し、それをログインコンストラクタで無限再帰を引き起こしているように追加しているようです。

var login_form:login = new login();

あなたは他のオブジェクトからログインクラスを初期化し、一度だけのステージに追加する必要があります。

2

あなたはとてもそのクラスのすべてのインスタンスが別のインスタンスを作成し、そのコンストラクタでvar login_form:login = new login();を使用してloginクラスをインスタンス化の無限ループを作成しているので、あなたはStack overflowエラーが発生しました。

クラスをインスタンス化するには、メインタイムライン、ドキュメントクラス、...などに挿入する場合や、ステージに直接ドロップするなどの方法でインスタンスを作成する必要があります。

しかし、loginクラスをインスタンス化する前に、正しく作成する必要があります。そのために、あなたはあなたのMovieClipの段階にそれらをドロップすることによって、または例えば使用してコードであなたのIDEに手動でオブジェクト(ボタン、ムービークリップ、TextFieldを、...)を追加することができます

var username:TextField = new TextField(); 
addChild(username); 

var password:TextField = new TextField(); 
addChild(password); 

// LoginButton here is the AS linkage of a MovieClip/Button in the library 
var login_button:LoginButton = new LoginButton(); 
addChild(login_button); 

この操作があります通常、あなたは、たとえば、このようなあなたのオブジェクトを使用することができ、一度に行わ:

var user_name:String = username.text; 

if(password.text != ''){ /* ... */ } 

login_button.x = 30; 

あなたが初心者であるため、あなたがLearning ActionScript 3 hereを開始することができます。

希望に応じることができます。