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 是一个变量,我将其设置为等于 tile 对象。

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

            }

它只是停留在原处。我只想让敌人在其敌人VisionArea 击中的任何瓷砖上自行移动测试附近的瓷砖。beginfloor1 函数似乎不起作用。有什么方法可以将enemyMover = event.currentTarget 声明为Tile 并让敌人在其enemyVisionArea 被hitTesting 的随机图块上移动?

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

4

1 回答 1

1

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

我希望您希望敌人检查是否有可移动的瓷砖。您实际上是在检查一个图块enemyMover- 您如何确定该图块是什么?您必须检查敌人周围所有可用的图块,列出它们并从该列表中选择一个不是当前图块的图块,然后将敌人移动到那里。

所以,首先你需要一个完整的瓦片集可以从某个地方寻址。最好的方法是声明一个类范围var tileset:Array并在你制作新瓷砖的地方填充它。从那里的代码中删除Event.ENTER_FRAME侦听器,因为它没用。然后,在你的timerevent那是为了敌人,你检查所有的,tileset如果他们在你的敌人的视野范围内(你使用hitTestObject,我会使用清晰的距离网格或坐标 - 它要快得多),如果是这样,你将它们添加到你在该函数中创建的 TEMPORARY 数组中。当然,如果你的敌人在当前处理的单元格,你忽略它 - 你必须移动你的敌人,而不是让他站在原地。然后,选择(不知何故,这取决于你)你的敌人应该移动到哪个单元格,并执行一个移动。是的,如果你想让你的敌人随机移动,通过它的索引随机选择一个单元格Math.floor(Math.random()*selectedcells.length)

于 2013-05-08T10:38:46.060 回答