Forums Développement Multimédia

Aller au contenu

Comment atteindre les propriétés d'un bitmap placé dans un sprite ?

CODE Actionscript

10 réponses à ce sujet

#1 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 07:09 AM

Bonjour à Tous,

J'ai découpé dans un fichier png un bitmap :

public function createBitmap(nameSprite:String, widthSprite:int, heightSprite:int, xSprite:int, ySprite:int ):Bitmap
  {
   var bitmapdataSprite:BitmapData = new BitmapData(widthSprite, heightSprite, true);
   bitmapdataSprite.copyPixels(_bitmapdataImage, new Rectangle(xSprite, ySprite, widthSprite, heightSprite), new Point(0, 0));
   var bitmapSprite:Bitmap = new Bitmap(bitmapdataSprite);
   bitmapSprite.name = nameSprite;
   return bitmapSprite;
  }
 
que j'insère ensuite dans un tableau :

_arrayBitmap.push(spriteObject.createBitmap(nameSprite, widthSprite, heightSprite, xSprite, ySprite));
 
Lorsque je trace le contenu de _arrayBitmap[0] et en ayant assigné à bitmapSprite.name la valeur apple.png par exemple, j'obtiens :
name (String) = apple.png

Souhaitant écouté lorsque l'utilisateur clique sur le bitmap et conformément à la documentation qui précise que
Note: The Bitmap class is not a subclass of the InteractiveObject class, so it cannot dispatch mouse events. However, you can use the addEventListener() method of the display object container that contains the Bitmap object.
j'ai crée un container :

_container = new Sprite();
_container.x = 60;
_container.y = 20;
addChild(_container);
_container.addEventListener(MouseEvent.CLICK, onClickContainer);
 
dans lequel j'ajoute mon bitmap

_container.addChild(_arrayBitmap[0]);
 

A des fins de débug, j'ai assigné la String 'container' à l'instance _container et lorsque je trace le clic sur l'objet Bitmap effectivement présent sur la scène, j'obtiens
container
et non pas apple.png que j'attendais.

Votre aide est comme à l'habitude précieuse.

#2 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 07:33 AM

J'ai oublié de préciser que j'écoute soit e.target.name ou e.currentTarget.name mais qu'en sortie, la réponse est la même.

#3 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 05 December 2012 - 09:28 AM

hello , je dis peu etre des betise car je commence en as3

mais est se que ca serai pas plutot addChildAt qu il faudrait utiliser ?

exemple

// on cree le conteneur
var cont1:Sprite = new Sprite();


// tracé d'un carré bleu
var carre:Shape = new Shape();
carre.graphics.beginFill(0x0000FF,.8);
carre.graphics.drawRect(170,170,60,60);

[color=#000000][font=verdana, geneva][size=2]// tracé d'un rond bleu plus clair[/size][/font][/color]
var rond:Shape = new Shape ();

rond.graphics.beginFill(0x7268CA, .8);
rond.graphics.drawCircle(200,200,50);


// placement du rond à l'index 0 du conteneur
cont1.addChildAt(rond,0);                                                                                        <---


// placement du carré à l'index 1 du conteneur
cont1.addChildAt(carre, 1);                                                                                <---

// on ajout le conteneur
addChild (cont1);

 

désoler si je me trompe (et que je suis a coter de la plaque)

++

#4 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 09:39 AM

Merci nocraft pour cette réponse rapide.
D'après ce que je sais, addChildAt permet de préciser l'emplacement de l'objet dans le container.
Le fait de rajouter plusieurs objets par des instructions addChild successives revient à augmenter de 1 leur index dans le container (explication imagée mais il n'y a que comme cela que je comprends).
Mais le fonds de ta réponse concerne bien mon intention qui consiste à accumuler plusieurs objets Bitmap dans le container Sprite et de pouvoir ensuite les sélectionner indépendamment les uns des autres par un MouseEvent.CLICK

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 09:47 AM

Bonjour William.

Citation

mon intention qui consiste à accumuler plusieurs objets Bitmap dans le container Sprite et de pouvoir ensuite les sélectionner indépendamment les uns des autres par un MouseEvent.CLICK

Ça, tu ne peut pas.
Comme tu l'as dit, le Bitmap est insensible aux actions de la souris.
Voilà pourquoi on place le bitmap dans un Sprite. Pour écouter le sprite.
Si tu mets plusieurs bitmap dans le même Sprite, tu ne pourras jamais savoir quel bitmap a été cliqué. Tu peux seulement savoir quel sprite à été cliqué.

Il te faut donc un niveau supplémentaire :
- un sprite pour chaque bitmap
- un sprite conteneur générique dans lequel tu affiches les autres sprites.
Tu poses ton écouteur sur le sprite générique
Et là, le target te donneras le Srite du bitmap cliqué. Le currentTarget te donneras le sprite générique.

#6 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 10:15 AM

Bonjour didler

J'y suis arrivé mais d'une manière un peu différente car j'ai besoin de récupérer la propriété name à laquelle j'ai donné une valeur arbitraire afin de pouvoir suivre le bitmap en question dans la suite de l'application.

for (var i:int = 0; i < _arrayBitmap.length; i++)
   {
        containerSprite = new Sprite();
        containerSprite.name = _arrayBitmap[i].name;
        containerSprite.addChild(_arrayBitmap[i]);
        containerSprite.x = i * 50;
        _container.addChild(containerSprite);
   }
 

Par contre, j'écoute e.target.name afin de récupérer la propriété.

Je ne sais pas cependant si ce que je fais est bien optimiser du coup.

Je devrais faire addChild(reflexionPersonnelleDeWilliam27wp) pour donner un peu plus de profondeur à mon imagination.
Merci en tout cas de vos réponses.
Elles prouvent tout l'intérêt de ce forum.

#7 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 05 December 2012 - 10:23 AM

pas de problème, et tu as bien raison un forum ou l'échange est la clef.

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 10:28 AM

C'est assez optimisé.
A part la gestion des objets via leur nom qui est une ------- ;-) Mais je pense que tu apprendra à t'en passer avec le temps

Juste un truc qui m'inquiète :

Voir le messageWilliam27wp, le 05 December 2012 - 10:15 AM, dit :

Par contre, j'écoute e.target.name afin de récupérer la propriété.

Tu n'écoutes pas e.target.name, Je pense que ce n'est qu'une question de vocabulaire, mais autant recadrer :
e.target.name est un String, tu ne peux pas poser un écouteur dessus (jamais essayé mais même si on pouvait, ça ne servirait à rien. Un string ne diffusera jamais d'événement)

Tu poses l'écouteur sur un Sprite (par exemple) en y associant une fonction.

La fonction, quand elle est appelée suite au déclenchement d'un événement, reçoit l'événement en paramètre.
Dans cette événement, la propriété target te permet de connaître le Sprite à l'origine de la diffusion.
Fin.

Comme tu as le SPrite, tu as accès a toutes ses propriétés à lui.
Donc le .name, entre autre…
Mais à aucun moment tu poses un écouteur sur le nom.

#9 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 10:47 AM

Je me suis mal exprimé, en effet :

private function onClickContainer(e:MouseEvent):void
  {
   MonsterDebugger.trace(this, e.target.name);
  }
 

En fait, je découpe une sprite sheet afin d'en extraire différents éléments dont je souhaite me servir. 36 de ces objets sont prévus et je n'ai pas voulu les lier séparément à ActionScript ou les embedded sous Flash Develop.
Donc je suis passé par une technique de blitting classique.
Donc j'obtiens des bitmaps.

Par la suite, j'ai besoin de suivre individuellement ces bitmaps car chacun d'entre eux à son importance dans l'application.
Et tout ce que j'ai trouvé pour les identifier, c'est de passer par la propriété name que j'affuble d'une valeur arbitraire unique.

Afin de nourrir ma réflexion, vers quelles autres pistes pourrais-je m'orienter ?

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 December 2012 - 11:06 AM

Une classe étendant Sprite, gérant son bitmap de façon transparente…BitmapPart pourrait être son nom, si j'ai un peu suivi ce que tu en fais.

Et si le nom ne te sers qu'a faire des traces, pas de souci. Une propriété info (ou name si tu y tiens) sur ta classe fera l'affaire. Quand tu voudras vérifier l'origine d'un BitmapPart, tu pourras tracer l'info.

Mais si le nom te sert à aller à la pêche pour récupérer l'objet, via des fonctions comme getChildByName, c'est là que j'y vois un souci. Surtout pour un jeu ou la rapidité d'exécution peut être cruciale.

En fait, j'ai un peu de mal a cerner ton niveau,je crois :) j'hésite entre des réponses de base et des trucs plus pointus.

#11 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 05 December 2012 - 11:37 AM

Niveau : autodidacte désespéré.
Je prends, je goûte comme je peux et comme pour le bon vin, je recrache.
Il en ressort un amalgame de connaissances disparates que j'essaie d'assembler en un tout cohérent.

En fait, j'ai déjà créé une classe qui s'occupe de me renvoyer un bitmap à partir des données que lui fournit ma classe Main() :

_arrayBitmap.push(spriteObject.createBitmap(nameSprite, widthSprite, heightSprite, xSprite, ySprite));
 
Je stocke les bitmaps générés dans un tableau pour éviter d'avoir 36 variables de classe. Et puis, le tableau me permettra des manipulations sur l'ordre des bitmaps qui doit être différent à chaque nouvelle partie.
Et c'est cette classe SpriteObject qui récupère la tile sheet dans son constructeur :

private var _bitmapdataImage:BitmapData;

  public function SpriteObject()
  {
   _bitmapdataImage = new TileSheet();
  }
 

Je dois préciser que les bitmaps en question ne doivent pas servir à une animation. J'ai besoin d'eux séparément (du moins dans cette application).

La toute première idée qui me vient dans la gestion des bitmaps est de faire un switch sur la propriété name récupérée de e.target.name dans le callback.
Je n'ai pas testé l'efficience de cette toute première idée dans la suite de l'application vu que j'en suis toujours au problème de cette inénarrable propriété name.



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP