IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Discussion :

[Best Practice] clips dupliqués avec des couleurs différentes


Sujet :

Flash

  1. #1
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut [Best Practice] clips dupliqués avec des couleurs différentes
    Bonjour à tous.

    j'ai un problème pour lequel j'ai déjà une solution, mais je la trouve trop peu industrialisée.

    Soit un clip, par exemple une étoile à 5 branches. Je génère 3 clips animés avec cette étoile :
    - l'étoile tourne sur elle même
    - l'étoile s'étire et revient à sa taille d'origine
    - l'étoile oscille de gauche à droite

    Maintenant dans ma scène principale j'aimerai placer des dizaines d'étoiles en alternant les mouvements (1 qui tourne, 1 qui s'étire, 1 qui oscille, 1 qui tourne, etc.) et surtout en changeant les couleurs pour chaque étoile.

    Et là se trouve mon problème : comment décider de la couleur à appliquer à mon étoile au moment de la placer, autrement qu'en préparant à l'avance 1 clip animé pour chaque couleur possible? Si je veux placer 256 couleurs avec 3 mouvements possibles ça me fait 768 clips à préparer à l'avance, ce qui me parait impensable.

    Je serais en java, je ferais un constructeur pour mon étoile, constructeur qui accepterait un code couleur et au moment de placer l'étoile je génèrerai l'instance en passant un code couleur. Mais, que je sache, en flash ce n'est pas possible.

    Donc j'aimerai savoir quelles sont les méthodes pour réussir cela, et surtout laquelle vous me conseillez pour minimiser le temps de développement et de maintenance (parce que je ne sais pas trop où je vais alors je suis tout le temps en train de re-modifier des trucs).

    Merci à tous.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Merci mais comme je le pensais, ce n'est pas de l'objet. Dans l'exemple donné l'étoile est faite à la volée et ce n'est pas une instance d'un objet à mon sens. Je pense que la vision objet n'existe pas dans Flash, par exemple on ne peut pas créer ses propres méthodes pour un objet.

    Ce qu'il me faudrait c'est pouvoir changer des propriétés de l'instance d'un clip depuis ma scène principale mais je ne sais pas si c'est possible.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut 100% POO !
    Je n'ai qu'un exemple en Haxe mais la syntaxe entre Actionscript 3.0 et Haxe est très proche.
    Code HX : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Graphics;
     
     
    /**
     * Star Object
     */
    class Star extends Sprite
    {
    	private var graph:Shape;
     
    	public function new()// En Actionscript, le nom du constructeur reprend le nom de sa class.
    	{
    		super();
    		this.graph = new Shape();
    		this.addChild(this.graph);
    	}
    	/// @link http://www.zoneflash.net/tutoriaux/t033.php
    	public function render(r1:Float, r2:Float, n:UInt, c1:UInt, c2:UInt)
    	{
    		var da : Float = Math.PI/n;
    		this.graph.graphics.clear();
    		this.graph.graphics.moveTo(r2, 0);
    		this.graph.graphics.lineStyle(0, c1, 100);
    		this.graph.graphics.beginFill(c2, 100);
     
    		var i : UInt = 1;
    		while( i<(2*n + 1) )
    		{
    			var a = da*i;
    			var r = (i % 2 == 0) ? r2 : r1;
    			var x = r*Math.cos(a);
    			var y = r*Math.sin(a);
    			this.graph.graphics.lineTo(x, y);
     
    			i++;
    		}
    		this.graph.graphics.endFill();
    	}
    }

    On peu ensuite utiliser la class Star ainsi :
    Code HX : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    /**
     * Class principal
     */
    class Main
    {
    	static function transition(evt:Event)
    	{
    		evt.target.rotation += 1;
    	}
    	// Piont d'entrée du programme
    	// ///////////////////////////////////////////////////////////////
    	static function main()
    	{
    		var root : Sprite = flash.Lib.current;// racine de notre liste d'affichage
     
    		var myStar : Star = new Star();
    		myStar.render(4, 50, 6, 0xFF00FF, 0xFFFF00);
    		myStar.x = 100;
    		myStar.y = 150;
    		root.addChild(myStar);
     
    		var mySecondStar : Star = new Star();
    		mySecondStar.render(4, 50, 6, 0x0000FF, 0xFF0000);
    		mySecondStar.x = 200;
    		mySecondStar.y = 150;
     
    		mySecondStar.addEventListener(Event.ENTER_FRAME, transition);
     
    		root.addChild(mySecondStar);
    	}
    }


    Je me souviens qu'en ActionScript 2 on pouvais utiliser la fonction registerClass() pour transtyper un object de ta librairie en class instanciable.

    Main.swf

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Ah ça ça m'intéresse. Je vais voir ce que je peux faire avec ça. Merci.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Salut.

    Alors j'ai résolu mon problème : comme je n'arrivais pas facilement à utiliser de l'objet dans flash, j'ai eu l'idée d'utiliser des masques : résultat je peux facilement et avec très peu de développement générer de nouveaux objets avec des couleurs différentes.

    Donc dans mon flash j'ai 3 clips animés : un carré rouge, un rond bleu et un triangle vert. Si demain je veux créer un carré jaune, il me suffit de dupliquer le carré rouge et de changer la couleur du fond, soit 1 opération même si j'ai de nombreuses transformations sur ma forme. Cela me convient pour le moment.

    j'espère à terme être capable de changer dynamiquement la couleur du fond au moment où je place l'occurrence sur ma scène principale.

    Ci-dessous le code que j'ai utilisé dans l'image 1 de ma scène principale. Il est à noter que j'ai 5 clips dans ma bibliothèque :
    - carre (non animé)
    - carre_anim_masque_rouge (animation + fond couleur rouge)
    - rond (non animé)
    - rond_anim_masque_bleu (animation + fond couleur bleu)
    - triangle (non animé)
    - triangle_masque_vert ( fond couleur vert)
    - triangle_anim_masque_vert (animation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    var clip_array = new Array();
     
    max_elements = 36;
     
     
    x_interval = 55;
    y_interval = 55;
     
    x_min = 0 + x_interval;
    x_max = 400 - x_interval;
     
    y_min = 0 + y_interval;
    y_max = 400 - y_interval;
     
    x_current = x_min;
    y_current = y_min;
     
    //trace("Init");
     
    for (i = 0 ; i < max_elements ; i += 1)
    {
    	var rnd = Math.floor(Math.random() * 3);
    	//trace(rnd);
    	if (rnd==0)
    	{
    		current_clip = "carre_anim_masque_rouge";
    		//current_clip = "carre_rouge_grossi";
    	}
    	else if (rnd==1)
    	{
    		current_clip = "rond_anim_masque_bleu";
    		//current_clip = "carre_rouge_grossi";
    	}
    	if (rnd==2)
    	{
    		current_clip = "triangle_anim_masque_vert";
    		//current_clip = "carre_rouge_grossi";
    	}
     
    	clip_array[i] = this.attachMovie(current_clip, current_clip+i, this.getNextHighestDepth() );
    	//trace("clip " + current_clip +i +" added ");
     
    	clip_array[i]._x = x_current;
    	clip_array[i]._y = y_current;
    	clip_array[i].gotoAndPlay(random(50));
     
    	x_current += x_interval;
    	if (x_current > x_max)
    	{
    		x_current = x_min;
    		y_current += y_interval;
    	}
    }
     
     
    listener = new Object();
     
    listener.onKeyDown = function() {
    if (Key.getAscii() >= 65 && Key.getAscii() <= 90) {
    	chosen_clip_index = Key.getAscii()-65;
    	if (chosen_clip_index < max_elements)
    	{
    		clip_array[chosen_clip_index].gotoAndPlay(51);
    		//trace("clip "+chosen_clip_index+" triggered");
    	}
     }
     else if (Key.getAscii() >= 97 && Key.getAscii() <= 122) {
    	chosen_clip_index = Key.getAscii()-97;
    	if (chosen_clip_index < max_elements)
    	{
    		clip_array[chosen_clip_index].gotoAndPlay(51);
    		trace("clip "+chosen_clip_index+" triggered");
    	}
     }
      else if (Key.getAscii() >= 48 && Key.getAscii() <= 57) {
    	chosen_clip_index = Key.getAscii()-22;
    	if (chosen_clip_index < max_elements)
    	{
    		clip_array[chosen_clip_index].gotoAndPlay(51);
    		trace("clip "+chosen_clip_index+" triggered");
    	}
     }
    };
     
     
    Key.addListener(listener);
     
    stop();
    le résultat est visible ici. Pour la petite histoire c'est un "jeu" pour ma fille de 13 mois qui s'intéresse fortement à l'ordinateur et tape déjà sur le clavier comme une furie. Vu qu'elle clic aussi comme une folle avec la souris, il faudra que je l'intègre plus tard.

    Merci de votre aide.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  6. #6
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut Trop cool
    Salut,

    Bravo

    Ton jeux m'éclate.

    Vivement la nouvelle version avec la souris =)

    T'shus

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/08/2013, 12h21
  2. bounding box avec des couleurs différentes
    Par mayssaMM dans le forum Images
    Réponses: 2
    Dernier message: 06/08/2013, 23h59
  3. Éléments d'une ListView avec des couleurs de background différentes
    Par caradhras dans le forum Composants graphiques
    Réponses: 6
    Dernier message: 31/01/2012, 15h40
  4. Réponses: 8
    Dernier message: 02/11/2007, 07h24
  5. Réponses: 2
    Dernier message: 07/06/2007, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo