Forums Développement Multimédia

Aller au contenu

Starling Sprite - Flash Sprite

CODE Actionscript

5 réponses à ce sujet

#1 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 05 November 2011 - 16:37 PM

Bonjour,

Je réalise une petite bannière muni du nouveau framework Starling. Cependant je dois intégrer certains éléments graphique contenus dans un SWF, ces éléments sont des Sprite (flash.display.Sprite).

Mais du coup, je ne peux pas les ajouter à la liste d'affichage de mon conteneur de type starling.display.Sprite.

Auriez vous une petite idée de comment faire ? Ou cela est-il impossible ( ce qui me parait louche )

Merci d'avance pour votre aide.

Morgan

public function getSprite(classe:uint):Sprite {
/*ClipData est une classe Wrapper qui contient des propriétés
comme une instance, le nom, la largeur des Sprite de mon SWF.
Sprite() est une tentative échouée de cast flash.display.Sprite vers starling.display.Sprite*/

spriteToReturn = Sprite((array[classe] as ClipData).instance);
resizer.resizeImage(spriteToReturn, 210, 210);
return spriteToReturn

Modifié par Galacta, 05 November 2011 - 16:39 PM.

Word hard, play hard.

#2 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 05 November 2011 - 18:21 PM

Salut,
J'ai à peine utilisé un peu Starling.
Je n'ai pas eu l'impression qu'on pouvait convertir un flash.display.Sprite en starling.display.Sprite
Ne peux-tu pas faire un draw() de tes sprites dans un BitmapData, puis afficher un starling.display.Image texturé d'après ce bitmap?

#3 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 November 2011 - 19:21 PM

Hello !

Citation

Ou cela est-il impossible ( ce qui me parait louche )

En fait, dés que tu utilise Stage3D pour afficher du contenu, il faut faire une croix sur la displayList (que ce soit dans Starling ou dans n'importe quel moteur basé sur Stage3D) tout simplement parce que le GPU ne dispose pas de displayList.
Tu peux toujours te servir de la displayList de Flash, mais les objets apparaîtront par dessus le Stage3D et ne bénéficieront pas de l'accélération materielle.

On ne peut pas lire une animation en bénéficiant de l'accélération matérielle parce que le GPU ne gère pas des objets comportant plusieurs frame comme les movieClip. En fait, pour faire simple, le GPU sait uniquement dessiner des triangles et mapper une texture dessus (mais il le fait super vite par contre). Cependant, on peut convertir une animation en une suite de frame converties en Texture qu'on envoit au GPU, et changer de texture à chaque frame.
Malheureusement , ce n'est pas si simple que ça car on ne peut pas charger une infinité de texture en RAM (on peut en charger +/- 80 , de 2048x2048 chacune) ; par ailleurs on ne peut charger que des texture dont la taille est un multiple d'une puissance de 2 (par exemple, si tu veux charger une image de 800x600 tu es obligé de créer une texture de 1024x1024 puis de fournir les repère de texture (UV) permettant de récuperer uniquement ton image sans les bords noir (les zones vides).
On a donc tendance à essayer de caser le maximum de frame sur la même texture pour perdre le moins de place possible, mais c'est encore un peu plus complexe à mettre en place.

Dans Starling, il y a , je crois, un truc qui s'appelle TextureAlias qui permet de fabriquer une animation à partir d'une suite d'image sans (trop) se prendre la tête.

Sinon la méthode donnée par lilive fonctionne aussi et est encore plus simple à mettre en place.

++

#4 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 06 November 2011 - 12:16 PM

Coucou,

Merci vous deux ! J'avais mal compris la subtilité que tu énonces Tlecoz. La méthode de Lilive me parait plus simple ( j'avoue ne pas y avoir pensé ), je vais essayer je posterai le résultat :).

Un tuto sur Starling serait-il envisagé ? Ou envisageable ? ( Thimbert Imbert en anglais n'est pas permis à tout le monde )
Word hard, play hard.

#5 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 06 November 2011 - 12:47 PM

Petit retour,

L'image est vraiment très très laide, et perd son arrière plan transparent ( indispensable :( ). J'ai du mal à voir la du coup :/
Word hard, play hard.

#6 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 06 November 2011 - 13:49 PM

Désolé triple post, je sais pas où j'ai la tête...

Oublié de passer la propriété transparent du BitmapData à true...

Bref voilà comment je procède maintenant :

public function getSprite(classe:uint):Image {
   var buffer : BitmapData = new BitmapData((array[classe] as ClipData).width, (array[classe] as ClipData).height,true,0x000000);
   var texture : Texture;
   buffer.draw((array[classe] as ClipData).instance, null, null, null,null,true);
   texture = Texture.fromBitmapData(buffer);
   spriteToReturn = new Image(texture);
   resizer.resizeImage(spriteToReturn, 200, 200);
   spriteToReturn.smoothing = TextureSmoothing.TRILINEAR;
   return spriteToReturn;
}

Merci beaucoup :)

Modifié par Galacta, 06 November 2011 - 13:50 PM.

Word hard, play hard.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)