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 中的位置。
如果不了解这些事情,很难说问题出在哪里:
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);
如果您按照所有这些步骤进行操作,那么这基本上就是您所需要的,并且肯定会奏效。
我在 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 中的位置。
如果不了解这些事情,很难说问题出在哪里:
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);
如果您按照所有这些步骤进行操作,那么这基本上就是您所需要的,并且肯定会奏效。