Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit soucis ...

deplacer une image

    29 mai 2006 à 19:40:52

    Bonjour à tous.
    Je suis en train de programmer un jeu et je veux que lorsque le joueur choisisse de tirer le tir (de blaster) apparaisse et se deplace jusqu'à l'adversaire.
    Pour cela je fais appel à la fonction action blaster, où j'ai repris le code que j'ai utilisé lors de l'exercie d'entrainement du chapitre sur la gestion du temps.
    Ce qui me donne donc ce code :
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include "constantes.h"
    #include "jeu.h"
    #include "fichiers.h"

    void action_blaster(SDL_Surface* ecran)
    {
        SDL_Surface *fond = NULL, *tir = NULL;
         // création des differentes surfaces

        int temps_actuel, temps_precedent;

        SDL_Rect position_tir;
        SDL_Rect position_fond; // création de la position du fond

        position_fond.x = 0;
        position_fond.y = 0;

        position_tir.x = 137;
        position_tir.y = 418,5;

        fond = IMG_Load("bataille1.jpg");
        tir = IMG_Load("tirb.png");

        SDL_BlitSurface(fond, NULL, ecran, &position_fond); // on colle l'image

        while(position_tir.x != 528,5)
        {

            temps_actuel = SDL_GetTicks();
            if (temps_actuel - temps_precedent > 30) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle */
            {
                position_tir.x++;
                temps_precedent = temps_actuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
            }


            SDL_BlitSurface(fond, NULL, ecran, &position_fond); // on colle l'image
            SDL_BlitSurface(tir, NULL, ecran, &position_tir);
            SDL_Flip(ecran);


        }

        SDL_FreeSurface(fond);
        SDL_FreeSurface(tir);

    }


    Mais quand je veux tester cette action, le programme plante ...
    J'espère donc que vous pourrez (conrairement à moi) trouver l'erreur dans ce code.

    Merci d'avance de votre aide et bonne soirée.
    • Partager sur Facebook
    • Partager sur Twitter
      29 mai 2006 à 19:56:01

      Il faut initialiser temps_precedent:
      temps_precedent = SDL_GetTicks();
      • Partager sur Facebook
      • Partager sur Twitter
        29 mai 2006 à 19:59:00

        Déjà, met bien toutes les valeurs de SDL_Surface à NULL (tu oublies tir). Ensuite, ton SDL_BlitSurface(fond, NULL, ecran, &position_fond); , avant le while, est inutile. Et enfin, tu oublies de "effacer" l'écran avec SDL_FillRect (avant le blit).

        Pour ton problème, je pense, sans être sur le moins du monde, que tu ne peux pas mettre des nombres à virgule en parlant de pixel. Je pense pas qu'on puisse diviser des pixels. Essaye en enlevant la partie décimale. ^^
        • Partager sur Facebook
        • Partager sur Twitter
          29 mai 2006 à 19:59:23

          Euh non merci mais ce n'est pas ça dsl ...
          Et j'avais déjà initialisé temps précédent :
          temps_precedent = temps_actuel;


          EDIT: coyote, merci mais c'est pas ça ... tant pis en tout cas c'est vrai pour tir j'ai pas fais gaffe ^^
          • Partager sur Facebook
          • Partager sur Twitter
            29 mai 2006 à 20:02:17

            Il faut que t'initialises temps_precedent avant
            if (temps_actuel - temps_precedent > 30)

            • Partager sur Facebook
            • Partager sur Twitter
              29 mai 2006 à 20:06:41


              Citation : Dark-Side

              EDIT: coyote, merci mais c'est pas ça ... tant pis en tout cas c'est vrai pour tir j'ai pas fais gaffe ^^


              Ok... Bah, j'ai pas trop d'idée alors... o_O
              • Partager sur Facebook
              • Partager sur Twitter
                29 mai 2006 à 20:09:30

                Coyotte49, c'est plutot toi qui doit aller chez l'occuliste. Il a initialisé temps_actuel mais pas temps_precedent!
                • Partager sur Facebook
                • Partager sur Twitter
                  29 mai 2006 à 20:10:25

                  Citation : king92world

                  Il faut que t'initialises temps_precedent avant

                  if (temps_actuel - temps_precedent > 30)




                  Euh désolé mais non, je suis sur que non !
                  Sinon temps_actuel serait toujours à peu près égal à temps précédent !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mai 2006 à 20:16:07

                    Non mais tu le mets en-dehors de la boucle while car là il n'a pas de valeur ( enfin ... ) ou sinon initialise le à 0 au tout début.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mai 2006 à 20:18:29

                      Ah dsl, ça aussi j'avais oublié ...
                      Mais ce n'est néanmoins pas ça ...

                      Voici mon code mis à jour :
                      #include <stdlib.h>
                      #include <stdio.h>
                      #include <SDL/SDL.h>
                      #include <SDL/SDL_image.h>
                      #include <SDL/SDL_ttf.h>
                      #include "constantes.h"
                      #include "jeu.h"
                      #include "fichiers.h"

                      void action_blaster(SDL_Surface* ecran)
                      {
                          SDL_Surface *fond = NULL, *tir = NULL;
                           // création des differentes surfaces

                          int temps_actuel = 0, temps_precedent = 0;

                          SDL_Rect position_tir;
                          SDL_Rect position_fond; // création de la position du fond

                          position_fond.x = 0;
                          position_fond.y = 0;

                          position_tir.x = 137;
                          position_tir.y = 418;

                          fond = IMG_Load("bataille1.jpg");
                          tir = IMG_Load("tirb.png");

                          while(position_tir.x != 528)
                          {
                              if (temps_actuel - temps_precedent > 30) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle */
                              {
                                  position_tir.x++;
                                  temps_precedent = temps_actuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
                              }


                              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 188, 188, 188));
                              SDL_BlitSurface(fond, NULL, ecran, &position_fond); // on colle l'image
                              SDL_BlitSurface(tir, NULL, ecran, &position_tir);
                              SDL_Flip(ecran);

                              temps_actuel = SDL_GetTicks();


                          }

                          SDL_FreeSurface(fond);
                          SDL_FreeSurface(tir);

                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mai 2006 à 20:22:37

                        Là je vois pas du tout où est l'erreur o_O . Normalement ça devrait marcher. Et ça te met quoi comme erreur?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mai 2006 à 20:26:07

                          Ben justement y me mettent rien !
                          Je lance l'action et le programme bug, je quitte et windows me met un truc : envoyer le rapport d'erreur ...
                          Et ensuite j'ai ça :

                          Citation : message de code bloc

                          Project : sw : wrath of knight
                          Compiler : GNU GCC Compiler (called directly)
                          Directory : C:\Documents and Settings\thomas\Bureau\RPG_SDL\
                          --------------------------------------------------------------------------------
                          Checking for existence: rpg_v_beta1.exe
                          Executing: "C:\Documents and Settings\Refis.thomas\Bureau\RPG_SDL\rpg_v_beta1.exe" (in .)
                          Process terminated with status 1 (0 minutes, 23 seconds)
                          0 errors, 0 warnings



                          C'est pour ça que je suis perdu !


                          EDIT: J'ai trouvé !
                          Le nom de l'image c'est tir_b.png et pas tirb.png :euh:
                          Désolé à tous, néanmoins vous m'avez trouvé un bon nombre d'erreur qui auraient aussi fait buggé le prog.
                          Donc merci à tous !
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Petit soucis ...

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown