2011-07-06 2 views
1

J'ai eu un gros problème en essayant de colorier des objets qui volent dans mon espace. Lorsque je tire et que je les frappe, les ennemis affectés doivent cligner des yeux. Les graphiques sont pré-rendus (c'est-à-dire qu'il y a un tableau de rotation et une fonction où les degrés et leur rotation appropriée pour les objets sont stockés/calculés pour de meilleures performances). Donc, mon idée était d'améliorer cette fonction de rotation avec une fonctionnalité pour la coloration supplémentaire; mais les objets colorés ET pivotés doivent être rangés séparément des objets tournés normalement. Pour accomplir ceci j'ai fait un tableau imbriqué: dans la rangée un il y a 360 graphiques tournés d'un objet et dans la rangée deux il y a 360 graphiques d'un objet tourné et coloré. Problème: La coloration fonctionne mais elle n'est pas pivotée (toujours à 0 degré). S'il vous plaît aidez-moi - je devais comprendre pendant des heures pourquoi cela ne fonctionne pas alors j'ai abandonné. Ce serait tellement cool si quelqu'un pouvait trouver le problème! Merci beaucoup!colorier avec colormatrix dans AS3 - aidez s'il vous plaît!

public function createRotationWithColorBlitArrayFromBD(sourceBitmapData:BitmapData, inc:int, offset:int = 0):Array 
{ 
    trace("sourceBitmapData.width=" + sourceBitmapData.width); 
    trace("sourceBitmapData.height=" + sourceBitmapData.height); 
    tileList = []; 
    tileListSec = []; 
    levelArray = []; 
    var rotation:int = offset; 

    while (rotation < (360 + offset)) 
    { 
     var angleInRadians:Number = Math.PI * 2 * (rotation/360); 
     var rotationMatrix:Matrix = new Matrix(); 

     rotationMatrix.translate(-sourceBitmapData.width * .5, -sourceBitmapData.height * .5); 
     rotationMatrix.rotate(angleInRadians); 
     rotationMatrix.translate(sourceBitmapData.width * .5, sourceBitmapData.height * .5); 

     var matrixImage:BitmapData = new BitmapData(sourceBitmapData.width, sourceBitmapData.height, true, 0x00000000); 

     matrixImage.draw(sourceBitmapData, rotationMatrix); 
     tileList.push(matrixImage.clone()); 

     var colorMatrix:ColorMatrixFilter = new ColorMatrixFilter (
           [1, 0, 0, 0, 0, 
           0, 0, 0, 0, 0, 
           0, 0, 0, 0, 0, 
           0, 0, 0, 1, 0]); 

     matrixImage.applyFilter(sourceBitmapData, sourceBitmapData.rect, point0, colorMatrix); 

     tileListSec.push(matrixImage.clone()); 

     rotation += inc; 

     matrixImage.dispose(); 
     matrixImage = null; 
     rotationMatrix = null; 
    } 

    levelArray = [tileList, tileListSec]; 
    return(levelArray); 
} 

Répondre

1

Il semble que vous appliquez le filtre à l'image source, lorsque vous voulez être appliquer le filtre à une version de l'image pivotée source.

Si vous regardez attentivement la documentation pour BitmapData, l'application fonction de filtre effectue les opérations suivantes:

Prend une image source et un objet filtre et génère l'image filtrée.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

Votre application appel filtre est en train d'écrire sur la transformation de la matrice que vous faites dans votre fonction draw() avec une nouvelle copie de l'image non pivotée source. Le applyFilter() est comme draw, sauf qu'il applique un filtre à la place d'une matrice transformationnelle. Dans ce cas, vous appliquez une matrice transformationnelle à matrixImage.draw() (pour effectuer une rotation), puis en écrivant sur ces données avec votre matrixImage.applyFilter() (en couleur).

SOLUTION Une solution rapide serait de faire le changement suivant:

matrixImage.applyFilter(matrixImage, matrixImage.rect, point0, colorMatrix); 

Cela a matrixImage appliquer le filtre couleur à lui-même, après elle devient l'image pivotée. BTW: Dans ce cas, je ne pense pas que vous ayez besoin de deux clones() de l'objet matrixImage. Juste l'objet final résultant de applyFilter() devrait suffire puisqu'il est la source et le filtre tout en un. Mais vous pouvez en avoir besoin pour une autre logique de jeu que vous n'avez pas publiée.

REMARQUE: Le seul problème avec cette solution est le point d'inflexion de la performance suivante: (à partir de documents Adobe pour BitmapData.applyFilter())

Si l'objet BitmapData et l'objet spécifié comme paramètre sourceBitmapData sont les mêmes objet, l'application utilise une copie temporaire de l'objet pour effectuer le filtre. Pour de meilleures performances, évitez cette situation.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

instanciation ces copies temporaires beaucoup de ressources si juste instatiating un objet tampon et réutilisant c'est beaucoup plus rapide. Si vous rencontrez des problèmes de performances, il est préférable de créer un troisième objet BitmapData pour agir en tant que tampon entre la source et le filtre. Dans ce cas, vous auriez 3 objets bitmapData au lieu de seulement sourceBitmapData et matrixImage.

+0

Merci beaucoup! Vous m'avez beaucoup aidé avec cette réponse et m'a facilité la vie! Merci beaucoup l'homme! :) – drpelz

+0

Salut! Heureux d'aider :) Veuillez marquer ma réponse comme «accepté» pour améliorer votre note d'utilisateur autour du site. –

+0

Merci pour le conseil. Je l'ai fait.:) – drpelz

Questions connexes