Flash 使用MovieClip.transform.matrix问题进行变换

Flash 使用MovieClip.transform.matrix问题进行变换,flash,actionscript,matrix,transformation,Flash,Actionscript,Matrix,Transformation,我在Flash cs4中处理转换时遇到问题 当我旋转我的movieclip并跟踪输出时,我的movieclip的宽度也改变了 我不知道为什么这是一个问题——这是预期的行为。剪辑的宽度是从最左侧边缘到最右侧边缘的实际像素数-如果剪辑旋转,则会发生变化。如果您的剪辑中有一个子剪辑,则该剪辑的宽度不会改变,因为它的旋转大概不会改变。这是flash player中的一个错误。您可以做以下几件事: 选项1(可能是最好的方式): 创建MovieClip的子类,并覆盖宽度和高度的get和set方法。 让se

我在Flash cs4中处理转换时遇到问题


当我旋转我的movieclip并跟踪输出时,我的movieclip的宽度也改变了

我不知道为什么这是一个问题——这是预期的行为。剪辑的宽度是从最左侧边缘到最右侧边缘的实际像素数-如果剪辑旋转,则会发生变化。如果您的剪辑中有一个子剪辑,则该剪辑的宽度不会改变,因为它的旋转大概不会改变。

这是flash player中的一个错误。您可以做以下几件事:


选项1(可能是最好的方式):

创建MovieClip的子类,并覆盖宽度和高度的get和set方法。 让setter调用super,并将值存储为私有变量(例如_width/_height) 调用get时,返回私有变量。 由于您使用的是矩阵,请重写get和set矩阵函数,使用新函数设置缩放因子,并在调用super之前将其设置为“不缩放”。 工作原理:设置程序不受此错误的影响


备选案文2:

使用scaleX/scaleY获得宽度/高度,并乘以0旋转、1.0缩放的宽度和高度值。 工作原理:scaleX/scaleY不受此错误的影响



快乐编码

旋转剪辑时,宽度/高度将发生变化。如果不希望出现这种行为,请改用scaleX/scaleY属性。

确定。。我的错。。我终于看到了我的错误:)。 我以前确信这是一个bug。虽然布兰登是对的,但我还是觉得很困惑。这是一个最终证明Branden是正确的示例,最后两个值之间没有差异

var box = new Sprite();
box.graphics.beginFill(0xFF0000);
box.graphics.drawRect(0, 0, 100, 100);
this.addChild(box);

trace(box.width);
box.rotation = 45;
trace(box.width);
box.width = 141.4;
trace(box.width);
编辑:
你可能仍然想查看Pipep的grantskinner链接表,上面描述了一些我想证明的东西,但是成功了(在Flash CS3-AS3中)

我意识到这是一篇相当古老的帖子,所以如果这破坏了论坛在NecroPost上的礼仪,我深表歉意。然而,这是谷歌搜索一个相当小的问题的第一个结果,似乎并没有提供一种检索显示对象未旋转宽度或高度的好方法

问题是,通过询问宽度和高度,你似乎得到了对象的全局边界,当你想要的是局部边界时,你就是这样做的:(只要把整个东西复制粘贴到一个flash文件中,然后编译,看看我的意思)


这不是一个bug。flash播放器一直都是这样工作的。这是flash中的一个bug。如果我没记错的话,Flash播放器在FP8中的行为是这样的。或者,好吧,如果你不想把它命名为bug,那么它仍然是一个令人困惑的重大变化。这是Flash中的bug。虽然边界框(您描述的)应该更改,但宽度应该返回内容的实际宽度,而不是缩放和调整大小。错误可能意味着这种行为在某种程度上是不正常的-事实并非如此。Flash中宽度和高度的含义始终是指在实际显示点处,而不是在缩放、旋转等之前。如果要忽略该信息,则需要将内容堆叠在内部并测量内部剪辑。请查看我的回答,以了解我认为此行为错误的原因。从你所说的,恢复一个精灵的原始大小将是一项相当艰巨的任务。仅仅因为某些东西不能按你所希望的方式工作,并不意味着它是错误的或是错误的。请查看派普在格兰特·斯金纳评论中发布的链接。我因缺乏榜样而偏离了方向。你在宽度与边界框宽度的问题上是正确的,但是请检查以查看描述的奇怪问题。这种情况发生在使用AS 3的Flash CS3中。我的猜测是,这是一个actionscript问题,可能在CS4中得到了修复(但我现在没有CS4要测试)。
import flash.display.Sprite;

var spr=new Sprite()
spr.graphics.beginFill(0xff0000);
spr.graphics.drawRect(-25,-100,50,200);
addChild(spr);

spr.y=150
spr.x=300
function myOEF(e)
{
    spr.rotation++
    trace(spr.width,spr.height);
    var bounds=spr.getBounds(this)
    trace("A: Global bounds: "+bounds);
    var bounds=spr.getBounds(spr)
    trace("B: Local bounds: "+bounds);
}

addEventListener("enterFrame",myOEF);