2011-12-25 2 views
0

* EDIT - Я нахожу то, что дает мне ошибку, когда я пытаюсь изменить графические свойства мувиклипа. *Исходная ошибка AS3 с использованием настраиваемого события

Я получаю эту ошибку. "ReferenceError: Ошибка # 1069: Элемент свойства не найден на flash.events.MouseEvent и нет значения по умолчанию. На PlayScreen/onClick()". Я сделал немного исследований, и большинство сайтов говорят, что это из-за опечатки. но насколько я могу сказать, это выглядит хорошо?

У меня есть два события, которые указаны точно так же, насколько я могу судить. Один из них запускается onclick, а другой - на ходу. Событие hover работает нормально, но когда я использую событие onclick, я получаю ошибку выше. Однако, хотя я получаю ошибку, функция все еще работает так, как должна.

Вот мой код. приведенный ниже код создает новую сетку. затем добавляются пользовательские события. событие hover отлично работает без ошибок. событие 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(); 
    } 

Ниже мой класс сетки. Он содержит мувиклип с двумя добавленными mouseEvents, которые затем запускают пользовательские события.

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

попробовать давая тип event и item. Sprite вместо MovieClip.

и еще одна вещь, которую я не реализовал - было бы лучше, если бы вы создали пользовательский класс Tile для своих плит, тогда вы могли бы установить тип элемента в своем GridEvent как Tile, а не как 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

Спасибо, это решило мою проблему! ваши примеры велики, и я буду создавать класс плитки :). –

Смежные вопросы