【问题标题】:AS3 Change position of object in TileListAS3 更改 TileList 中对象的位置
【发布时间】:2015-02-01 01:44:07
【问题描述】:

我在 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.

【问题讨论】:

  • 你能分享任何代码和/或错误信息吗?
  • 我用代码编辑了原帖,还加了一张图片来说明问题。
  • MovieClips 是如何填充图像的?它们是从外部源加载的还是使用 IDE 嵌入的?

标签: actionscript-3 flash position tilelist


【解决方案1】:

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

顺便说一句,您不必投射 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);

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

【讨论】:

  • 谢谢你,我得到了它!作为一个临时解决方案,我将movieClips 放在另一个movieClip 中并在那里改变了它们的位置,但是那个解决方案有点乱,所以这个效果更好。
猜你喜欢
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2023-03-06
相关资源
最近更新 更多