我一直在处理一个Tile Map,它正在工作,并根据数组中相关的数字在屏幕上显示这些瓷砖。
瓷砖0代表草,1代表水,2代表硬币。当用户点击硬币瓷砖,我需要它打开一个菜单,用户可以点击一个按钮,从瓷砖‘拿硬币’。
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!
}发布于 2015-05-12 19:18:28
有很多方法可以做到这一点,但最简单的方法可能是:
myMap变量旁边应该是很好的),它存储了最后单击的瓷砖
var clickedTile:Tile;var myMap:Array =[.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中的块。
发布于 2015-05-12 22:54:51
注意到你的问题已经被回答了,但我想提供一个额外的提示,我希望我早知道。
看起来您的所有瓷砖都是相同大小的,如果是这样的话,那么不要向所有单个瓷砖添加一个单击事件,只需将一个添加到瓷砖容器中,在本例中是使用该类的剪辑,然后根据鼠标位置确定单击的瓷砖如下……
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数组时更有意义,以后更容易遵循,您也可以使用类似于循环变量的方法来保持简单。
for(var yIndex:int = 0; yIndex < map.length ; xIndex++)
for(var xIndex:int = 0; xIndex < map[yIndex].length ; yIndex++)将不同的瓷砖存储在自己的2d数组中也是个好主意,而不是创建它们并将它们添加到舞台上,这将使您在移动瓷砖时更容易移除/更新单个瓷砖,因为您可以从舞台上删除单个行或列,因为仍然有引用,而不是循环遍历所有瓷砖和检查它们的ids。
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]);
}
}然后,当您想要删除一个瓷砖时,只需调用。
removeChild(tileArray[yIndex][xIndex]);
tileArray[yIndex][xIndex] = null;这也消除了对uId和iId的需求,因为该数组中的位置是id。
希望这会有所帮助:)
https://stackoverflow.com/questions/30199046
复制相似问题