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

 Delphi Discussion :

Balle Rebondissante Soucis Form1 Taille


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 21
    Points
    21
    Par défaut Balle Rebondissante Soucis Form1 Taille
    Bonjour, voila suite à l'élaboration de l'algo et du codage sous Delphi du petit programme pour les balles rebondissantes.

    En classe notre enseignant c'est retrouvé avec une petite surprise.

    La balle rebondit bien effectivement, si on redimensionne le Form1 de manière normale aucun problème, mais si nous le faisons cela de manière brute, la belle ne crée donc aucune collision et continue son chemin dans l'infini.

    Voici le code
    Form1.tag vaut -10 et Shape1.Tag -10 aussi

    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
     
    unit tst06ju;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Shape1: TShape;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      BordGauche, BordDroit, BordSup, BordBas, DV, DH : integer;
      VersDroite, VersBas : Boolean ;
    begin
     
      DV := Form1.Tag;
      DH := Shape1.Tag;
      BordGauche := 0;
      BordSup := 0;
      BordDroit := Form1.ClientWidth  - Shape1.Width;
      BordBas   := Form1.ClientHeight - Shape1.Height;
     
      VersDroite := ( DH > 0 );
      if  ((Shape1.Left + DH) < BordGauche) OR ((Shape1.Left + DH) > BordDroit) then
            begin DH := -DH;
                   if VersDroite
                   then  Shape1.Left := BordDroit  - Shape1.Left + DH + BordDroit
                   else  Shape1.Left := BordGauche - Shape1.Left + DH + BordGauche
            end
        else   Shape1.Left := Shape1.Left + DH;
     
      VersBas := ( DV > 0 );
      if ((Shape1.Top + DV) < BordSup) OR ((Shape1.Top + DV) > BordBas)
        then begin DV := -DV;
                if VersBas then Shape1.Top := BordBas  - Shape1.Top + DV + BordBas
                end
       else   Shape1.Top := Shape1.Top + DV;
     
     
    Form1.Tag := DV;  Shape1.Tag := DH;
     
    end;
     
    end.

    Donc je le redis, c'est si on rétrécit trop rapidement le Form1 que le balle ne calcule donc plus de collision et part totalement vers le bas infiniment.
    Si vous aviez un indice, car on va devoir attendre deux semaines avant de le revoir, et ça m'ennuie de ne pas comprendre.

    J'espère avoir pu être assez clair.

    EDIT : j'ai join le projet complet. Delphi7 mais s'utilise sur embarcadero.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Elle ne devrait pas partir contre l'infini, mais osciller entre deux positions (invisibles)
    Si Shape1.Left - DH est plus grand que le bord droit, il y a inversion et puisque Shape1.Left + DH l'est forcément...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Elle ne devrait pas partir contre l'infini, mais osciller entre deux positions (invisibles)
    Si Shape1.Left - DH est plus grand que le bord droit, il y a inversion et puisque Shape1.Left + DH l'est forcément...
    Donc dois sortir Shape1.Left + DH de la condition else, car elle se fait naturellement.

    Ainsi que Shape1.Top + DH

    C'est bien cela que tu essayes de me dire ?

    Ça semble régler que partiellement le soucis, il arrive encore par moment qu'elle disparaisse donc n'importe ou.

    edit ah moins que tu me parles de la condition OR ?
    Saurais tu me dires ton raisonnement ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    La condition OR bien sûr. Tu vas à droite : tu testes le bord droit. Tu vas à gauche : tu testes le bord gauche.

    A l'heure actuelle, si le redimentionnement (delta) est supérieur à DH, Shape1.Left +/- DH sera toujours supérieur au bord droit. Ta forme oscille donc entre Left et Left +DH ou Left et Left -DH (en fonction de VersDroite)

    ...mais le redimentionement donne le résultat escompté s'il est inférieur à DH par cycle du timer

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    La condition OR bien sûr. Tu vas à droite : tu testes le bord droit. Tu vas à gauche : tu testes le bord gauche.

    A l'heure actuelle, si le redimentionnement (delta) est supérieur à DH, Shape1.Left +/- DH sera toujours supérieur au bord droit. Ta forme oscille donc entre Left et Left +DH ou Left et Left -DH (en fonction de VersDroite)

    ...mais le redimentionement donne le résultat escompté s'il est inférieur à DH par cycle du timer
    ok je vais bien relire afin de bien comprendre ce que tu me dis.
    Merci de l'indice, je vais approfondir afin de bien tout saisir.

    EDIT : Le truc si je décide donc de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  ((Shape1.Left + DH) < BordGauche) OR ((Shape1.Left - DH) > BordDroit)then
    Mon soucis sera que j'obtiens des barres de défilement quand il touche à droite non ?

    ...mais le redimentionement donne le résultat escompté s'il est inférieur à DH par cycle du timer
    Le soucis viendrait plus de cette notion également si j'arrive à comprendre.
    Il faudrait que par cycle on soit sur que le redimensionnement est bien inférieur à DH alors ?

    Et est-ce possible à programmer ? Ou est-ce inutile ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Citation Envoyé par KaZz- Voir le message
    Mon soucis sera que j'obtiens des barres de défilement quand il touche à droite non ?
    Normalement pas puisque BordDroit vaut ClientWidth -Shape1.Width. Les barres apparaîtront par contre au redimentionnement, le temps que Shape1 redevienne visible.

    Citation Envoyé par KaZz- Voir le message
    Il faudrait que par cycle on soit sur que le redimensionnement est bien inférieur à DH alors ?
    C'était juste pour t'expliquer le comportement de ton code...

    La logique est de ne tester que le bord où le rebond aura lieu. Si le déplacement est vers la gauche, on teste le bord gauche et inversement.

    si
    (DH > 0) et (Left +DH > BordDroit)
    ou
    (DH < 0) et (Left +DH < BordGauche)
    alors
    DH = -DH

    Left = Left +DH

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Je te remercie l'algo que tu m'as écrit résolve le problème.
    Maintenant il est vrai que je n'ai pas encore totalement compris mais je vais me débrouiller à tout décortiquer.

    Je te remercie de ton aide. J'espère ne pas t'avoir ennuyer avec mes questions simplistes de débutant.

    Bonne journée.

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

Discussions similaires

  1. petit soucis de taille de tableau
    Par ortholle dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 16/10/2009, 17h08
  2. [PHP 4] [Upload] Upload - Souci de taille de fichier
    Par R@IZER dans le forum Langage
    Réponses: 12
    Dernier message: 08/01/2009, 23h42
  3. petit soucis de taille
    Par toxic_37 dans le forum Applets
    Réponses: 1
    Dernier message: 25/10/2007, 21h08

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