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

Langage Delphi Discussion :

Comment coder un effet de neige ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut Comment coder un effet de neige ?
    bonjour,

    C'est bientôt noël et je voudrai coder un effet de neige

    En faite, la où je bloque, c'est sur le déplacement non linéaire d'objet (point ou bitmap par exemple)

    Voilà un test simple avec 3 flocons : (image1, image2, image3 sont mes flocons)

    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
     
    procedure TForm1.Timer1Timer(Sender: TObject); // ici 33 ms, la vitesse à laquelle les flocons descendent...
    begin
    image1.Top := image1.Top +1;
    image2.Top := image2.Top +1;
    image3.Top := image3.Top +1;
     
    //ça c'est pour les replacer une fois descendu, enfin c'est pas trop le sujet :P 
    if image1.top = 200 then
    begin
    image1.top := 1;
    image1.left := (random(200));
    end;
    if image2.top = 200 then
    begin
    image2.top := 1;
    image2.left := (random(200));
    end;
    if image3.top = 200 then
    begin
    image3.top := 1;
    image3.left := (random(200));
    end;
    end;
    Ce que je voudrai améliorer, c'est que mes flocon ne tombent pas verticalement,
    mais un peu en biais, comme si il y avait du vent
    Et je bloque dessus.... avez vous des idées, aglo différents, suggestion...?

    Maintenant si mon effet comporte 200 flocons, je me suis dis qu'il serai bien de changer de méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //cette fois j'ai 1 image de flocon en resource, que je vais réutiliser 200 fois =)
    flocon := TBitMap.Create; // créer une variable flocon de type image
    flocon.LoadFromResourceName(HInstance,'FLOCON'); 
     
    procedure TForm1.Timer1Timer(Sender: TObject); // toute les 100 ms 1 flocon est dessiné
    begin
    Canvas.Draw(random(300)+1,random(20)+1,flocon);
    Voilà ca marche, mes flocons sont créés toute les 100 ms entre X = 300 et Y = 20...
    Maintenant comment faire pour faire bouger tout ce beau monde?
    juste qu'ils descendent verticalement pour commencer, j'arrive pas à les faire bouger

    Merci d'avance.

    inspiration :
    effet neige :
    http://sidchip.ath.cx/~maktone/installers/CLS-2001_12_11.zip
    effet delpacement non linéaire :
    http://sidchip.ath.cx/~maktone/installers/CLS-2001_08_28.zip

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Moi j'utiliserais une vielle formule toute bete :

    Je suppose que les flocons parcourent tous la meme distance a chaques iterations (D comme "diagonale").
    Je suppose que le vent a une certaine puissance qui deplace les flocons de X Pixels vers la droite.
    Reste plus qu'a calculer le nombre de pixels vers le bas :
    D² = X²+Y² => Y = Sqrt(D²-X²).

    Apres on peux tirer au sort une valeurs entre A et B qui correspond a la variation de vent (positif ou negative) pour changer la "puissance du vent" donc la distance en pixels horizontale parcouru par les flocons.

    Ceci n'est qu'une idee a approfondir.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    si cet effet te plait :

    http://membres.lycos.fr/mrpink/noel/neige.html

    je t'envoie le source Java ce soir

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Si l'on considére qu'il y a du vent la neige vas effectivement tomber en biais.
    Soit sur une courbe Y := AX + B.

    Cependant le neige ne forme pas une droite parfaite en tombant donc ajouter un facteur alléatoire (random(n)) au x calculée.

    Je pense donc qu'il vous faudrai mélanger une trajectoire, ajouter le facteur x alléatoire en fonction de la trajectoire (plus le vent est fort, plus le facteur alléatoire sera en faveur du sense du vent. Le flocon ayant enormement de mal à remonter au vent. Ce n'est pas un voilier.)


    Attention avec le random(n). Il ne faut pas oubliez de fair un randomize dans l'application.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    J'aurais pensé à une droite affine sur laquelle tu peux greffer une sinusoïde (éventuellement modulée par un random pour l'amplitude) afin d'obtenir le déplacement X. Ansi, le flocon volette au vent, parfois beaucoup, parfois moins grâce à la sinusoïde, le facteur aléatoire rendant ça moins régulier.
    Pour le déplacement Y, introduire aussi un facteur retardant/accélérant (random aussi), car parfois le flocon peut "s'arrêter" dans sa chute, quand il est porté par l'air, et parfois "chuter" brutalement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    si cet effet te plait :
    http://membres.lycos.fr/mrpink/noel/neige.html
    Ca me plais

    Si l'on considére qu'il y a du vent la neige vas effectivement tomber en biais.
    Soit sur une courbe Y := AX + B.
    C'est la méthode qui me semble la plus simple.
    Par contre, je n'ai aucunce idée de comment coder ça pour faire bouger mes flocons?

    Merci pour vos réponses.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    Bon je viens de trouver un truc très bourrin pour l'effet de vent : (avec le test simple des 3 flocons au dessus)

    Un 2è timer pour le déplacement horizontal des flocons , plus il est rapide, plus il y a du vent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.Timer2Timer(Sender: TObject); // 100 ms 
    begin
    image1.left := image1.left +1;
    image2.left := image2.left +1;
    image3.left := image3.left +1;
    end;
    C'est très moche mais ça a le mérite d'être très simple

  8. #8
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Voici mon code, transposé en Delphi. Il faut poser un TPaintBox et un TTimer sur la fenêtre et régler le timer selon la vitesse voulue :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
     
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
      TFlocon = class
        x, y, vitesse : integer;
        constructor Create(px, py, pvitesse : integer);
      end;
     
    var
      Form1: TForm1;
      flocons : array[1..500] of TFlocon;
     
    implementation
     
    {$R *.dfm}
     
    { TFlocon }
     
    constructor TFlocon.Create(px, py, pvitesse: integer);
    begin
      x := px;
      y := py;
      vitesse := pvitesse;
    end;
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i : integer;
    begin
      for i := low(flocons) to high(flocons) do
        flocons[i] := TFlocon.Create(random(paintbox1.Width),random(paintbox1.Height),random(3));
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var
      i : integer;
    begin
      for i := low(flocons) to high(flocons) do
        flocons[i].Free;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i : integer;
    begin
      with paintbox1 do
      begin
        Canvas.FillRect(ClientRect);
        for i := low(flocons) to high(flocons) do
        begin
          flocons[i].x := flocons[i].x + 1 - random(3);
          flocons[i].y := flocons[i].y + 1 + flocons[i].vitesse;
          Canvas.MoveTo(flocons[i].x,flocons[i].y);
          Canvas.LineTo(flocons[i].x+1,flocons[i].y+1);
          if (flocons[i].y > paintbox1.Height) then
          begin
            flocons[i].x := random(paintbox1.Width);
            flocons[i].y := 0;
          end;
        end;
      end;
    end;
     
    end.
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  9. #9
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Je me suis inspiré de ton code Bloon pour optimiser un peu le mien...
    C'est maintenant plus rapide et plus fluide!

    http://sub0.developpez.com/delphi/noel2.zip

    Par contre, j'ai un doute sur la libération des objets dans mon code... à+
    De retour parmis vous après 10 ans!!

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    OK merci beaucoup, c'est S-U-P-E-R 8)

    Je vais étudier tout ça

  11. #11
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    the_magik_mushroom : Pour détailler l'algo de déplacement dans ma démo, je voulais obtenir 2 choses au départ: Que la vitesse de chute et les variations soient proportionnelles à la taille des flocons et que la direction soit la même pour tous les flocons. J'ai ajusté le tout "à la main" en regardant l'effet que produisait la modification des constantes et variables (réglées au pif finalement)... J'ai ensuite ajouté un tableau (ZoomRatio) parceque le nombre de petits flocons n'était pas assez élevé selon moi... Pour info, j'utilise le TImage du flocon original pour sauver l'espace sans neige avant l'anim. En effet, une fois tous les flocons préparés, ce TImage est libre. Je l'utilise donc pour faire une capture de l'arrière plan avant l'anim et j'utilise ensuite cette image pour restaurer l'arrière plan avant de déplacer à nouveau un flocon... En résumé, l'image du flocon a 2 fonctions, je tenais à le préciser pour ne pas t'embrouiller. N'hésite pas si tu as des questions, à+
    De retour parmis vous après 10 ans!!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    merci

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

Discussions similaires

  1. [C#] Comment coder un String.Join pour des int ?
    Par luimême dans le forum C#
    Réponses: 2
    Dernier message: 12/10/2005, 08h14
  2. [matrice spéciale] comment coder ce genre de matrices?!
    Par wjean dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 09/05/2005, 09h50
  3. Comment coder une tabulation pour cut ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2004, 10h31
  4. Comment coder guillemets et cotes ?
    Par Vow dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/05/2003, 12h11
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

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