我有一个装满瓷砖和其他资产的容器作为地图。在该容器的顶部是一个面具,用作玩家看到的相机。为了移动相机,我移动容器。
我可以使用以下公式将容器中的瓷砖居中:
container.x = ( ( (tile.x + (tile.width / 2) ) * container.scaleX) * -1) + (mask_width / 2);
container.y = ( ( (tile.y + (tile.height / 2) ) * container.scaleY) * -1) + (mask_height / 2);
这会将容器移动到相对于蒙版的位置,这样蒙版的中心就会成为相关的图块。
我最近添加了缩放功能,它只是调整容器的scaleX / scaleY以使其更大或更小。我已经修复了上面的居中代码来解释它,但是我在制作它时遇到了麻烦,因此随着视图的缩小,“相机”似乎没有移动。基本上,当缩小时,所有内容都会向左移动,因为容器会缩小。一旦我以上面的代码为中心,这一切都很好,但我需要一种方法根据scaleX和scaleY的差异将容器向右碰撞一下,以便在缩放时保持一切看起来像是在同一个位置。我已经尝试了一些东西,但我无法完全理解它。
答案 0 :(得分:0)
注释掉这段代码
container.x = ( ( (tile.x + (tile.width / 2) ) * container.scaleX) * -1) + (mask_width / 2);
container.y = ( ( (tile.y + (tile.height / 2) ) * container.scaleY) * -1) + (mask_height / 2);
加载时执行此代码
cam.x = container.width/2
cam.y = container.height/2
on resize / scale做类似的事情
container.x = container.x + amountOfWidthChanged/2
container.y = container.y + amountOfHeightChanged/2
答案 1 :(得分:0)
我通过对各种as3帮助程序类进行一些研究,设法自己解决这个问题。所以这里希望有这个问题的其他人偶然发现:
movieclip.transform.matrix允许您更改缩放scaleX / Y时缩放的点。 MatrixTransformer包含一个功能,可让您将两个点匹配在一起作为注册点。这是我使用的代码:
var mat:Matrix = container.transform.matrix.clone();
var externalCenter:Point = new Point(stage.mouseX, stage.mouseY);
var internalCenter:Point = new Point(container.mouseX, container.mouseY);
// container.scaleX and container.scaleY change here
MatrixTransformer.matchInternalPointWithExternal(matrix, internalCenter, externalCenter);
roomContainer.transform.matrix = matrix;