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 :

Déplacement trop rapide


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Déplacement trop rapide
    Bonjour à tous, je vous explique mon problème.
    Je voudrais faire une procédure qui me dessine des murs et qui fait que lorsque le personnage est assez proche du mur, il ne peut pas avancer s'il est dans la zone du mur (ni au dessus, ni à gauche, ni à droite).
    Le problème c'est que comme je dois répéter cette procédure pour chaque mur dans mon projet, cela multiplie l'indice de déplacement du personnage s'il n'est pas devant un mur et au bout de 10 murs il court en supersonique.
    J'ai alors essayé de réadapter ma fonction avec des boucles et des tableaux, la voici:

    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
    procedure moveup {(abscisse, yinf, ysup, ceilar : array of GLFloat)};
    var
     i : integer;
    begin
      for i := 1 to 19 do
        begin
        glBindTexture (GL_TEXTURE_2D, Texture1);
        glBegin(GL_QUADS);
        glColor3ub (255, 255, 255);
        glTexCoord2f (0, 1); glVertex3f (abscisse[i], yinf[i], ceilar[i]);
        glTexCoord2f (1, 1); glVertex3f (abscisse[i], ysup[i], ceilar[i]);
        glTexCoord2f (1, 0); glVertex3f (abscisse[i], ysup[i], -1);
        glTexCoord2f (0, 0); glVertex3f (abscisse[i], yinf[i], -1);
        glend();
    
      if up = 1 then
        if (abscisse[i] + 1.3 < a) and (abscisse[i] + 1.5 > a) then
          if (yinf[i] < b) and (ysup[i] > b) and (c < ceilar[i] + 1) then
            a := a
          else
            a := a - 0.1
          else
            a := a - 0.1
          else
            a := a;
        end;
    end;
    Mais, vous l'avez bien vu, la portion de code en rouge se répète pour chaque valeur de "i" dans la boucle et donc je retombe sur exactement le même problème.
    Ma question est est-ce que quelqu'un peut m'aider à trouver la solution pour que le déplacement else a := a - 0.1 ne soit pris en compte qu'une seule fois dans la boucle et dans tout le projet, autant qu'il y ait de murs?
    Autrement dit, je ne voudrais pas cumuler les a := a - 0.1 pour chaque mur ajouté (ou chaque tour de boucle supplémentaire) comme c'est le cas actuellement.
    Merci d'avance

    Edit: Je précise que je travaille en OpenGL avec la librairie GLFW.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Surement utiliser un booléan et et le mettre false lorsque l'on passe dans ton else ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Je ne vois comment et où utiliser un booléen.
    Tu pourrais être un peu plus précis, stp?
    Merci ^^

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par User Name Voir le message
    Je ne vois comment et où utiliser un booléen.
    Tu pourrais être un peu plus précis, stp?
    Merci ^^
    Je déclarerai un boolean Continue à true puis je le mettrai à false lorsque je rentre dans une condition ...dans ton code ça serait un truc de ce genre :

    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
    procedure moveup {(abscisse, yinf, ysup, ceilar : array of GLFloat)};
    var
     i : integer;
    continue:boolean;
    begin
      continue:=true;
      for i := 1 to 19 do
      begin
        glBindTexture (GL_TEXTURE_2D, Texture1);
        glBegin(GL_QUADS);
        glColor3ub (255, 255, 255);
        glTexCoord2f (0, 1); glVertex3f (abscisse[i], yinf[i], ceilar[i]);
        glTexCoord2f (1, 1); glVertex3f (abscisse[i], ysup[i], ceilar[i]);
        glTexCoord2f (1, 0); glVertex3f (abscisse[i], ysup[i], -1);
        glTexCoord2f (0, 0); glVertex3f (abscisse[i], yinf[i], -1);
        glend();
     
        if up = 1 then
        begin
          if (abscisse[i] + 1.3 < a) and (abscisse[i] + 1.5 > a) then
          begin
            if (yinf[i] < b) and (ysup[i] > b) and (c < ceilar[i] + 1) then
              a := a
            else
            begin
              if continue then
              begin
                a := a - 0.1;
                continue:=false;
              end;
            end;
          end
          else
          begin
            if continue then
            begin
              a := a - 0.1;
              continue:=false;
            end;
          end;
        end
        else
          a := a;
      end;
     continue:=true;
    end;
    Je me suis permis d'adapter ton code car j'y comprenais pas grand chose avec les if ...

    Je ne garanti rien ... ça tombe je suis à coté de la plaque (code non testé bien entendu )

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    PAS MAL!

    Le booléen doit être ajouté uniquement dans le deuxième else, sinon avec ton code, mon personnage ne bouge plus.

    Bon là par contre je n'ai plus les collisions.
    Je vais essayer de découvrir pourquoi.
    Merci pour ton aide qui m'a été précieuse.

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par User Name Voir le message
    PAS MAL!
    Merci pour ton aide qui m'a été précieuse.
    Pas de soucis
    As-tu remarqué que j'avais modifié mon post entre deux ... ?

    Si oui, je te souhaite bon courage pour la suite!

    A+

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Trouvé!
    Il suffisait juste de remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if up = 1 then
        begin
          if (abscisse[i] + 1.3 < a) and (abscisse[i] + 1.5 > a) then
          begin
            if (yinf[i] < b) and (ysup[i] > b) and (c < ceilar[i] + 1) then
              a := a
            else
    par a := a + 0.1

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par User Name Voir le message
    Trouvé!
    Il suffisait juste de remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if up = 1 then
        begin
          if (abscisse[i] + 1.3 < a) and (abscisse[i] + 1.5 > a) then
          begin
            if (yinf[i] < b) and (ysup[i] > b) and (c < ceilar[i] + 1) then
              a := a
            else
    par a := a + 0.1
    Bien joué !

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

Discussions similaires

  1. JBOX2D problème de déplacement trop rapide
    Par leandro95 dans le forum 2D
    Réponses: 1
    Dernier message: 09/03/2015, 11h47
  2. Déplacements trop rapides
    Par Exedor dans le forum Ogre
    Réponses: 8
    Dernier message: 09/08/2006, 08h43
  3. [VBA-E] Liaisons qui ne se mettent pas à jour (macro trop rapide?)
    Par minikisskool dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 21/11/2005, 09h36
  4. Horloge 2x trop rapide!
    Par rgy834 dans le forum Administration système
    Réponses: 6
    Dernier message: 24/10/2005, 21h08
  5. Compte à rebours trop rapide
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2005, 20h57

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