2011-06-29 3 views
3

J'ai un composant qui contient 4 couches: (dans l'ordre croissant de profondeur) bgImage: Sprite, dropZone: Sprite, dropMask: Sprite et ligne: Sprite. Le bgImage est à 0,0, et les autres objets sont placés à diverses coordonnées positives. dropMask est en train de masquer dropZone.BitmapData.draw clipRect ne fonctionne pas comme prévu

Au point de capture bitmap Je veux dessiner seulement des couches Dropzone et dropMask, donc je suis en train ceci:

removeChild(bgImage); 
removeChild(line); 
var bmd:BitmapData = new BitmapData(dropMask.width,dropMask.height,true,0); 
bmd.draw(this,null,null,null,dropMask.getBounds(this)); 

Malgré l'dropMask étant situé à 50,60 la capture commence toujours à partir 0,0 J'ai aussi essayé d'obtenir le rectangle de frontière et de forcer le x, y, mais cela ne fait aucune différence. Qu'est-ce que je fais de mal ici, et devrais-je oublier clipRect et utiliser une matrice à la place?

Répondre

6

Une routine commune pour que:

var rect:Rectangle = dropMask.getRect(dropMask.parent); 
var matrix:Matrix = new Matrix(); 
matrix.translate(-rect.x, -rect.y); 
var bmp:BitmapData = new BitmapData(rect.width, rect.height, false, 0xFFFF0000); 
bmp.draw(dropMask.parent, matrix); 

étapes Solution:

  1. obtenir un rectangle dans l'espace de coordonnées de ce que vous allez dessiner.
  2. obtenir la matrice d'identité, et traduisez par -rectangle.x, -rectangle.y
  3. utiliser cette matrice dans draw() appel.

À l'étape 1, vous pouvez même rencontrer quelque chose comme ça:

import flash.display.Sprite; 

var test:Sprite = new Sprite(); 
test.graphics.beginFill(0, 1); 
test.graphics.drawCircle(125, 234, 100); 
test.graphics.endFill(); 

// we are going to draw test, so we get a rectangle 
// in its own coordinate space to deal with registration point offset 
var rect:Rectangle = test.getRect(test); 
var matrix:Matrix = new Matrix(); 
matrix.translate(-rect.x, -rect.y); 
var bmp:BitmapData = new BitmapData(rect.width, rect.height, false, 0xFFFF0000); 
bmp.draw(test, matrix); 

// see if we are done 
addChild(new Bitmap(bmp)); 

Lorsque je code quelque chose qui utilise beaucoup de clips dessin, je crée une matrice et le réutiliser à chaque fois, faire matrix.identity(); pour réinitialiser se transforme. Pas besoin de créer une nouvelle matrice pour chaque dessin.

EDIT Et non, clipRect ne aide pas ici. Vous l'utilisez uniquement lorsque vous voulez dessiner partiellement, pas tout le clip.

+0

Oui, c'est ce que j'ai fini par faire, et ensuite aller plus loin pour faire de la matrice une mise à l'échelle et un positionnement en même temps. – shanethehat

Questions connexes