documentation表示BitmapData.draw方法的clipRect参数设置了源的剪辑。读到这个我为我的潜在Flash游戏写了一个AnimatedObject类。此类从.png动画条绘制一个帧,但不适用于Flash场景层次结构。
var frame : Number;
public function onDraw(backBuffer : BitmapData) : void
{
var frameClipRect : Rectangle = new Rectangle(int(frame) * celWidth, 0, frameWidth, frameHeight); // set a clip rect to pick a particular frame
var matrix : Matrix = new Matrix();
matrix.translate(-frameWidth / 2, -frameHeight / 2);
if ( scale )
matrix.scale(scale, scale);
if ( angle )
matrix.rotate(Math.PI * angle / 180.0);
matrix.translate(frameWidth / 2, frameHeight / 2);
matrix.translate(x, y);
backBuffer.draw(bitmap, matrix, null, null, frameClipRect, true);
}
我预计这会起作用,但剪裁存在问题。这段代码实际上没什么。我玩了一下,发现 clipRect实际上设置了目标位图的剪裁,而不是源。这很奇怪,与文档不匹配。
你怎么看? BitmapData.draw方法的clipRect参数是否真的剪切了源?我的代码有问题吗?谢谢!
注意:如果你只是省略了frameClipRect参数,那么你精灵正确转换但显示每一帧。
答案 0 :(得分:1)
我和你有同样的问题。在遇到你的帖子。我试过你说的话。处理剪切实际上是剪切目标而不是源。我的程序立即按预期工作。所以是的,在某种程度上,它看起来似乎是剪切目标而不是源。
答案 1 :(得分:0)
我从来没有与draw()及其剪辑rect有任何故障。顺便说一下,如果做得好,它会给你带来重要的性能提升。 Flash光栅化器只会绘制clipRect的部分。
关于你的代码:我实际上会尝试使用和不使用矩阵。这可能是问题所在。你翻译和剪辑。基本上裁剪应该在翻译之前进行,但我不太确定那个。
答案 2 :(得分:0)
我同意文档似乎令人困惑,因为draw()调用的所有其他参数都适用于目标而不是源。
要真正剪辑来源,你可以这样做
backBuffer.copyPixels(bitmap.bitmapData, sourceRect, destPoint)
答案 3 :(得分:0)
我只是通过添加更高级别的显示容器来解决类似的问题。您需要将源的左上角转换为更高级别显示容器的原点(0,0)(在本例中为wtf),然后将其绘制为BitmapData:
public function BitmapMC(movieClip:MovieClip)
{
curFrameBitmap = new Bitmap();
var singleBmd:BitmapData;
container.addChild(movieClip);
totalFrame = movieClip.totalFrames;
var wtf:Sprite = new Sprite();
for (var i:int = 0; i < totalFrame; i++)
{
movieClip.gotoAndStop(i);
singleBmd = new BitmapData(container.width, container.height,true, 0xFFFF0000);
var rect:Rectangle = movieClip.getBounds(container);
wtf.addChild(container);
container.x = - rect.x;
container.y = - rect.y;
singleBmd.draw(wtf);
bmdArray.push(singleBmd);
}
singleBmd = null;
}