+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2008
    Messages : 56
    Points : 16
    Points
    16

    Par défaut Sprite (graphics) to BitmapData pour detection de collision

    Bonjour, j'ai besoin de convertir un SpriteVisualElement en bitmapdata pour pouvoir faire un hitTest par la suite. Car si je fais un hittest directement sur l'objet sprite, la collision ne réagit pas en fonction de la forme réelle mais en fonction du rectangle englobant. (Détection de collision au niveau des pixels)

    après une multitude d'essais je me retrouve avec ça :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		override public function getBitmap():BitmapData{
    			var bounds:Rectangle = sprite.getBounds(gardenEditor.plan);
    			if(bounds.width && bounds.height){
    				sprite.width = bounds.width;
    				sprite.height = bounds.height;
    				var bmp:BitmapData = new BitmapData(bounds.width,bounds.height,true,0x00000000);
    				bmp.draw(sprite,new Matrix());
    				return bmp;
    			}
    			return null;
    		}
    j'étais obligé de faire un "getBounds" car (je ne sais pas si c'est normal) j'ai le sprite.width et sprite.height à 0 dans tous les cas, et le constructeur BitmapData n'accepte pas ça.

    Voila une des sources dont je me suis inspiré : http://stackoverflow.com/questions/1...ics-into-bytes

    je precise quand même que mon sprite apparait parfaitement bien, j'obtiens juste une image vide quand j'essai de la convertir en BitmapData.

    merci.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2008
    Messages : 56
    Points : 16
    Points
    16

    Par défaut

    J'ai un début de solution je crois, mais c'est pas encore gagné.
    J'ai fais une petite appli pour tester avec le strict minimum :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    			   xmlns:s="library://ns.adobe.com/flex/spark" 
    			   xmlns:mx="library://ns.adobe.com/flex/mx" 
    			   minWidth="955" minHeight="600"
    			   creationComplete="application1_creationCompleteHandler(event)">
    	<fx:Script>
    		<![CDATA[
    			import mx.events.FlexEvent;
     
    			protected function application1_creationCompleteHandler(event:FlexEvent):void
    			{
    				sprite.graphics.lineStyle(2, 0x000000,1,false,LineScaleMode.NONE);
    				sprite.graphics.beginFill(0xff0033,0.5);
    				sprite.graphics.drawCircle(45,45,20);
    				var bounds:Rectangle = sprite.getBounds(this);
    				sprite.width = bounds.width;
    				sprite.height = bounds.height;
    				label.text = sprite.width+" x "+sprite.height;
     
    				var bmp:BitmapData = new BitmapData(sprite.width,sprite.height,true,0x00000000);
    				bmp.draw(sprite,new Matrix());
    				img.source = bmp;
    			}
     
    		]]>
    	</fx:Script>
    	<fx:Declarations>
    		<!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). -->
    	</fx:Declarations>
    	<s:layout>
    		<s:VerticalLayout/>
    	</s:layout>
    	<s:SpriteVisualElement id="sprite">
    	</s:SpriteVisualElement>
    	<s:Image id="img"/>
    	<s:Label id="label"/>
    </s:Application>
    et j'obtiens ça :



    Donc si je voyais pas l'image c'était parce qu'elle était pas cadré, mais pourquoi les dimensions du sprite ne se mettent pas à jour?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2008
    Messages : 56
    Points : 16
    Points
    16

    Par défaut

    Bon... problème à peu près résolu :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    override public function getBitmap():BitmapData{
    			var bounds:Rectangle = sprite.getBounds(this);
    			if(bounds.width && bounds.height){
    				var bmp:BitmapData = new BitmapData(bounds.x+bounds.width,bounds.y+bounds.height,true,0x00000000);
    				bmp.draw(sprite,new Matrix());
    				return bmp;
    			}
    			return null;
    		}
    c'est pas optimal car si la shape est dessinée à x:1000, y:1000 on se retrouve avec un bitmap de 1040*1040 pour une shape de 40*40 :S
    mais bon... ça ira pour l'instant

    PS: petit tuto très interressant concernant les bitmapData, Sprite & hitTest

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •