ink-blog | Le blog d'un développeur ActionScript 3

Avec ce temps rien de tel que de s’allonger dans l’herbe…

Salut tout le monde, bon ok pour l’instant je suis seul sur ce blog mais bon avec un peu de bol ça va peut-être changer !! :D

Pour commencer en douceur un tout petit post concernant 2 classes pour générer de l’herbe en Actionscript, la première pour le brin d’herbe et la seconde pour la pelouse…

Là, j’utilise les tweens d’adobe pour faire simple et que tout le monde puisse utiliser le code dès le début ; donc ce n’est pas vraiment super optimisé.

Voici le code de la classe Grace :

  1. package com.inkProd.display.lawn {
  2.     import com.inkProd.transitions.Tween;
  3.     import fl.transitions.easing.Regular;
  4.     import fl.transitions.TweenEvent;
  5.     import flash.display.GradientType;
  6.     import flash.display.Sprite;
  7.     import flash.geom.Matrix;
  8.     /**
  9.      * …
  10.      * @author la pieuvre (Guillaume Le Souchu)
  11.      */
  12.     public class Grace extends Sprite{
  13.  
  14.         protected var _sizeMin:Number;
  15.         protected var _sizeMax:Number;
  16.         protected var  _rotation:Number = 20+Math.random() * 10
  17.  
  18.         protected var _tw:Tween;
  19.         protected var _twTps:Number = .8;
  20.         protected var _twFunc:Function = Regular.easeInOut;
  21.         protected var _twBegin:Number = _rotation;
  22.         protected var _twEnd:Number =  _rotation + Math.random()*10;
  23.  
  24.         public function Grace(pSizeMin:Number, pSizeMax:Number) {
  25.             _sizeMin = pSizeMin;
  26.             _sizeMax = pSizeMax;
  27.             _draw();
  28.             this.rotation = _rotation
  29.             _initTw();
  30.             //this.cacheAsBitmap = true;
  31.         }
  32.  
  33.         public function vent(value:Boolean = true):void {
  34.             if (value) {
  35.                 _tw.continueTo(_twEnd, _twTps+Math.random()*.4);
  36.             }else {
  37.                 _tw.stop();
  38.             }
  39.         }
  40.         protected function _draw():void {
  41.             var r1:Number = Math.random() * (_sizeMax – _sizeMin)
  42.             var r2x = Math.random()*4
  43.             var r2y = Math.random()*10
  44.             var m:Matrix = new Matrix()
  45.             m.createGradientBox( 12, _sizeMin+r1, -Math.PI/2, 0, -_sizeMin)
  46.             graphics.beginGradientFill(GradientType.LINEAR, [0x0a4f01, 0x35771d], [1, 1], [100, 255], m);
  47.             graphics.curveTo(-8+r2x, -(14-r2y), Math.random()*12, -(_sizeMin+r1));
  48.             graphics.curveTo(-3+r2x, -(18-r2y), 4, 0);
  49.             graphics.endFill();
  50.         }
  51.         protected function _initTw():void {
  52.             _tw = new Tween(this, "rotation", _twFunc, _twBegin, _twEnd, _twTps, true);
  53.             _tw.stop();
  54.             _tw.addEventListener(TweenEvent.MOTION_FINISH, _continue);
  55.         }
  56.         protected function _continue(e:TweenEvent):void {
  57.             if (rotation == _rotation) {
  58.                 _tw.continueTo(_twEnd, _twTps+Math.random()*.4);
  59.             }else {
  60.                 _tw.continueTo(_twBegin, _twTps+Math.random()*.4);
  61.             }
  62.         }
  63.     }
  64. }

Le code de la classe Lawn :

  1. package com.inkProd.display.lawn {
  2.     import flash.display.Sprite;
  3.     /**
  4.      * …
  5.      * @author la pieuvre (Guillaume Le Souchu)
  6.      */
  7.     public class Lawn extends Sprite{
  8.  
  9.         protected var _width:Number;
  10.         protected var _sizeMin:Number
  11.         protected var _sizeMax:Number
  12.         protected var _dencity:Number;
  13.  
  14.         public function Lawn(pWidth:Number, pSizeMin:Number, pSizeMax:Number, pDencity:Number = 1/2) {
  15.             _width = pWidth;
  16.             _sizeMin = pSizeMin;
  17.             _sizeMax = pSizeMax;
  18.             _dencity = pDencity;
  19.             _add();
  20.             }
  21.             protected function _add():void {
  22.             var g:Grace
  23.             var finBoucle:Number = _width * _dencity;
  24.             for (var i:int = 0; i < finBoucle; i++) {
  25.                 g = new Grace(_sizeMin, _sizeMax);
  26.                 g.x = Math.random () * _width;
  27.                 addChild(g);
  28.                 if (i%0 != 0) {
  29.                     g.vent();
  30.                 }
  31.             }
  32.         }
  33.     }
  34. }

Pour finir le code de la classe Main :

  1. package classes {
  2.     import com.inkProd.display.lawn.Lawn;
  3.     import flash.display.Sprite;
  4.     /**
  5.     * …
  6.     * @author la pieuvre (Guillaume Le Souchu) / lesouchu@gmail.com
  7.     */
  8.     [SWF (width = "900", height = "300", frameRate = "50", backgroundColor = "0xA5A5A5", pageTitle = "Guillaume Le Souchu Développeur ActionScript 3")]
  9.     public class Main extends Sprite{
  10.  
  11.         protected var _lawn:Lawn
  12.  
  13.         public function Main() {
  14.             _initLawn();
  15.         }
  16.  
  17.         protected function _initLawn():void {
  18.             _lawn = new Lawn(stage.stageWidth+30, 30, 100);
  19.             _lawn.x = (stage.stageWidth – _lawn.width) * .5;
  20.             _lawn.y = stage.stageHeight;
  21.             _lawn.filters = [new DropShadowFilter(6, 45, 0, .7,5, 5, .7, BitmapFilterQuality.HIGH)]
  22.             addChild(_lawn);
  23.         }
  24.     }
  25. }

Sources herbes (zip / flash cs5)

There are 2 Comments to "Avec ce temps rien de tel que de s’allonger dans l’herbe…"

  • tlecoz dit :

    Hello !

    Il n’y a pas très longtemps, j’ai eu besoin de créer le même genre d’animation. Je m’y suis pris a peu comme toi, sauf que j’utilise une seul Shape pour tout mes brin d’herbes, ce qui allège énormément le calcul de rendu.

    Essaye de faire la même chose en utilisant des objet non graphique pour représenter les brins d’herbes, et un seul objet graphique pour représenter le tout.
    Pour la vitesse d’oscillation des brins, plutot que d’utiliser tweener (qui me parait lourd a utiliser, mais c’est une question de point de vue) tu pourrais te contenter de la variation d’un cosinus en utilisant avec des limites d’oscillations et une vitesse différente pour chaque brin)

    Sinon, je suis content de voir ton blog, je vais aller voir tes articles sur les courbes de bézier

    A+

    • la pieuvre dit :

      Hello, hello !!

      Effectivement c’est une bonne idée… Mais je t’avoue que je n’ai pas chercher à faire quelque chose de spécialement optimisé (my bad). c’était plus dans l’idée d’une classe basique, où l’on peut avoir un brin d’herbe tout seul (bien que tout seul il ne serve pas à grand chose :)) ou une pelouse complète…

      La prochaine version sera optimisée ;)

Write a Comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.

 

Essentials