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 :

Problème de procédure de ramassage de carottes


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    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
    Par défaut Problème de procédure de ramassage de carottes
    Bonjour,
    J'ai un problème avec la procédure suivante:

    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
    procedure carottes;
    var
     m : integer;
    begin
    ate := 0;
      for m := 1 to 29 do
        begin
        glPushMatrix();
        glTranslatef(acar[m], bcar[m], ccar[m]);
        glColor3f( 153, 153, 0 );
        gluCylinder( glunewquadric(), 0.05, 0.0, 0.3, 30, 30 );
        glPopMatrix();
        if ((a < acar[m] + 1.2) and (a > acar[m] + 0.9)  and (b > bcar[m] - 0.2) and (b < bcar[m] + 0.2) and
          (c < ccar[m] + 1.1)) then
        ccar[m] := ccar[m] + 7;
        ate := ate + 1;
        if ate > 30 then
        Exit := 1;
    end;
    Légende:
    a, b, c : Coordonnées de mon personnage
    acar : Tableau de coordonnées abscisses de carottes
    bcar : Tableau de coordonnées ordonnées de carottes
    ccar : Tableau de coordonnées cotes de carottes
    ate : Une variable qui indique le nombre de carottes ramassées

    Remarque: Mon repère est inversé, je me déplace dans le sens négatif.


    Dans ce code, je voudrais que lorsque mon personnage est à une certaine proximité d'une de mes carottes (ici, la carotte m), sa coordonnée de cote prenne + 7 (donc la carotte monte) et que la variable ate prenne + 1 (donc j'ai mangé une carotte de plus). Si j'ai mangé x carottes (donc quand ate = x), je sors du niveau (Exit := 1).

    Problèmes:

    - La partie and (a > acar[m] + 0.9) de mon code n'est "pas lue" par le compilateur, càd que lorsque je suis sur une carotte tout celles qui la précedent disparraissent aussi (donc y a que if a < acar[m] + 1.2 qui est compilée de mon point de vue).

    - Le plus sérieux des deux problèmes est celui-ci: Si je mets ate à une valeur moindre de 30 (dans ce cas là), Exit prend d'ores et déjà 1 et je sors du niveau avant même de le commencer (mon perso commence à l'abscisse 0).

    Quelqu'un peut m'aider?
    Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Il manque Begin End pour le if...
    donc ate := ate + 1 s'execute toujours...
    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 carottes;
    Var
      m: integer;
    Begin
      ate := 0;
      For m := 1 To 29 Do
      Begin
        glPushMatrix();
        glTranslatef(acar[m], bcar[m], ccar[m]);
        glColor3f(153, 153, 0);
        gluCylinder(glunewquadric(), 0.05, 0.0, 0.3, 30, 30);
        glPopMatrix();
        If ((a < acar[m] + 1.2) And (a > acar[m] + 0.9)
          And (b > bcar[m] - 0.2) And (b < bcar[m] + 0.2)
          And (c < ccar[m] + 1.1)) Then
        Begin      
          ccar[m] := ccar[m] + 7;
          ate := ate + 1; //<- Cette ligne était toujours executé
                          //car il manquait begin end
        End;
        If ate > 30 Then Exit := 1;
      End;
    End;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  3. #3
    Membre très actif
    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
    Par défaut
    En effet, merci, maintenant le niveau ne se ferme plus si je modifie la valeur condition de ate.
    Mais j'ai toujours mes carottes qui redescendent après et si j'atteint et je dépasse ate, le niveau ne se ferme pas...

    Donc voilà en fait j'explique mieux ce qui se passe:

    Le jeu ne met ate à 1 que lorsque le personnage est sur une carotte.
    Mais lorsque le personnage n'est plus sur la carotte, elle redescend et donc ate redescend à 0. Or moi je veux que dès que le personnage est sur la carotte, elle reste en haut et ate reste à sa valeur ate + 1.


    Quelqu'un peut m'aider à faire ça?
    Merci d'avance

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Mmmmh si la carotte redescend c'est qu'à priori sa coordonnée ccar[m] devrait être décrémenté. Or ici la seule modification visible est que tu l'incrémente.

    Donc je dirais qu'il faudrait voir si ce ne sont pas les appels aux fonctions précédant ton IF qui ne sont pas responsable de ça (notamment glTranslatef(acar[m], bcar[m], ccar[m]) )

  5. #5
    Membre très actif
    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
    Par défaut
    Aie aie aie!
    Je viens de voir dans mon projet que cette portion de code était présente presque à l'identique dans deux procédures différentes.
    Celle que je vous ai livrée est celle qui a pour résultat que les carottes restent par terre!
    Je vous donne le deuxième code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //carottes
    acar[1] := -1; bcar[1] := -1; ccar[1] := -1;
    for i := 1 to 5 do
      begin
       acar[i+1] := acar[i] - 1;
       bcar[i+1] := bcar[i];
       ccar[i+1] := ccar[i];
     
       if ((a < acar[i] + 1.1) and (a > acar[i] + 0.9) and (b > bcar[i] - 0.2) and (b< bcar[i] + 0.2) and
          (c < ccar[i] + 1.1)) then
        ccar[i] := ccar[i] + 7;
        FSOUND_PlaySound(7,burpsound);
    Voilà c'est celui-là le code que je voulais soumettre, désolé!
    Alors dans celui-là, la carotte monte quand je suis dessus, puis redescend quand je ne suis plus dessus. Effectivement y a pas de ate encore ici...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Bon c'est pas évident à comprendre (surtout qu'il doit manquer du code, au moins un end).

    Mais d'après ce que je comprends, à chaque tour de boucle tu reportes les valeurs actuelles des tableaux dans celles suivantes puis si le joueur est sur la carotte tu fais grimper ccar de 7 positions.

    C'est dans cette dernière action que se situe le problème car telle que fonctionne ta boucle, à l'index suivant la valeur de ccar courante est celle que tu lui a affecté précédemment AVANT de tester si la carotte devait grimper ou pas.

    Donc si je suis ta logique ça devrait donner :

    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
    //carottes
    acar[1] := -1; bcar[1] := -1; ccar[1] := -1;
    for i := 1 to 5 do
      begin
       acar[i+1] := acar[i] - 1;
       bcar[i+1] := bcar[i];
       ccar[i+1] := ccar[i];
     
       if ((a < acar[i] + 1.1) and (a > acar[i] + 0.9) and (b > bcar[i] - 0.2) and (b< bcar[i] + 0.2) and
          (c < ccar[i] + 1.1)) then
       begin
        ccar[i] := ccar[i] + 7;
        ccar[i+1] := ccar[i];
        FSOUND_PlaySound(7,burpsound);
       end;
     
    end;

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

Discussions similaires

  1. [SQLSERVER]Problème de procédure stockée
    Par mikedavem dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/12/2006, 00h17
  2. Réponses: 1
    Dernier message: 17/07/2006, 17h08
  3. Problème Création Procédure
    Par Yndigos dans le forum Oracle
    Réponses: 6
    Dernier message: 08/07/2006, 09h02
  4. Problème de procédure objet : Migration de TForm vers TFrame
    Par rvzip64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 13/06/2005, 13h44
  5. Problème de procédure stockée
    Par Sorcier157 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/03/2005, 17h57

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