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

Contribuez Pascal Discussion :

Dessin et animation d'une roue


Sujet :

Contribuez Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut Dessin et animation d'une roue
    Bonjour ! Je vous propose un petit truc que j'ai fait pour répondre à une question sur le forum anglophone.

    Il s'agissait de dessiner une roue avec des chiffres et de la faire tourner. Pour dessiner la roue j'ai écrit un petit programme utilisant Cairo.

    Nom : roulette3.png
Affichages : 178
Taille : 15,1 Ko

    Ensuite j'ai modifié ce programme pour qu'il accepte un paramètre (un angle en degrés), ce qui m'a permis de générer 36 images correspondant à 36 positions différentes de la roue.

    Puis j'ai fait un premier projet Lazarus, qui fait tourner la roue en fonction de la valeur d'un TSpinEdit, pour montrer le principe d'une animation.

    Nom : roulette-demo-1.png
Affichages : 169
Taille : 14,5 Ko

    Puis un deuxième projet qui simule un lancement de la roue avec une force aléatoire, pour finalement s'arrêter sur un nombre, comme dans un jeu.

    Nom : roulette-demo-2.png
Affichages : 168
Taille : 14,9 Ko

    J'ai dû réduire la taille des images pour que le fichier ne soit pas trop lourd. Vous pouvez facilement en générer de plus grandes (en modifiant l'unité constants.pas).

    J'ai essayé de faire en sorte qu'il n'y ait pas trop de nombres magiques dans le code, mais il y en a quand même. J'ai passé l'après-midi à faire du calcul mental.

    Voilà, vos éventuelles observations sont bienvenues.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonsoir, et bravo et merci pour ce sympathique projet.

    Mais dans le projet Demo, j'ai un petit souci avec mon vieux Linux et mon vieux Lazarus : en incrémentant le compteur, une fois arrivé à 350 tout se fige et terminé !
    Pourtant le code est tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if SEAngle.Value = 360 then
        SEAngle.Value := 0;
    Je t'avoue que j'ai une grosse flemme à déverminer le truc, ayant d'autres chats à fouetter.

    Quant au demo-timer, il m'a fallu remplacer FBuffer.EraseRect(Rect(0, 0, 159, 159), 255);, inconnu chez moi, par ce que j'ai trouvé de plus approchant, FBuffer.EraseRectAntialias(0, 0, 159, 159, 255);, pour que ça compile (là aussi j'ai une vieille version).

    Mais une fois lancé, j'ai été bien bluffé ! Pas mal du tout pour un 1er janvier !


    Bonne année et bons codes,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonsoir JP. Merci pour ton retour.

    Citation Envoyé par Jipété Voir le message
    Mais dans le projet Demo, j'ai un petit souci avec mon vieux Linux et mon vieux Lazarus : en incrémentant le compteur, une fois arrivé à 350 tout se fige et terminé !
    Pourtant le code est tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if SEAngle.Value = 360 then
        SEAngle.Value := 0;
    J'ai eu un doute en écrivant cette partie. Est-ce une bonne chose de changer la valeur du TSpinEdit dans son propre événement OnChange ? Chez moi, ça marchait, donc je l'ai laissé comme ça.


    Citation Envoyé par Jipété Voir le message
    Bonne année et bons codes,
    Bonne année à toi aussi.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut bonjour,

    en lisant ta réponse, j'ai fait un test basique et ultra-light,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.SpinEdit1Change(Sender: TObject);
    begin
      caption := inttostr(spinedit1.Value);
      if spinedit1.Value = 5 then spinedit1.Value := 0;
    end;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.SpinEdit1Change(Sender: TObject);
    begin
      if spinedit1.Value = 5 then spinedit1.Value := 0;
      caption := inttostr(spinedit1.Value);
    end;
    et dans les deux cas c'est pareil, hang après la valeur 4.

    La solution en deux procédures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.SpinEdit1Change(Sender: TObject);
    begin
      caption := inttostr(spinedit1.Value);
    end;
     
    procedure TForm1.SpinEdit1Click(Sender: TObject);
    begin
      if spinedit1.Value = 5 then spinedit1.Value := 0;
    end;
    et donc dans ton projet demo (testé et validé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.SEAngleChange(Sender: TObject);
    begin
      FIndex := SEAngle.Value div 10;
    end;
     
    procedure TForm1.SEAngleClick(Sender: TObject);
    begin
      if SEAngle.Value = 360 then
        SEAngle.Value := 0;
      PBAnimation.Invalidate;
    end;
    Bon dimanche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Effectivement, maintenant que tu le dis, ça paraît plus logique comme ça. Pas étonnant que ça marche mieux !

    Paresse de mettre à jour la pièce jointe, mais je vais faire la correction dans mon code. Merci, et bon dimanche à toi.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Dessiner un repère avec une animation
    Par Qt forever dans le forum Qt
    Réponses: 0
    Dernier message: 31/05/2011, 13h55
  2. Réponses: 6
    Dernier message: 21/03/2005, 13h22
  3. Réponses: 6
    Dernier message: 14/12/2004, 02h47
  4. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03

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