2014-01-19 73 views
0

I found this question on Adobe's forums,但我不開心的回答有:繪圖小精靈大的位圖

我有一個精靈circSprite,我在一個大的位圖drawingBitmap借鑑。

drawingBitmapData = new BitmapData(800, 600, true,0); 
drawingBitmap = new Bitmap(drawingBitmapData); 
stage.addChild(drawingBitmap); 

var circSprite:Sprite = new Sprite(); 
circSprite.graphics.beginFill(0xFF0000,0); 
circSprite.graphics.drawRect(0,0,160,160); 
circSprite.graphics.endFill(); 
circSprite.graphics.beginFill(0xFF00FF,1); 
circSprite.graphics.drawCircle(40,40,40); 
circSprite.graphics.endFill(); 

var mat:Matrix = new Matrix(); 

drawingBitmapData.drawWithQuality(circSprite,mat,null,null, null,true,StageQuality.MEDIUM); 

我想將circSpirte移動到不同的位置(100,100) - 我該怎麼做?

謝謝!

回答

1

它看起來像你試圖使用阻擊器。如果是這樣的話,基本上有兩條路線可走。您可以使用位圖數據draw()(看起來像您使用的是drawWithQuality())或copyPixels()copyPixels()比使用draw()要快很多倍,如果您打算將物體移動很多,我建議您使用copyPixels()路線。這裏是我如何做到這一點:

你應該存儲一個BitmapData代表你的精靈,所以你只需要撥打draw()一次。

//create the BitmapData variable for your sprite somewhere in member access. 
private var spriteBmd:BitmapData = new BitmapData(circSprite.width, circSprite.height); 
//draw after the circSprite is created 
spriteBmd.draw(circSprite); 

//then wherever you are doing the movement to a new position 
drawingBitmapData.unlock(); 

//fill rect here can be replaced with a copyPixels of your background, but 
//this just redraws the background to "clear" the blitting, this can be 
//optimized with a technique known as "dirty rectangles" which I'll link a tutorial to 
drawingBitmapData.fillRect(stage.getBounds(stage), 0); 

//copy our sprite to a new destination point (see new Point(100, 100)) 
drawingBitmapData.copyPixels(spriteBmd, spriteBmd.rect, new Point(100, 100)); 

//done blitting, lock the bitmapdata 
drawingBitmapData.lock(); 

在以前的答案的另一種方法狀態看起來像這樣,但如果你是做了很多變革,這將是一個相當慢一點:

var mat:Matrix = new Matrix(); 
mat.translate(100, 100); 
drawingBitmapData.draw(circSprite, mat); 

下面是一個教程鏈接解釋說到「骯髒的矩形」(在我的評論中指出)的blitting:

AS3 Blitting Tutorial

1

您可以使用您所創建的對象上執行轉換矩陣,我建議你閱讀documentation on Matrix,但它是這樣的:

var mat:Matrix = new Matrix(); 
mat.translate(100,100);