2013-05-08 152 views
0

为了让事情变得快速,我有一个玩家和敌人在一起的瓷砖布置。敌人随机移动

public static var floor1:Array = new Array(7); 
     floor1[0] = [0,1,1,1,1,1,0]; 
     floor1[1] = [1,1,1,1,1,1,1]; 
     floor1[2] = [1,1,1,0,1,1,1]; 
     floor1[3] = [1,1,0,0,0,1,1]; 
     floor1[4] = [1,1,1,0,1,1,1]; 
     floor1[5] = [1,1,1,1,1,1,1]; 
     floor1[6] = [0,1,1,1,1,1,0]; 
     public function Main() 
     { 

      var tilew:int = 60; 
      var tileh:int = 60; 

      for (var i:int=0; i<floor1.length; i++) 
      { 
       for (var u:int=0; u<floor1[i].length; u++) 
       { 
        var cell:MovieClip = new Tile(); 
        cell.gotoAndStop(floor1[i][u]); 
        cell.x = ((u-i)*tileh); 
        cell.y = ((u+i)*tilew/2); 
        addChild(cell); 


        cell.addEventListener(MouseEvent.ROLL_OVER, mouseover); 
        cell.addEventListener(MouseEvent.ROLL_OUT, mouseout); 
        cell.addEventListener(MouseEvent.CLICK, mouseclick); 
        cell.addEventListener(Event.ENTER_FRAME, beginfloor1); 


       } 
      } 

      var player:Player = new Player(); 
     addChild(player); 
     player.mouseEnabled = false; 
     player.x = 5 * (tileh); 
     player.y = 5 * (tilew/2); 


     var enemy:Enemy = new Enemy(); 

     addChild(enemy); 
     enemy.mouseEnabled = false; 
     enemy.x = 9 * (tileh); 
     enemy.y = 9 * (tileh/2); 

我的目标是让敌人在他的范围内随机移动瓷砖。我所做的是创建一个名为enemyVisionArea的方形图形,用于检查哪个瓷砖击中敌人,基本上是围绕瓷砖。

我有一个计时器功能,告诉敌人每5秒移动一次,如果玩家不在他附近,并且他在旁边有可用的方块。

function timerenemy (event:TimerEvent){ 
       if (enemy.enemyVisionArea.hitTestObject(enemyMover) && !player.visionPoint.hitTestObject(enemyMover.tileMiddle)) 
        { 
         enemy.x = (enemyMover.x)+55; 
         enemy.y = (enemyMover.y)+20; 
         trace("moved"); 

        } 
      } 

enemyMover是一个变量,我使它等于瓦片对象。

function beginfloor1(event:Event) 
      { 
       enemyMover = event.currentTarget as Tile; 

      } 

它只是停留在原地。我只是想让敌人自己在敌方视野区域的任何一块瓦片上击中附近的一块瓦片。 beginfloor1函数似乎没有工作。有没有什么办法可以将enemyMover = event.currentTarget声明为Tile并让敌人移动到其enemyVisionArea进行测试的随机区块上?

如果这是令人困惑的,我可以发布完整的代码。

回答

1

您正在分配49个按顺序调用的框架监听器,并且它们都将一个变量更改为它们所连接的单元。当然,最后一块是始终分配的。

我希望你希望敌人检查是否有可用的瓷砖移动到。你本质上是检查一个是enemyMover的瓷砖 - 你如何确定那个瓷砖是什么?你必须检查敌人周围的所有可用区域,制作一个列表并从列表中选择一个不是当前区域的区域,然后将敌人移动到那里。

所以,首先你需要一个完整的tileset从某个地方寻址。最好的方法是申报一个班级var tileset:Array并填写你制作新瓷砖的地方。从代码中删除Event.ENTER_FRAME监听器,因为它没用。然后,在敌人的timerevent中,如果敌人位于敌人的视野范围内(hitTestObject,我使用明确的距离网格或协调方式 - 更快),请检查所有tileset,如果是这样,您将它们添加到您在该函数中创建的TEMPORARY数组中。当然,如果你的敌人在目前处理的单元格中,你会忽略它 - 你必须移动你的敌人,而不是让他站在原地。然后,选择(不知何故,由你决定)你的敌人应该移动到什么单元格并执行移动。是的,如果你想让你的敌人随机移动,请通过Math.floor(Math.random()*selectedcells.length)索引随机选择一个单元格。

+0

感谢您的回答。用数组替换enemyMover是有意义的,因为它不止一个tile。关于psuedo tileset数组变量,我想让它等于floor1变量数组吗? – Bindlestick 2013-05-08 21:44:58

+0

'floor1'只是一组索引,而你需要一个相应的'Tile'对象来引用。但是,使用'floor1'和tileset会帮助你过滤不可行的瓷砖。 – Vesper 2013-05-09 06:55:18

+0

我将如何使tileset等于一个Tile对象?我已经尝试在之前进行赋值,并且它说数组不能等于影片剪辑 – Bindlestick 2013-05-10 18:37:50