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

Lazarus Pascal Discussion :

Mouvement d'éléments dans un Timage - éviter les sorties de cadre pour des trajectoires complexes [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Mouvement d'éléments dans un Timage - éviter les sorties de cadre pour des trajectoires complexes
    Bonjour,

    Etudiant en cours de réalisation d'un projet informatique, je bloque à une étape (initiale -_-) :

    Je souhaite gérer des animaux (schématiser à travers une classe, et pour l'instant représenter à l'écran par des disque) dans le temps. Il faut donc qu'ils sachent se déplacer, et qu'ils ne sortent pas de l' "aquarium" (l'image) dans lequel ils évoluent.
    Je bloque à cette étape. Même en gardant des trajectoires simples, rectilignes, et en considérant que les animaux, arrivés au bord de l'image, ne font que rebondir, j'ai des bugs : parfois ils rebondissent correctement (généralement sur les bords gauches et droits de l'image), parfois leur trajectoire ne change pas d'un iota et ils sortent donc de l'écran, ou alors parfois le rebond se fait de manière étrange.
    Bref, voici un extrait du code :

    Unité de la classe Canimal :

    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
    unit Uanimal;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
      StdCtrls, Grids, Graph, ExtCtrls, Math;
     
    Const LimBord = 50;
          MaxAnimaux = 200;
     
    type TCoord = Array[1..2] of word;
         TVect = Array[1..2] of real;
         Tsexe = (M,F);
     
         Panimaux = ^Tanimaux;
     
         Canimal = Class
                        Protected
                                 // Caractéristiques :
                                 Num : integer;
                                 position : TCoord; // position dans bocal
                                 Vecteur : TVect;     // Vecteur définissant la direction actuelle
                                 taille : integer;         // + poids : détermine l'énergie à consommer pour bouger, la quantité de viande si mangé, ...
                                 rapidite : real;          // influe sur la vitesse de déplacement
     
                        Public
                                 Procedure NewVecteur(Im : Timage);
                                 Procedure NewPosition();
     
                            End;
     
         Tanimaux = Record
                          Animal : Canimal;
                          Suivant : Panimaux;
                          End;
     
     
     
     
     
     
    implementation
     
     
                  Procedure Canimal.NewVecteur(Im : Timage);
                  Var VectBord : TVect; Posg, Posd, Posb, Posh : integer;
                  Begin
                       // Position des extrémités de l'animal (schématisé par une sphère)
                       Posg := Position[1] - taille div 2;
                       Posd := Position[1] + taille div 2;
                       Posb := Position[2] - taille div 2;
                       Posh := Position[2] + taille div 2;
                       VectBord[1] := 0; VectBord[2] := 0;
                       If (Posg < LimBord) or (Posd > (Im.width - LimBord)) then
                          Vecteur[1] := -1*Vecteur[1]; // rebond sur les parois gauche ou droite
     
                       If (Posb < LimBord) and (Posh > (Im.height - LimBord)) then
                          Vecteur[2] := -1*Vecteur[2]; // rebond sur les parois bas ou haut
     
                  end;
     
                  Procedure Canimal.Newposition();
                  Var teta, p1, P1s, P2, P2s, v1, v2, vit : real;
                  Begin
                       // Angle Teta en radian de la trajectoire
                        If Vecteur[1] <> 0 then Teta := Arctan(Vecteur[2]/Vecteur[1])
                        Else Teta := 0;
                        If Vecteur[1] < 0 then Teta += pi();
     
                       // Projection du Vecteur (vecteur trajectoire) sur chaque axe et calcul de la nouvelle position
                        Position[1] += round(rapidite*cos(Teta));
                        Position[2] += round(rapidite*sin(Teta));
     
                  End;
     
     
     
    end.
    Vient ensuite d'autres unités s'occupant de gérer la liste d'animaux, l'affichage, ... mais je ne pense pas que l'erreur vienne de là.
    Je pense que mes erreurs viennent d'une bourde idiote, genre une condition erronée ou mon calcul d'angle foireux, ou alors d'une propriété ignorée du Timage, mais impossible de mettre le doigt dessus, malgré les heures passées à débugger, rectifier, recommencer, ...

    En espérant que vous serez plus efficace que moi.
    Merci pour l'attention.
    Cordialement.

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    mmm pas trés discipliné comme code.

    jete un coups d'oeuil à la pièce jointe.
    Fichiers attachés Fichiers attachés
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/10/2014, 15h02
  2. Réponses: 1
    Dernier message: 18/08/2010, 14h32
  3. dans mon site web les images mettent 5mn pour s'afficher, pourkoi ?
    Par lao.patrick dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/11/2009, 05h13
  4. Réponses: 4
    Dernier message: 10/02/2009, 15h56
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

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