首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3阵列瓷砖发动机

AS3阵列瓷砖发动机
EN

Stack Overflow用户
提问于 2015-05-12 18:43:27
回答 2查看 64关注 0票数 0

我一直在处理一个Tile Map,它正在工作,并根据数组中相关的数字在屏幕上显示这些瓷砖。

瓷砖0代表草,1代表水,2代表硬币。当用户点击硬币瓷砖,我需要它打开一个菜单,用户可以点击一个按钮,从瓷砖‘拿硬币’。

代码语言:javascript
复制
    var myMap: Array = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
    ];


    for (var i: int = 0; i < mapHeight; i++) {
        for (var u: int = 0; u < mapWidth; u++) {
            var tile: MovieClip = new Tile();
            tile.gotoAndStop(myMap[i][u] + 1);
            tile.x = tileSize * u
            tile.y = tileSize * i
            tile.theIDi = i;
            tile.theIDu = u;
            tile.buttonMode = true;


            addChildAt(tile, 0);
            tile.addEventListener(MouseEvent.CLICK, clickTile);

        }
    }

    function clickTile(event: MouseEvent) {
         positionX = event.currentTarget.theIDu;
         positionY = event.currentTarget.theIDi;

         if(myMap[positionX][positionY] == 2) {
             openGoldMenu(positionX, positionY);                    
         }
    }

    function openGoldMenu() {
         takeCoinsMenu.x = 100;
         takeCoinsMenu.y = 200;
         buttonTake.addEventListener(MouseEvent.CLICK, takeCoins);
    }

    function takeCoins(event: MouseEvent) {
         myStats[0].gold = myStats[0].gold + 10;

         WHAT TO WRITE HERE? HOW CAN I ACCESS THE CURRENT TILE THAT WAS CLICKED WITH THE GOLD COIN ON? URGH CONFUSED!
     }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 19:18:28

有很多方法可以做到这一点,但最简单的方法可能是:

  1. 创建一个变量(确保它是在任何方法之外声明的,所以您的myMap变量旁边应该是很好的),它存储了最后单击的瓷砖 var clickedTile:Tile;var myMap:Array =[.
  2. clickTile函数中,填充该变量: 函数clickTile(event: MouseEvent) { clickedTile = event.currentTarget as Tile;var event.currentTarget x:int= clickedTile.theIDu;var位置Y:int= clickedTile.theIDi;if(myMappositionX == 2) { openGoldMenu(positionX,positionY);}}

现在,在您的takeCoins方法中,您可以引用存储在clickedTile中的块。

票数 1
EN

Stack Overflow用户

发布于 2015-05-12 22:54:51

注意到你的问题已经被回答了,但我想提供一个额外的提示,我希望我早知道。

看起来您的所有瓷砖都是相同大小的,如果是这样的话,那么不要向所有单个瓷砖添加一个单击事件,只需将一个添加到瓷砖容器中,在本例中是使用该类的剪辑,然后根据鼠标位置确定单击的瓷砖如下……

代码语言:javascript
复制
addEventListener(MouseEvent.CLICK, clickEventHandler);

private function clickEventHandler(e:MouseEvent):void
{
var uId:int = Math.floor((mouseX - this.x) / tileSize);
var iId:int = Math.floor((mouseY - this.y) / tileSize);

if(myMap[uId][iId] == 2)
{
openGoldMenu(uId,iId);
}
}

这样,您只需要设置一个事件侦听器,在以后需要禁用它时,这将更快、更容易管理,除非稍后需要它们,否则您也可能不再需要在瓷砖中设置theIDi和theIDu变量。

另外,我想说不要使用iId或uId,使用xId和yId或xIndex和yIndex,在使用2d数组时更有意义,以后更容易遵循,您也可以使用类似于循环变量的方法来保持简单。

代码语言:javascript
复制
for(var yIndex:int = 0; yIndex < map.length ; xIndex++)
for(var xIndex:int = 0; xIndex < map[yIndex].length ; yIndex++)

将不同的瓷砖存储在自己的2d数组中也是个好主意,而不是创建它们并将它们添加到舞台上,这将使您在移动瓷砖时更容易移除/更新单个瓷砖,因为您可以从舞台上删除单个行或列,因为仍然有引用,而不是循环遍历所有瓷砖和检查它们的ids。

代码语言:javascript
复制
var tileArray:Array = new Array();

for(var yIndex:int = 0; yIndex < map.length; yIndex++)
{
if(tileArray[yIndex] == null) tileArray[yIndex] = new Array();
for(var xIndex:int = 0; xIndex < map[yIndex].length; xIndex++)
{
tileArray[yIndex][xIndex] = new Tile();
tileArray[yIndex][xIndex].x = xIndex * tileSize;
tileArray[yIndex][xIndex].y = yIndex * tileSize;
addChild(tileArray[yIndex][xIndex]);
}
}

然后,当您想要删除一个瓷砖时,只需调用。

代码语言:javascript
复制
removeChild(tileArray[yIndex][xIndex]);
tileArray[yIndex][xIndex] = null;

这也消除了对uId和iId的需求,因为该数组中的位置是id。

希望这会有所帮助:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30199046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档