2011-12-25 15 views
0

* EDIT - 私にエラーが表示されるのは、ムービークリップのグラフィックスプロパティを変更しようとしたときです。 *カスタムイベントを使用したAS3参照エラー

このエラーが発生します。 "ReferenceError:Error#1069:flash.events.MouseEventにプロパティ項目が見つからず、PlayScreen/onClick()でデフォルト値がありません。 私は少しの研究を行いましたが、ほとんどのサイトではそれが誤字によるものだと言います。しかし、私はそれがうまく見えると言うことができる限り?

私は、私が知る限り、まったく同じように設定された2つのイベントがあります。 1つはonclick、もう1つはonhoverされます。ホバーイベントはうまくいきますが、onclickイベントを使用すると、上記のエラーが発生します。しかし、私はエラーを受け取ったにもかかわらず、関数はまだ動作する必要があります。

ここに私のコードです。 以下のコードは新しいグリッドを作成します。カスタムイベントが追加されます。ホバーイベントはエラーなしで正常に動作します。 onclickイベントは正常に動作しますが、エラーが発生します。

package { 
import flash.events.MouseEvent; 
import flash.display.MovieClip; 
public class PlayScreen extends MovieClip { 
    public var grid:Grid; 

    public function PlayScreen() { 
     grid = new Grid(); 
     grid.addEventListener(GridEvent.HOVER, onHover); 
     grid.addEventListener(GridEvent.TILECLICK, onClick); 
     grid.x = 0; 
     grid.y = 0; 
     addChild(grid); 

    } 

    public function onHover(event:*){ 
     event.item.graphics.beginFill(0x66ff66); 
     event.item.graphics.lineStyle(2, 0x22ff22); 
     event.item.graphics.drawRect(-30*0.5, -30*0.5, 30, 30); 
     event.item.graphics.endFill(); 

    } 

    public function onClick(event:*){ 
     event.item.graphics.beginFill(0x000000); 
     event.item.graphics.lineStyle(2, 0x22ff22); 
     event.item.graphics.drawRect(-30*0.5, -30*0.5, 30, 30); 
     event.item.graphics.endFill(); 
    } 

以下は私のグリッドクラスです。これには、2つのmouseEventが追加されたムービークリップが含まれており、カスタムイベントがトリガーされます。以下は

package { 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class Grid extends MovieClip { 

    public function Grid() { 
     var test = new MovieClip(); 
     test.x = 0; 
     test.y = 0; 
     test.graphics.beginFill(0x66ff66); 
     test.graphics.drawRect(-tileWidth*0.5, -tileHeight*0.5, tileWidth, tileHeight); 
     test.graphics.endFill(); 
     test.addEventListener(MouseEvent.MOUSE_OVER, overTile); 
     test.addEventListener(MouseEvent.MOUSE_DOWN, clickTile); 
     addChild(test); 
    } 

    function overTile (event:*) { 
     dispatchEvent(new GridEvent(GridEvent.HOVER, event.target)); 
    } 

    function clickTile(event:*) { 
     dispatchEvent(new GridEvent(GridEvent.TILECLICK, event.target)); 
    } 

} 

私のカスタムイベント

package 
{ 
    import flash.events.Event; 
    public class GridEvent extends Event 
    { 
     public static const HOVER :String = "hover"; 
     public static const TILECLICK :String = "click"; 
     public var item; 

     public function GridEvent (type:String, item) 
     { 
       this.item = item; 
       super(type); 
     } 

    } 
} 
+0

は、あなたの完全なソースコードのことですか?イベントに型を指定しなくても、FlashがMouseEventに関するエラーを出す理由はありません。他にも何か問題があるはずです。 –

+0

完全なコードは非常に広範であるため、すべてのコードではありません。しかし、私はこれと同じ問題が発生します。 私はそれがグラフィックスのプロパティを変更しようとしていることを確認します。私がそれをしないならば、私はエラーを受け取りません。だから私はなぜそれが私にonclick関数のエラーを与えるが、ホバー機能を理解していないのですか?返信いただきありがとうございます:) –

答えて

1

eventitem型を付与しようとしています。 MovieClipの代わりにSpriteを使用してください。

他のものは実装していません - あなたのタイルのカスタムタイルクラスを作成した場合、GridEventのアイテムのタイプをSprite/MovieClipではなくタイルとして設定することができます。

これは動作するはずです....

package 
{ 
    import flash.events.MouseEvent; 
    import flash.display.MovieClip; 
    public class PlayScreen extends MovieClip 
    { 
     public var grid:Grid; 

     public function PlayScreen() 
     { 
      grid = new Grid(); 
      grid.addEventListener(GridEvent.HOVER, onHover); 
      grid.addEventListener(GridEvent.TILECLICK, onClick); 
      grid.x = 0; 
      grid.y = 0; 
      addChild(grid); 

     } 

     private function onHover(event:GridEvent):void 
     { 
      if (event.item != null) 
      { 
       var g:Graphics = event.item.graphics; 
       g.beginFill(0x66ff66); 
       g.lineStyle(2, 0x22ff22); 
       g.drawRect(-30*0.5, -30*0.5, 30, 30); 
       g.endFill(); 
      } 
     } 

     private function onClick(event:GridEvent):void 
     { 
      if (event.item != null) 
      { 
       var g:Graphics = event.item.graphics; 
       g.beginFill(0x000000); 
       g.lineStyle(2, 0x22ff22); 
       g.drawRect(-30*0.5, -30*0.5, 30, 30); 
       g.endFill(); 
      } 
     } 
    } 
} 

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class Grid extends Sprite 
    { 
     public function Grid() 
     { 
      var test = new Sprite(); 
      test.x = 0; 
      test.y = 0; 
      test.graphics.beginFill(0x66ff66); 
      test.graphics.drawRect(-tileWidth*0.5, -tileHeight*0.5, tileWidth, tileHeight); 
      test.graphics.endFill(); 
      test.addEventListener(MouseEvent.MOUSE_OVER, overTile); 
      test.addEventListener(MouseEvent.MOUSE_DOWN, clickTile); 
      addChild(test); 

      test.mouseChildren = false; 
     } 

     private function overTile (event:MouseEvent):void 
     { 
      if (event.cancelable) 
      { 
       // stop MouseEvent from bubbling 
       event.stopImmediatePropagation(); 
      } 
      dispatchEvent(new GridEvent(GridEvent.HOVER, event.target)); 
     } 

     private function clickTile(event:MouseEvent):void 
     { 
      if (event.cancelable) 
      { 
       // stop MouseEvent from bubbling 
       event.stopImmediatePropagation(); 
      } 
      dispatchEvent(new GridEvent(GridEvent.TILECLICK, event.target)); 
     } 
    } 
} 

package 
{ 
    import flash.events.Event; 
    public class GridEvent extends Event 
    { 
     public static const HOVER :String = "hover"; 
     public static const TILECLICK :String = "click"; 
     public var item:Sprite; 

     public function GridEvent (type:String, item:Sprite) 
     { 
       this.item = item; 
       super(type); 
     } 

    } 
} 
+0

これは私の問題を解決しましたありがとうございます!あなたの例は素晴らしく、私はタイルクラスを作成しています:)。 –

関連する問題