2014-04-29 71 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