AS3在TileList中更改对象的位置

时间:2015-01-30 08:19:27

标签: actionscript-3 flash position tilelist

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

我尝试在将movieClip添加到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 个答案:

答案 0 :(得分:0)

很难说在不知道这些事情的情况下问题出在哪里:
1. tileList.AddItem()的确做什么;
2.什么是stateMachineRef
3.如何加载MovieClip。如果它们是从网络加载的,那将是一个完全不同的故事。

顺便说一下,你不必投射MovieClip(mc),因为mc已经是MovieClip。此外,您何时更正坐标没有区别:在添加到tileList之前或之后。应该以任何方式工作。

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

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

- 我们假设所有瓷砖的宽度和高度相同。如果您不确定,请再次检查。

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

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);

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