2010-09-07 21 views
0

par exemple:ActionScript 3 - Dessiner deux formes sur la même graphiques clip en évitant le mélange alpha entre les

var mc:MovieClip=new MovieClip(); 

mc.graphics.beginFill(0x000000,0.5); 
mc.graphics.drawRect(0,0,100,100); 
mc.graphics.endFill(); 

mc.graphics.beginFill(0x000000,0.5); 
mc.graphics.drawRect(0,0,100,100); 
mc.graphics.endFill(); 

avec ce que je vais obtenir une boîte avec une valeur alpha plus foncée que 0,5. Je veux un carré de 0,5 alpha sans utiliser quelque chose comme:

var mc:MovieClip=new MovieClip(); 

mc.graphics.beginFill(0x000000,1); 
mc.graphics.drawRect(0,0,100,100); 
mc.graphics.endFill(); 

mc.graphics.beginFill(0x000000,1); 
mc.graphics.drawRect(0,0,100,100); 
mc.graphics.endFill(); 

var bmp:BitmapData=new BitmapData(100,100); 
bmp.draw(mc); 
var mc2:MovieClip=new MovieClip(); 
mc2.graphics.beginBitmapFill(bmp); 
mc2.graphics.drawRect(0,0,100,100); 
mc2.graphics.endFill(); 

obvoiusly je ne voulez pour les carrés de dessin, ESt pour un algorithme d'ombre coulée sur je travaille.

Répondre

1

En fonction de ce que vous faites, vous pouvez simplement dessiner tout comme alpha 1, définissez l'alpha de l'objet lui-même à 0,5, puis utiliser un mode de fusion LAYER qui aplatit la transparence avant l'application de l'alpha.

var mc:MovieClip = new MovieClip(); 
addChild(mc); 

var sp:Shape; 

sp = new Shape(); 
sp.graphics.beginFill(0x000000,1); 
sp.graphics.drawRect(0,0,100,100); 
sp.graphics.endFill(); 
mc.addChild(sp); 

sp = new Shape(); 
sp.graphics.beginFill(0x000000,1); 
sp.graphics.drawRect(50,50,100,100); 
sp.graphics.endFill(); 
mc.addChild(sp); 

mc.alpha = 0.5; 
mc.blendMode = BlendMode.LAYER; 

C'est un peu compliqué, mais vous avez l'idée. Cependant, l'utilisation d'un bitmap serait la meilleure pour les performances. Encore une fois, cela dépend exactement de ce que vous devez mettre en œuvre et comment.

En outre, en fonction de ce que vous avez à dessiner, si vous pouvez compter sur drawPath() à la place, vous pouvez simplement l'utiliser avec l'ensemble d'enroulement à GraphicsPathWinding.NON_ZERO.

+0

Wow !, oui, c'est ce que je cherchais, mais est assez lent, 6 fps par rapport aux 35 fps de bitmapdata D: –

+0

paramètre cacheAsBitmap sur le parent les amènera probablement à la performance, sauf si vous faites tourner et mettre à l'échelle beaucoup – grapefrukt

0

Au lieu d'utiliser alpha, vous pouvez utiliser ColorTransform. Avec TweenMax, c'est assez facile mais bien sûr vous pouvez coder votre propre solution.

 
var mc:MovieClip=new MovieClip(); 
mc.graphics.beginFill(0xffffff); mc.graphics.drawRect(0,0,100,100); mc.graphics.endFill(); 
TweenMax.to(mc , 0 , {colorTransform:{tint:0x000000 , tintAmount:.5}}); 

mc.graphics.beginFill(0xffffff); mc.graphics.drawRect(0,0,100,100); mc.graphics.endFill(); 
TweenMax.to(mc , 0 , {colorTransform:{tint:0x000000 , tintAmount:.5}}); 
+0

Salut, l'application d'un colorTransform n'a pas fonctionné. mc.transform.colorTransform = new ColorTransform (1,1,1, 0,5); produit le même résultat qu'avant ... peut-être il n'y a aucun moyen de changer la façon dont flash gère Alpha –

+0

Faire comme c'est la même chose que de définir la propriété alpha à 0,5, c'est pourquoi j'ai utilisé TweenMax (greensock.com) comme un raccourci pour changer la quantité de couleur. – PatrickS

+0

mmh oui, vous avez raison :) ... mais j'ai réalisé que le rendu de l'image entière sur un bitmap, puis modifier l'alpha avec copypixels et un alphabitmap est plus rapide que le rendu lui-même sprite (mon application fonctionne au zoom 2x en utilisant un 375x275 toile) –