2014-04-29 99 views
0

我想通過FlashDevelop編寫一種策略遊戲,並且在嘗試使用事件(特別是MouseEvents)時出現問題。這並不是說事件正在返回錯誤,而只是他們不做任何事情,甚至沒有得到任何跟蹤。Actionscript 3.0 - MouseEvents不工作

我試圖使點擊時六角形HexObject圖像不可見(只是一個簡單的測試,看看MouseEvent是否實際工作)。

這是我的代碼:

Main.as

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

    /** 
    * ... 
    * @author Dean Sinclair 
    */ 

    public class Main extends Sprite { 

     public var gameInitialised:Boolean = false; 
     public var MIN_X:int = 0; 
     public var MAX_X:int = stage.stageWidth; 
     public var MIN_Y:int = 0; 
     public var MAX_Y:int = stage.stageHeight - 100; 

     public var GameGrid:HexGrid = new HexGrid(MIN_X, MAX_X, MIN_Y, MAX_Y); 
     public var blackBG:Shape = new Shape(); 

     public function Main():void { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      addEventListener(Event.ENTER_FRAME, update); 
      // entry point 
     } 

     private function update(event:Event):void { 
      if (gameInitialised == false) { 
       GameGrid.initialiseGrid(); 
       initialiseBackground(); 
       gameInitialised = true; 
      } 

      updateGraphics(); 
     } 

     public function drawGrid():void { 
      for (var x:int = 0; x < GameGrid.TOTAL_X; x++) { 
       for (var y:int = GameGrid.yArray[x][0]; y < GameGrid.yArray[x][1]; y++) { 
        if (x != GameGrid.nox || y != GameGrid.noy) { 
         GameGrid.Grid[x][y].update(); 
         this.stage.addChild(GameGrid.Grid[x][y].image); 
        } 
       } 
      } 
     } 

     public function updateGraphics():void { 
      this.stage.addChild(blackBG); 
      drawGrid(); 
     } 

     public function initialiseBackground():void { 
      blackBG.graphics.beginFill(0x000000, 1); 
      blackBG.graphics.lineStyle(10, 0xffffff, 1); 
      blackBG.graphics.drawRect(0, 0, stage.stageWidth-1, stage.stageHeight-1); 
      blackBG.graphics.endFill(); 
     } 

    } 

} 

HexGrid.as

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

    /** 
    * ... 
    * @author Dean Sinclair 
    */ 
    public class HexGrid extends Sprite { 

     public static var HEX_RADIUS:int = 0; 
     public static var HEX_DIAMETER:int = 0; 
     public static var GRID_WIDTH:int = 0; 
     public static var GRID_HEIGHT:int = 0; 
     public var TOTAL_X:int = 0; 

     public var MIN_X:int = 0; 
     public var MAX_X:int = 0; 
     public var MIN_Y:int = 0; 
     public var MAX_Y:int = 0; 

     public var Grid:Array; 
     public var yArray:Array; 

     public function HexGrid(min_x:int, max_x:int, min_y:int, max_y:int) { 
      super(); 
      MIN_X = min_x; 
      MAX_X = max_x; 
      MIN_Y = min_y; 
      MAX_Y = max_y; 
     } 

     public function initialiseGrid():void { 
      setGridDetails(); 
      setLineLengths(); 
      setGridPositions(); 
     } 

     public function setGridDetails():void { 
      HEX_RADIUS = 25; 
      HEX_DIAMETER = 2 * HEX_RADIUS; 
      GRID_WIDTH = (((MAX_X - MIN_X)/HEX_DIAMETER) - 1); 
      GRID_HEIGHT = ((((MAX_Y - 100) - MIN_Y)/(HEX_DIAMETER - (HEX_DIAMETER/3))) - 3); 
      TOTAL_X = GRID_WIDTH + Math.floor((GRID_HEIGHT - 1)/2); 
     } 

     private function setLineLengths():void { 
      yArray = new Array(TOTAL_X); 
      for (var a:int = 0; a < TOTAL_X; a++) { 
       yArray[a] = new Array(2); 
      } 
      for (var x:int = 0; x < TOTAL_X; x++) { 
       if (x < GRID_WIDTH) { 
        yArray[x][0] = 0; 
       }else { 
        yArray[x][0] = (x - GRID_WIDTH + 1) * 2; 
       } 
       yArray[x][1] = 1 + (2 * x); 
       if (yArray[x][1] > GRID_HEIGHT) { 
        yArray[x][1] = GRID_HEIGHT; 
       } 
       trace("Line", x, " starts at", yArray[x][0], " ends at", yArray[x][1]); 
      } 
     } 

     public var nox:int = 5; 
     public var noy:int = 3; 

     private function setGridPositions():void { 
      var hexState:int = 4; 

      Grid = new Array(TOTAL_X); 
      for (var x:int = 0; x < TOTAL_X; x++) { 
       Grid[x] = new Array(yArray[x][1]); 
       for (var y:int = yArray[x][0]; y < yArray[x][1]; y++) { 
        if(nox!=4 || noy!=6){ 
         Grid[x][y] = new HexObject(HEX_DIAMETER + (HEX_DIAMETER * x) - (HEX_RADIUS * y), HEX_DIAMETER + (HEX_DIAMETER * y) - ((HEX_DIAMETER/3) * y), HEX_RADIUS, 2); 
        } 
       } 
      } 
     } 
    } 
} 

HexObject.as

package { 
    import flash.display.Bitmap; 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    /** 
    * ... 
    * @author Dean Sinclair 
    */ 
    public class HexObject extends Sprite { 
     [Embed(source = "../images/hexagons/hex_darkRed.png")] 
     private var DarkRedHex:Class; 
     [Embed(source = "../images/hexagons/hex_lightBlue.png")] 
     private var LightBlueHex:Class; 
     [Embed(source = "../images/hexagons/hex_midGreen.png")] 
     private var MidGreenHex:Class; 

     public var image:Bitmap = new LightBlueHex(); 
     protected var state:int = 0; 
     private var radius:int = 0; 

     public function HexObject(xPos:int, yPos:int, hexRadius:int, hexState:int) { 
      super(); 
      x = xPos; 
      y = yPos; 
      state = hexState; 
      radius = hexRadius; 
      checkState(); 
      initialiseGraphics(); 
     } 

     private function checkState():void { 
      switch(state) { 
       case 1:  // plains 
        image = new MidGreenHex(); 
        break; 
       case 2:  // hills 
        break; 
       case 3:  // rock 
        image = new DarkRedHex(); 
        break; 
       case 4:  // water 
        image = new LightBlueHex(); 
        break; 
       default: 
        break; 
      } 
     } 

     private function initialiseGraphics():void { 
      image.visible = true; 
      image.width = radius * 2; 
      image.height = radius * 2; 
      image.x = x - radius; 
      image.y = y - radius; 
     } 

     private function onMouseClick(e:MouseEvent):void { 
      image.visible = false; 
      trace("image.visible =", image.visible); 
     } 

     public function update():void { 
      image.addEventListener(MouseEvent.CLICK, onMouseClick); 
     } 
    } 
} 

我已經試過無數方法讓事件起作用,但沒有一個可以e有任何成功。任何解決這個問題的方法都將是一個救星,因爲我一直在爲此工作數小時,謝謝!

+0

你有很多初始化代碼裏面​​調用每一幀的功能,我會開始提取 – VBCPP

+0

我已經重新設計的代碼,以便初始化的代碼不被調用每一幀,它是整齊的,但它仍然不顯示痕跡。就好像這些物體甚至沒有被添加到舞臺上,儘管它們顯示正確。 – DeanoMachino

+0

我會建議編輯您的帖子以顯示更新的代碼。但無論如何,你的問題是,該圖像是一個'位圖'贏得了; t派遣mouseevents,把它放在容器'雪碧' – VBCPP

回答

1

我的問題被修復了VBCPP,我在使用無法分派MouseEvents的類Bitmap。該解決方案是採取imageHexObject並把它Sprite類型的容器內,與邏輯之一是它是在對象我不得不添加以下代碼內:

this.addChild(image); 

,然後只請參閱將來的對象,而不是image