Articles taggués ‘bitmapdata’

Coordonnées des points d’une sphère

1st novembre, 2009 par Floz

Vendredi, avec des potes de promo on s’est mis en tête de transformé un exercice de flash en l’occasion de se faire une petite battle expérimentale.
En gros, chacun de nous va faire une sorte de planète qui sera intégrée un swf final. Le but étant que lorsqu’on cliquera sur cette planète, des particules (ou autres) en sortiront pour se balader dans l’écran ou attaquer les autres.
Ça peut être bien funky, et puis c’est l’occasion de mettre les mains dans un taff un peu différent de ce que je fais en règle générale.

David (un des potes participant) m’avait fait rêver en me montrant ça, que je trouve bien chouettos, et j’ai eu l’occasion de fouiller dans wonderfl pour regarder ce qui s’y trouve. Ben c’est violent. :)
Je suis tombé sur cette sphère en 3D dont je me suis totalement inspiré.

Cet exercice aura été l’occasion pour moi de jouer avec l’api du flash player 10, notamment les Matrix3D, Utils3D et Vector3D; qui sont des supers outils. Il va falloir que je continue à regarder de ce côté !

Le premier résultat :

This movie requires Flash Player 9

Le plus chiant aura été de trouver les coordonnées des points sur une sphère. Sur un cercle, ok pas de souci, mais sur une sphère ça se complique.
Je suis arrivé sur cette page de wikipédia, qui parlait des coordonnées sphérique, le seul problème c’est que leurs formules ne sont pas appropriées au repère de flash, mais à un repère cartésien. (Le repère de flash a l’axe des z inversé).

Du coup j’ai continué de googleisé, parce que mon pauvre savoir trigonométrique s’arrête au plan, et je suis tombé sur cette page. Et là, jackpot; les sin/cos ne sont pas les même et fonctionnent parfaitement dans flash.
Résultat :
x = r * cos(phi) * cos(theta);
y = r * cos(phi) * sin(theta);
z = r * sin(phi);

theta” doit être compris entre 0 et 360° et “phi” entre 0 et 90°, et “r” correspond au rayon de la sphère.

J’ai un peu continué pour tenté de mettre un noyau comme centre de la sphère, mais ça bougera surement par la suite.

This movie requires Flash Player 9

Pour ceux qui seraient intéressés par les sources, elles sont téléchargeables ici.

A suivre !

Passer par des LinkedList pour gagner en performances

30th mai, 2009 par Floz

En ce moment, je passe pas mal de temps à feuilleter le wiki de Joa Ebert, afin de gagner en propreté de code et en performances. Dans son wiki, il y est question de LinkedList ainsi que de Pool.
En lisant l’exemple, je ne comprenais pas vraiment à quoi cela pouvait il servir (même si, sur le papier ça avait l’air cool), ni comment s’en servir…

Puis j’ai commencé à m’y intéressé plus sérieusement et à utiliser une LinkedList en partiel de Flash.
Il nous était demandé de faire un equalizer, et j’ai choisis de jouer avec du BitmapData et des modifications de pixels. En gros, une boucle plus ou moins grosse en enterFrame à manipuler.
Sachant que les LinkedList permettent de gagner en performances car :

Je me suis dis que c’était le moment d’essayer. Le résultat :

This movie requires Flash Player 9

Cliquez pour lancer l’anim. Recliquer pour la stopper. Sachant que le swf fait 1mo (il transporte le mp3 - Boards of Canada : Diving Station).
Bref, le rendu me plait bien, et c’est fluide. Même s’il n’y a que 256 pixels par secondes à 30FPS. Vous pouvez télécharger les sources en cliquant ici.

Bossant sur un projet en parallèle, je commencais à réfléchir en terme de réorganisation de code. Et c’est là que j’en suis revenu à ces histoires de Pool (j’en parlerai dans un autre post, je n’ai pas encore assez fouillé là dessus) et de LinkedList.
Du coup, je me suis dis que j’allais tenter de les utiliser au sein de mon effet de désintégration.

Résultat avec l’ancienne version :

This movie requires Flash Player 9

Résultat avec la nouvelle version :

This movie requires Flash Player 9

En fonction des pcs, les différences de résultat est plus ou moins flagrant.
Les performances sont gagnées sur le fait qu’on ne passe plus par des tableaux, et que la manipulation performante au final. Cool :)

Bon c’est bien tout ça, mais à quoi ça ressemble une LinkedList ? Je vous invite à regarder l’explication de Joa Ebert.
Puis, pour prendre mon equalizer comme exemple, ça donne :

En l’occurence, j’ai crée un objet Particle, qui correspond à des pixels de mon bitmapdata/equalizer :

package
{

public class Particle
{
public var px:Number = 0;
public var py:Number = 0;

public var next:Particle;
}

}

Une méthode d’instanciation de tous les objets de la LinkedList :

private function createParticles():void
{
// _particles sera la variable de référence de la LinkedList.
_particles = new Particle();

var currentParticle:Particle = _particles;
var numParticles:int = NUM_PARTICLES;

while ( --numParticles != 0 )
currentParticle = currentParticle.next = new Particle();
}

Un exemple d’itération au sein d’une LinkedList :

private function setParticlesPositions():void
{
// Comme je le disais précédemment : on crée une variable dans laquelle on stocke notre objet de référence de la LinkedList (notre point de départ, en quelque sorte).
var particle:Particle = _particles;

var px:Number = stage.stageWidth * .5;
var py:Number = stage.stageHeight * .5;

while ( particle )
{
particle.px = px;
particle.py = py;

// On passe à l'élément suivant; jusqu'à ce qu'il n'y en ait plus.
particle = particle.next;
}
}

Joa Ebert en parle aussi ici avec un superbe exemple. Il disait qu’il s’en servait aussi dans son moteur de tween qui était, grâce à tout ça, plus performant que les Tweenlite ou Tweener.

Effet de désintégration en AS3 via Bitmap et BitmapData

7th mai, 2009 par Floz

J’avais une petite idée de transition pendant le développement de mon portfolio floz.fr en as3. Cette idée m’était venu d’un travail de André Michelle, sur des effets d’explosion via des manipulations sur des objets BitmapData. Il utilise notamment les méthodes getPixel() et setPixel() de BitmapData au lieu de passer par des tweens et donc de sauver des performances.

En effet, dans mon effet de désintégration (pour le moment nommé “Rain” et “RainBack”), je manipule tous les pixels de l’image afin de les faire tomber. Une sorte de pluie de pixel :

This movie requires Flash Player 9

Sur des petites images, c’est fluide sans problème. Mais plus l’image sera grande, et plus les performances chuteront. Ainsi, l’effet est à utiliser avec plus ou moins de modération en fonction de l’image sur lequel on l’applique !

Les classes sont dispos sur le google code du package minuit4, et dans un .rar les contenant. Les classes sont fonctionnelles, mais sont encore sujettes à des modifications. Non pas dans leur fonctionnement en soit, mais plutôt dans l’instanciation. Je pense les réorienter vers un fonctionnement similaire à tweenlite. A suivre !

Un petit exemple d’utilisation :

import fr.minuit4.animation.rain.Rain;

var r:Rain = new Rain( new Icone( 0, 0 ) ); // Icone correspond à un DisplayObject dispo dans la bibliothèque de flash.

r.addEventListener( Event.COMPLETE, onComplete );

addChild( r );

r.start();

Et l’effet sur une image plus grosse, avec l’outil de contrôle des FPS du package minuit4 afin vérifier les performances de l’application. Cliquez sur la scène pour lancer l’effet.

This movie requires Flash Player 9

Grosse mise à jour au niveau des performances ici.