2011-10-24 4 views
0

私のFlashプログラムでは、オブジェクト内で関数を実行しようとしています。このオブジェクトは "SkullDemon.as"というクラスを使用します。私が実行しようとしている機能は "moveSkullDemon();"この関数は "SkullDemon.as"クラス内でコード化されています。Actionscript 3.0オブジェクトのEventListenerを有効にする

私の主なドキュメントクラスは、 "TME2d_Main.as"です。私はこのようなスカル悪魔クラスのインスタンスを作成し、そのファイル内:

 public var skullD1b:SkullDemon; 
     skullD1b = new SkullDemon(); 
     skullD1b.x = 2990.75; 
     skullD1b.y = 836.95; 
     skullDemonContainer.addChild(skullD1b); 

SkullDemonインスタンスを格納「skullDemonContainer」は、画面に追加されていると呼ばれる別の容器、「envContainer、」内に配置されています次のコード行を使用します。

 this.addChild(envContainer); 

SkullDemonインスタンスが作成され、画面に表示されます。この問題はSkullDemonクラス内の関数を実行しようとすると発生します。

前述のように、私は 'skullD1b'インスタンスに対して 'SkullDemon.moveSkullDemon()'関数を呼び出そうとします。今のところ、 'moveSkullDemon()'関数はSkullDemonオブジェクトを左に移動するだけです。

SkullDemonのコンストラクタ関数からこの関数を呼び出そうとしましたが、機能しません。実際、SkullDemonのコンストラクタ内に記述されたコードは、Skull Demonオブジェクトが作成されたときには実行されません。私は 'moveSkullDemon()'を呼び出すSkullDemonクラス内にEventListenerを作成しようとしましたが、何もしません。

私は実行するには 'moveSkullDemon()' 関数を取得するには、次の方法を試してみました:

1:このような 'TME2d_Main' から 'moveSkullDemonを()' を呼び出す:

skullD1b.moveSkullDemon(); 

しかし、この'moveSkullDemon'は関数ではないというエラー(#1006)が発生します。

2:

skullD1b.moveSkullDemon; 

3:その "を呼び出し、「skullD1b」例えば「TME2d_Main」内のEventListenerを作成する私は、関数呼び出し内には括弧を持っていないことを除いて第1位と同じことをやってmoveSkullDemon 'function:

skullD1b.addEventListener(Event.ADDED, skullD1b.moveSkullDemon); 

これは、「エラー#2007:パラメータリスナーはnullでなくてはなりません」というエラーが表示されます。また、常に「ヌル」参照エラーを検出します。

"1009: Cannot access a property or method of a null object reference. 
    at classes::TME2d_Main/controlPlayer()" 

この問題は、「controlPlayer()」メソッドを意味し、なぜそれがすべてでスカル悪魔のインスタンスを必要としないように私は、知りません。 'controlPlayerは()' 'TME2d_Main' 内にこのコードでイベントリスナーを介して呼び出される:

player.addEventListener(Event.ENTER_FRAME, controlPlayer); 

4:移動関数を呼び出す 'SkullDemonContainer' のイベントリスナーを作成する:

skullDemonContainer.addEventListener(Event.ADDED, skullD1b.moveSkullDemon); 

これがもたらします#3と同じエラーを起こす。

私は数日間この問題を抱えており、何が原因であるのか分かりません。「moveSkullDemon()」関数内のコードは次のとおりです。

 public function moveSkullDemon() { 
     trace("skull demon moving!"); 

     this.x -= 5; 

     // If the Player has not hit the 'floor,' increase his falling 
      //speed 
     if (! floor.hitTestPoint(this.x, this.y, true)) { 
      this.y += this.sdGravity; 
      // The Skull Demon is not on the ground when he's not touching it 
      sdOnGround = false; 
     } 

     // Increase the 'sdYVel' variable so that the Skull Demon will fall 
      // progressively faster down the screen. This code technically 
      // runs "all the time" but in reality it only affects the Skull Demon 
      // when he's off the ground. 
     sdYVel += sdGravity;    

     // Increase the Skull Demon's 'y' coordinate by the 'sdYVel' value 
     if (! sdOnGround) { 
      this.y += sdYVel; 
     } 
    } 

ありがとうございました。

+0

私のプロジェクトにパッケージスタイルのシステムを使用する前に、 'SkullDemon.as'のコンストラクタ内で 'moveSkullDemon()'を呼び出すことがうまくいったことに言及しておきます。特定の状況により、私はプロジェクトシステムの使用を余儀なくされました。 –

答えて

0

私が正しく理解している場合は、表示オブジェクトに対してイベントをディスパッチしようとしているので、関数を呼び出していますか?

スカルデーモンオブジェクトをインスタンス化するときは、処理するイベントの種類のイベントリスナーを追加します。

// do call this event listener, dispatch an event 
// against the object 
skullD1b.dispatchEvent(new DemonEvent(DemonEvent.MOVE)); 

あなたは内のコードを配置することができます:あなたは「moveDemonHandler」機能を呼び出したいとき

// instantiate and add event listener: 
skullD1b = new SkullDemon(); 
skullD1b.addEventListener(DemonEvent.MOVE, moveDemonHandler); 

、あなたがオブジェクトに対してイベントを送出する:たとえば、もしあなたが「DemonEvent」クラスを作成しましたイベントハンドラ、またはイベントハンドラのコードから、あなたの関数を呼び出す:

protected function moveDemonHandler(event:DemonEvent):void 
    { 
     moveSkullDemon(); 
    } 

    protected function moveSkullDemon():void 
    { 
     // ... your code here. 
    } 

例あなたが必要な場合は、「DemonEvent」:

あなたのコメントに基づいて
package 
{ 
    import flash.events.Event; 

    public class DemonEvent extends Event 
    { 

     public static const MOVE:String = "MOVE"; 

     public function DemonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
     { 
      super(type, bubbles, cancelable); 
     } 

    } 
} 

UPDATE

あなたがオブジェクトを移動するためにコードを置くのに最適な場所を決定しているように、それが鳴ります。あなたの頭蓋骨のデーモンが動く可能性があります。あるいは、TME2d_Mainクラスが頭蓋骨のデーモンを追加して最初に配置するので、フロアに対してテストを行う必要があるため、そのロジックをTME2d_Mainクラスに入れる方がよいでしょう。

この例ではイベントは使用されません。しかし、うまくいけば、あなたが始めるのを助ける。代わりにイベントを使用する例があるかどうかを教えてください。

は、ここでの実装例として、二つのクラスです:

TME2d_Main.as

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class TME2d_Main extends Sprite 
    { 
     /** skull demon instance */ 
     public var skullD1b:SkullDemon; 

     /** floor */ 
     public var floor:Sprite; 

     /** constructor */ 
     public function TME2d_Main() 
     { 
      super(); 

      // best if implemented on addedToStage 
      skullD1b = new SkullDemon(); 
      skullD1b.x = stage.stageWidth * 0.5; 
      skullD1b.y = 1; 
      addChild(skullD1b); 

      // listen for enter frame 
      addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
     } 

     /** every frame, move skull demon */ 
     protected function enterFrameHandler(event:Event):void 
     { 
      // call local function of this class 
      moveSkullDemon(); 
     } 

     protected function moveSkullDemon():void 
     { 
      // since this TME2d_Main class defined and positioned 
      // skullD1b, it probably makes sense for this class 
      // to continue positioning it, especially if you need to 
      // hit test again a floor, which is probably also defined 
      // in this class? 
      if (skullD1b.hitTestObject(floor)) 
      { 
       // skull is on floor 
       skullD1b.sdOnGround = true; 

       // end animation 
       removeEventListener(Event.ENTER_FRAME, enterFrameHandler); 
      } 
      else 
      { 
       // otherwise, skull is in air and falling 
       skullD1b.y *= skullD1b.sdYVel; 
      } 
     } 

     // if you wanted to have skull demon 
     // move itself, you would call: 
     // 
     //  skullD1b.moveSkullDemon() 
     // 
     // ...but make sure that function exists 
     // in SkullDemon class. 

    } 
} 

SkullDemon.asあなたTME2d_Main.asで

package 
{ 
    import flash.display.Sprite; 

    public class SkullDemon extends Sprite 
    { 

     /** acceleration factor */ 
     public var sdYVel:Number = 1.05; 

     /** whether skull demon is on ground */ 
     public var sdOnGround:Boolean = false; 

     /** constructor */ 
     public function SkullDemon() 
     { 
      super(); 
     } 

     // if you want SkullDemon to move itself, 
     // make sure you define a moveSkullDemon function: 
     // 
     //  public function moveSkullDemon():void 
     //  { 
     //  } 

    } 
} 
+0

ありがとう、トン、ジェイソン!あなたが提案したコードを実装しました。しかし、私はまだ質問があります。どこで 'moveDemonHandler()'関数を配置しますか?私はこれが 'SkullDemon'クラス(?)に入ると仮定しています。私はこれを最初に試しましたが、この行に着いたときに: 'skullD1b.addEventListener(DemonEvent.MOVE、moveDemonHandler);' コンパイラはこのエラーを発見、文句を言う: 「1180:未定義である可能性が高いメソッドmoveDemonHandlerに呼び出し、DemonEvent 『それがすべてではうまく動作しませんでした」 私はにハンドラとmoveDemon()のコードを入れてみました。』 –

+0

TME2d_Mainはあなたのコンテナがどこにあるかをディスパッチしてイベントを待ち受けるように見えるが、SkillDemonクラスにはmoveSkullDemon関数があると思うTME2d_Mainがあなたの頭蓋骨の鬼を動かすかどうか、 –

+0

これはうまくいきます、もう一度おねがいします。申し訳ありません、私は現場でFlashを学んでいます。 私はほとんど実装しました。正確にあなたの更新されたコード。私は、SkullDemonContainer内のすべてのSkull Demonを繰り返し移動するように 'moveDemon'関数を変更しました。これを行うにはwhileループを使用しました。 10個のSkull Demonsを読み込むと、プログラムは良いスピードで実行されているようです。私の質問は、これを行うより最適な方法がある場合ですか?私は 'enterFrameHandler'への引数として '現在の'デーモンオブジェクトを渡そうとしましたが、 'イベント'が渡された場合にのみ動作するようです。 –

0

は、あなたのコードは次のようであるあなたの状態ファイルそう。

public var skullD1b:SkullDemon; 
    skullD1b = new SkullDemon(); 
    skullD1b.x = 2990.75; 
    skullD1b.y = 836.95; 
    skullDemonContainer.addChild(skullD1b); 

最後の4行を関数に入れる必要があります。関数の外部にあるクラスでは、値をインスタンス化または代入することはできません。
そんな風にインスタンス化することはできますが、他のすべてのコードを機能化する必要があります(それは単語でもあります)。

public var skullD1b:SkullDemon = new SkullDemon(); 

// TME2d_Main is the constructor and should be called automatically 
public function TME2d_Main():void{ 
    skullD1b.x = 2990.75; 
    skullD1b.y = 836.95; 
    skullDemonContainer.addChild(skullD1b); 
} 

これを行うことをお勧めします。

public var skullD1b:SkullDemon; 

// TME2d_Main is the constructor and should be called automatically 
public function TME2d_Main():void{ 
    skullD1b = new SkullDemon(); 
    skullD1b.x = 2990.75; 
    skullD1b.y = 836.95; 
    skullDemonContainer.addChild(skullD1b); 
} 

これで解決できない場合は、完全なTME2d_Main.asファイルを投稿してください。

+0

申し訳ありませんが、コードを正しくコピーしませんでした。私の「TME2d_Main.as」ファイルは推奨されているように設定されていますが、 –

+0

TME2d_Main.asを投稿しないと良い助けになるとは思えません。この時点では、何かを推測するだけです。あなたはスコープの問題があり、コードなしで見つけることはできません。 –

関連する問題