AS3 改变对象在 TileList 中的位置

AS3 Change position of object in TileList

我在 ActionScript 3 中使用 tileList 来显示动画片段。但是我遇到的问题是,并非所有动画片段的参考点都在正确的位置。这导致这些动画片段部分显示在 tileList 中它们的单元格之外。

我尝试在将影片剪辑添加到 tileList 之前调整其 x 和 y 位置,但这并没有改变任何东西。现在我试图找出是否可以更改 tileList 中已有对象的 x 和 y 位置,但没有找到任何答案。

我希望我已经把我的问题说清楚了。 提前致谢!

编辑:

这是我试过的代码:

private function initTileList():void {
    for(var i:int = 0; i < _movieClips.length; i++) {
        changePos(_movieClips[i]);
        tileList.addItem({label: _movieClips[i].name, source: _movieClips[i]});
    }
}

private function changePos(mc:MovieClip):void {
    if(MovieClip(mc).getRect(mc).x != 0) {
        mc.x -= MovieClip(mc).getRect(stateMachineRef).x;
}
    if(MovieClip(mc).getRect(mc).y != 0) {
        mc.y -= MovieClip(mc).getRect(stateMachineRef).y;
    }
}

我没有任何错误,只是不影响对象在 tileList 中的位置。

Example of how the problem looks.

如果不了解这些事情,很难说问题出在哪里:
1. tileList.AddItem() 究竟做了什么;
2.什么是stateMachineRef
3. 如何加载 MovieClips。如果它们是从网络加载的,那就完全不同了。

顺便说一下,您不必投射 MovieClip(mc),因为 mc 已经是一个 MovieClip。此外,何时更正坐标也没有区别:添加到 tileList 之前或之后。无论哪种方式都应该有效。

因此,鉴于您的问题信息不完整,我建议您确保执行以下步骤:

-我们假设所有图块都显示在图块容器内。它可以是 Stage 或 MovieClip 或任何合适的 DisplayObjectContainer,所以从现在开始我们就称它为 tileContainer。

-我们假设所有图块的宽度和高度都相同。如果您不确定,您应该再次检查。

-我们假设 tileContainer 中的每个图块都显示在一些规则的网格坐标处。 IE。它符合以下代码:

for (var pos_y:int = 0; pos_y < GRID_SIZE_Y; pos_y++) {
    for (var pos_x:int = 0; pos_x < GRID_SIZE_X; pos_x++) {
        var tile:Tile = getNextTile(); // just get a tile from somewhere
        tile.source.x = pos_x * TILE_WIDTH; // using your tile structure
        tile.source.y = pos_y * TILE_HEIGHT;
        tileContainer.addChild(tile.source);
    }
}

现在我看到了您的问题,即某些图块的创建方式使其源影片剪辑坐标从 (0,0) 偏移。所以它们不会与网格对齐。

你在做什么似乎是对齐它们的正确方法,但我不知道你的代码到底发生了什么,所以我会重写它:

function changePos(mc:MovieClip) {
   var r:Rectangle = mc.getRect(mc);
   mc.x -= r.x; // note you don't need any if's
   mc.y -= r.y;
}

在上面的循环中,只需在设置网格坐标后添加 changePos():

tile.source.x = pos_x * TILE_WIDTH;
tile.source.y = pos_y * TILE_HEIGHT;
changePos(tile.source);
tileContainer.addChild(tile.source);

如果您按照所有这些步骤进行操作,那么这基本上就是您所需要的,并且肯定会奏效。