Actionscript 3 正确悬停在等距瓷砖精灵上

Actionscript 3 正确悬停在等距瓷砖精灵上,actionscript-3,events,isometric,Actionscript 3,Events,Isometric,我有四门课:Room、TileGrid、HoverTile和Tile 房间由墙壁和瓷砖组成。瓷砖是用瓷砖做的。目前,我使用以下代码从瓷砖中生成瓷砖ID: this.mapArray = [[1,1,1,1,1,1,1], [1,1,1,1,1,1,1], [1,1,1,1,1,1,1], [1,1,1,1,1,1,1],

我有四门课:Room、TileGrid、HoverTile和Tile

房间由墙壁和瓷砖组成。瓷砖是用瓷砖做的。目前,我使用以下代码从瓷砖中生成瓷砖ID:

    this.mapArray = [[1,1,1,1,1,1,1],
                         [1,1,1,1,1,1,1],
                         [1,1,1,1,1,1,1],
                         [1,1,1,1,1,1,1],
                         [1,1,1,1,1,1,1],
                         [1,1,1,1,1,1,1],
                         [1, 1, 1, 1, 1, 1, 1]];

        this._mapHeight = this.mapArray.length;
        this._mapWidth = this.mapArray[0].length;
        this._tileHeight = 23;
        this._tileWidth = 46;

        var initialX:Number = 260;
        var initialY:Number = 150;

        for (var isoY:int = 0; isoY < mapArray.length; isoY++)
        {
            for (var isoX:int = 0; isoX < mapArray[isoY].length; isoX++)
            {
                if (isoX == 0 && isoY == 0)
                {
                    var _tile:Tile = new Tile();
                    _tile.x = initialX;
                    _tile.y = initialY;
                    this.addChild(_tile);
                }

                if (this.mapArray[isoY][isoX] == 1)
                {
                    var _tile:Tile = new Tile();
                    _tile.x = initialX - (isoX * 20) - (isoY * 20);
                    _tile.y = initialY - (isoX * 10) + (isoY * 10);
                    addChild(_tile);

                    _tile.addEventListener(MouseEvent.MOUSE_OVER, updateHover);
                }
            }
        }
this.mapArray=[[1,1,1,1,1,1],
[1,1,1,1,1,1,1],
[1,1,1,1,1,1,1],
[1,1,1,1,1,1,1],
[1,1,1,1,1,1,1],
[1,1,1,1,1,1,1],
[1, 1, 1, 1, 1, 1, 1]];
this.\u mapHeight=this.mapArray.length;
this.\u mapWidth=this.mapArray[0]。长度;
这个。_tileHeight=23;
这是._tileWidth=46;
变量initialX:Number=260;
变量初始值:数字=150;
对于(变量isoY:int=0;isoY
我当前的问题是,我想在鼠标悬停的瓷砖周围添加一个白色正方形。我以前使用的代码是不够的,因为瓷砖精灵的透明部分仍然算作它的一部分。因此,即使我指向另一个Tile2(在Tile1旁边),例如,如果我离Tile2不够远,它也会高亮显示Tile1

下面是我目前使用的代码:

    public function updateHover(e:MouseEvent):void
    {
        var mX:int = e.stageX - (_tileWidth / 2);
        var tPoint:Point = pointToXY(mX, e.stageY);

        var isoX = tPoint.x;
        var isoY = tPoint.y;

        if (isoX >= 0 && isoY >= 0)
        {
            if (isoY < mapArray.length)
            {
                if (isoX < mapArray[0].length)
                {
                    tPoint = xyToPoint(isoX, isoY);
                    _tileHover.x = tPoint.x;
                    _tileHover.y = tPoint.y;
                    _tileHover.visible = true;
                    return;
                }
            }
        }

        _tileHover.visible = false;
    }

    public function pointToXY(x:int, y:int):Point
    {
        x -= 260;
        y -= 150;

        var pRatio:int = (_tileWidth / 2) / (_tileHeight / 2);
        var tX:int = (y + x / pRatio) * (pRatio / 2) / (_tileWidth / 2);
        var tY:int = (y - x / pRatio) * (pRatio / 2) / (_tileWidth / 2);

        return new Point(tX, tY);
    }

    public function xyToPoint(x:int, y:int):Point
    {
        x -= 1;

        var worldPoint:Point = new Point(0, 0);
        worldPoint.x = (x * (_tileWidth / 2)) - (y * (_tileWidth / 2));
        worldPoint.y = (x * (_tileHeight / 2)) + (y * (_tileHeight / 2));
        worldPoint.x = worldPoint.x + (_tileWidth / 2);
        worldPoint.y = worldPoint.y + (_tileHeight / 2);
        worldPoint.x += 260;
        worldPoint.y += 150;

        return worldPoint;
    }
public函数updateHover(e:MouseEvent):void
{
var mX:int=e.stageX-(_tileWidth/2);
var tPoint:Point=pointToXY(mX,e.stageY);
var isoX=t点x;
var isoY=t点y;
如果(isoX>=0&&isoY>=0)
{
if(isoY
对不起,我必须发布这么多代码块。现在,260和150是整个房间的默认起点。也就是说,我真的很困惑如何让最后两个函数特别工作,这样它们才能给我正确的答案。这就是我对使用此代码的期望:


那太好了。但是,再一次,我不知道为什么代码不起作用。尺寸都是正确的,我相信偏移量也是正确的。因此,首先,您应该将侦听器添加到
,而不是添加到
\u tile
,因为这样您就锁定到stage坐标以确定所选的tile,这不好。其次,您的侦听器应该反对
MouseEvent.MOUSE\u MOVE
事件,而不是结束,这样您将不断获得更新的鼠标坐标,以便在平铺上正确移动矩形。这里有一个小错误,创建了两次(0,0)平铺,其中一次处于非活动状态

    for (var isoY:int = 0; isoY < mapArray.length; isoY++)
    {
        for (var isoX:int = 0; isoX < mapArray[isoY].length; isoX++)
        {
            if (this.mapArray[isoY][isoX] == 1)
            {
                var _tile:Tile = new Tile();
                _tile.x = initialX - (isoX * 20) - (isoY * 20);
                _tile.y = initialY - (isoX * 10) + (isoY * 10);
                addChild(_tile);
            }
        }
    }
    this.addEventListener(MouseEvent.MOUSE_MOVE, updateHover);
这将创建一个按维度匹配
mapArray
的空数组,该空数组将用作已创建的
Tile
对象的占位符。执行此操作后,调用
this.tilerray[isoY][isoX]=\u tile
将新创建的磁贴放置到其位置。之后,您可以将侦听器改写为:

public function updateHover(e:MouseEvent):void
{
    var p:Point=pointToXY(e.localX,e.localY);
    _tileHover.visible = false; // hide hover for now
    if ((p.y<0) || (p.y>=tileArray.length)) return;  // range error on Y
    if ((p.x<0)||(p.x>=tileArray[p.y].length)) return; // range error on X
    if (!tileArray[p.y][p.x]) return; // no tile
    var _tile:Tile=tileArray[p.y][p.x];
    _tileHover.x=_tile.x;
    _tileHover.y=_tile.y; // no need to convert xyToPoint() we have coords stored in tile
    _tileHover.visible=true;
}
public函数updateHover(e:MouseEvent):void
{
var p:Point=pointToXY(e.localX,e.localY);
_tileHover.visible=false;//暂时隐藏悬停
if((p.y=tilerray.length))返回;//y上的范围错误
if((p.x=tilarray[p.y].length))返回;//x上的范围错误
如果(!tilerray[p.y][p.x])返回;//无tile
var_tile:tile=tilerray[p.y][p.x];
_tileHover.x=_tile.x;
_tileHover.y=\u tile.y;//不需要转换xyToPoint(),我们在tile中存储了坐标
_tileHover.visible=true;
}

您当前的不良行为是什么样子的?您正在为(0,0)坐标创建两个
平铺
对象。而且,您可能应该使用
e.localX
e.localY
作为传递给
pointToXY()
的坐标。还可以考虑运行调试文本字段,它将显示当前坐标、“代码> PooToCyyYe()/代码>和向后转换的结果,很有可能在XyPoT功能中有一个键入。此外,还有一些库为您做了很多这件事,由于某种原因,总是存在范围错误!我开始思考
ptToXY()
xytop()
f
public function updateHover(e:MouseEvent):void
{
    var p:Point=pointToXY(e.localX,e.localY);
    _tileHover.visible = false; // hide hover for now
    if ((p.y<0) || (p.y>=tileArray.length)) return;  // range error on Y
    if ((p.x<0)||(p.x>=tileArray[p.y].length)) return; // range error on X
    if (!tileArray[p.y][p.x]) return; // no tile
    var _tile:Tile=tileArray[p.y][p.x];
    _tileHover.x=_tile.x;
    _tileHover.y=_tile.y; // no need to convert xyToPoint() we have coords stored in tile
    _tileHover.visible=true;
}