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

SDL Discussion :

Comment ne pas enregistrer plusieurs fois une touche ?


Sujet :

SDL

  1. #21
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Aaaaa okay !
    Jpensais pas vraiment que tu allais carrément me coder quelque chose !*
    Merci c'est sympa !
    C'est clair que c'est bien codé ! Et je viens de comprendre l'utilité deds structure !! Comme sa au lieu de passer 10000 arguments ba tu as juste à passer ta structure et dedans t'as juste à atteindre les éléments ! Astucieux !
    Je viens de comprendre ce que tu essayait de me dire quand tu disais que je ne pourrais pas avoir plusieurs personnages par exemple !

    Sinon à la ligne 88 il y a marqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(elem, 0, sizeof(*elem));
    J'ai jamais vu cette fonction je l'ai pas vu dans ton code, donc j'en déduis que c'est une fonction toute prêt qui fais un malloc sur "elem" ?

    Ensuite j'ai essayer d'utiliser la fonction "SDL_EnableKeyRepeat" et sa ne marche pas (d'ailleurs dans mon code non plus elle ne marche pas)
    Je l'ai mise juste avant la ligne événementielle dans la fonction main.

    Après ton code n'a pas marché du premier coup, à chaque fois que je prnd le code de quelqu'un, et que le main n'a pas les arguments int argc, et char *argv[], il y a une erreur de compilation...Peut-être pourriez-vous m'aider à ce sujet même si sa n'a pas vraiment de rapport !

    Eu sinon je comprend pas la ligne suivante(93) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tmp = SDL_CreateRGBSurface(SDL_HWSURFACE, 32, 32, screen->format->BitsPerPixel,
                                            screen->format->Rmask,
                                            screen->format->Gmask,
                                            screen->format->Bmask,
                                            screen->format->Amask);
    Je comprend que c'est le sprite, mais je comprend pas le dernier arguments...
    Apparemment sa crée une couleur non ? Mais je ne vois pas trop en fonction de quoi alors.


    Puis je vois, ligne 104 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_DisplayFormat(tmp);
    Sa convertit une surface en un autre format apparemment, mais je comprend pas son utilisation ni vraiment a quoi ça sert explicitement.


    Finnallement, je ne comprend pas non-plus vraiment comment tu gère les événements : Tu as un booléen, et tu dis que lorsqu'il est différent de 0, la boucle se répète, puis lorsque tu appuis sur une touche, ce booléen prend la valeur que retourne la fonction "Gestion_Clavier"(c'est-à-dire 1) ; je ne vois pas à quoi sa sert !
    Il suffit de mettre la valeur de ce booléen a 1, au début et de ne plus y toucher, seulement si on veut quitter le programme, nan ?

    P.S : C'est assez drôle je trouve : la moitié de tes variables et fonction sont en anglais, et l'autre en français !

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Juste une remarque sur le "SDL_EnableKeyRepeat", pour le faire marcher, il faut :

    -dans le main remplacer "case SDL_KEYUP:" par "case SDL_KEYDOWN:"
    -ajouter avant le while : SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);

    Pour memset, perdu ca fait pas de malloc, voir :
    http://www.linux-kheops.com/doc/man/.../memset.3.html

  3. #23
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Juste une remarque sur le "SDL_EnableKeyRepeat", pour le faire marcher, il faut :

    -dans le main remplacer "case SDL_KEYUP:" par "case SDL_KEYDOWN:"
    -ajouter avant le while : SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
    Exactement ce que j'ai fais

    Merci pour memset : sa remplit les octets..Mais de quoi ?

  4. #24
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    Sinon à la ligne 88 il y a marqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(elem, 0, sizeof(*elem));
    C'est une fonction qui remplit la zone pointée par elem par des 0 et fait ceci pour sizeof(*elem) octets.

    Après ton code n'a pas marché du premier coup, à chaque fois que je prnd le code de quelqu'un, et que le main n'a pas les arguments int argc, et char *argv[], il y a une erreur de compilation...Peut-être pourriez-vous m'aider à ce sujet même si sa n'a pas vraiment de rapport !
    C'est parce que sous windows c'est nécessaire or sous linux ce n'est pas le cas.


    Eu sinon je comprend pas la ligne suivante(93) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tmp = SDL_CreateRGBSurface(SDL_HWSURFACE, 32, 32, screen->format->BitsPerPixel,
                                            screen->format->Rmask,
                                            screen->format->Gmask,
                                            screen->format->Bmask,
                                            screen->format->Amask);
    Je comprend que c'est le sprite, mais je comprend pas le dernier arguments...
    Apparemment sa crée une couleur non ? Mais je ne vois pas trop en fonction de quoi alors.
    Cela crée une surface de taille 32*32 et ensuite cela utilise les valeurs de la surface de l'écran pour initialiser les différents champs pour avoir le même type de surface.

    Puis je vois, ligne 104 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_DisplayFormat(tmp);
    Sa convertit une surface en un autre format apparemment, mais je comprend pas son utilisation ni vraiment a quoi ça sert explicitement.
    Cela permet d'être sûr que la surface sera compatible avec la surface ecran, du coup lorsque tu fais des SDL_BlitSurface, le programme ne passe pas son temps à transformer les surfaces avant la copie.

    Finnallement, je ne comprend pas non-plus vraiment comment tu gère les événements : Tu as un booléen, et tu dis que lorsqu'il est différent de 0, la boucle se répète, puis lorsque tu appuis sur une touche, ce booléen prend la valeur que retourne la fonction "Gestion_Clavier"(c'est-à-dire 1) ; je ne vois pas à quoi sa sert !
    Cela permet à la fonction gestion_clavier de retourner si on continue ou pas le programme. Tu remarqueras que dans le cas de 'q', je retourne 0 ce qui permet de quitter le programme.

    P.S : C'est assez drôle je trouve : la moitié de tes variables et fonction sont en anglais, et l'autre en français !
    C'est le souci lorsqu'on est bilingue...

    Jc

  5. #25
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    D'accord tout est clair dans ma tête, sauf pour memset. Je préfère être sûr :
    En gros ça met toutes les sous-variables des variables de type SElem à 0 ? (dans notre cas, elem)

    EDIT : J'ai pas fais exprès pour le doublon fin tant pis je sais pas comment supprimer...

    En tout cas j'ai refais tout le programme :
    http://www.megaupload.com/?d=VU9FN8A2

    J'ai herbergé là-dessus

    Mais toute façon j'ai fais n'importe quoi et c'est pas fini.

    As-tu fais un brouillon avant de coder, ou as-tu préparé quelque chose avant de faire le code ?!
    Car je n'ai aucune méthodologie et je me suis emmêlé les pinceaux dans mon propre code, tellement que j'en ai marre et que je vais laisser tomber.

    Je vais aller plutot sur Game Creator Network, ya un tuto pour les RPGs sa montre comment faire les sprites en partie, à moins que demain soir en rentrant j'ai le courage de reprendre tout mon code

  6. #26
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    D'accord tout est clair dans ma tête, sauf pour memset. Je préfère être sûr :
    En gros ça met toutes les sous-variables des variables de type SElem à 0 ? (dans notre cas, elem)
    Oui
    En tout cas j'ai refais tout le programme :
    http://www.megaupload.com/?d=VU9FN8A2

    J'ai herbergé là-dessus

    Mais toute façon j'ai fais n'importe quoi et c'est pas fini.
    Alors ce n'est pas la peine de regarder, si ?

    As-tu fais un brouillon avant de coder, ou as-tu préparé quelque chose avant de faire le code ?!
    Non pas vraiment, mais je savais plus où moins ce qu'il fallait faire.

    Car je n'ai aucune méthodologie et je me suis emmêlé les pinceaux dans mon propre code, tellement que j'en ai marre et que je vais laisser tomber.
    Ca c'est un problème d'algorithmique. Tu peux suivre ces tutoriels pour comprendre comment faire :

    http://loka.developpez.com/tutoriel/sdl/
    http://fearyourself.developpez.com/t...l/sdl/morpion/
    http://fearyourself.developpez.com/tutoriel/sdl/pong/

    Cela devrait te donner des idées.

    Jc

  7. #27
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Alors ce n'est pas la peine de regarder, si ?
    Ba si t'as pas envie, bin nan Mais c'est plutôt histoire de voir ce qui ne va pas quoi...

    Ca c'est un problème d'algorithmique. Tu peux suivre ces tutoriels pour comprendre comment faire :
    Ok, merci

  8. #28
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    Ba si t'as pas envie, bin nan Mais c'est plutôt histoire de voir ce qui ne va pas quoi...
    Cela dépend, tu disais que t'avais fait n'importe quoi. Je ne vais pas regarder n'importe quoi.

    - Si ton code ne fonctionne pas, on peut regarder pourquoi

    - Si ton code fonctionne mais que tu penses que ce n'est pas la bonne méthode, on peut regarder mais il faut expliciter un peu



    Jc

  9. #29
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ok, ok, désolé J'étais un peu énervé hier soir

    En fait mon code ne fonctionne pas comme je voudrais, quand on joue un peu avec les touches directionnelles, au bout d'un moment, on appuis sur la touche HAUT, ou BAS, le sprite ne se déplace plus de 32 pixels, mais ne s'arrête plus du tout sauf à l'appuis de la touche GAUCHE, ou DROITE !
    (Sa ne me fait pas du tout la même chose avec la touche GAUCHE et DROITE, je ne comprends pas...)

    Ensuite, le sprite s'affiche quand même en dehors de la fenêtre en x et en y (respectivement, vers le bas et vers le haut.), alors que j'ai mis des conditions...

    Je me suis "cassé la tête" toute la soirée a chercher et je n'ai pas trouvé

    P.S : remplacez le code du fichier sprite.c de l'archive que j'ai uploadé (voir plus haut) par le code suivant :

    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
    82
    83
    84
    85
    #ifndef SPRITE_C
    #define SPRITE_C
     
    #include "sprite.h"
    #include "header.h"
     
    #endif //SPRITE_C
     
     
    /*Initialisation des coordonnées du sprite + Blitage du premier sprite*/
    void initChara(Chara *Sprite)
    {
        Sprite->Picture = IMG_Load("PICTURE/2.png");
        if(Sprite->Picture == NULL) {
            fprintf(stderr, "Erreur lors de la création de l'image MainChara.Picture : %d\n", SDL_GetError);
            exit(EXIT_FAILURE);
        }
     
        Sprite->NumberOfTileX = 4;
        Sprite->NumberOfTileY = 4;
     
        Sprite->Coord.x = WIDTH/2-Sprite->Tile.w/2;
        Sprite->Coord.y = HEIGHT/2-Sprite->Tile.h/2;
     
        Sprite->Tile.h = Sprite->Picture->h/Sprite->NumberOfTileY; //Hauteur du sprite à afficher selon la taille de l'image et du nombre de tuiles par images
        Sprite->Tile.w = Sprite->Picture->w/Sprite->NumberOfTileX; //Largeur du sprite à afficher selon la taille de l'image et du nombre de tuiles par images
        Sprite->Tile.x = 0*Sprite->Tile.w;
        Sprite->Tile.y = 0*Sprite->Tile.h;
     
        Sprite->NewCoord.x = Sprite->Coord.x;
        Sprite->NewCoord.y = Sprite->Coord.y;
        Sprite->NewCoord.w = 0;
        Sprite->NewCoord.h = 0;
    }
     
    /*Mise à jour des coordonnées du sprite + Rafraichissement de la fenêtre + Blit + Echange des buffers*/
    void moveChara(int direction, Chara *Sprite)
    {
        if((direction == UP) && (Sprite->NewCoord.y == Sprite->Coord.y)) {
            Sprite->NewCoord.y = Sprite->Coord.y - Sprite->Tile.h;
            if(Sprite->Coord.y < 0)
                Sprite->Coord.y = 0;
        }
     
        if((direction == DOWN) && (Sprite->NewCoord.y == Sprite->Coord.y)) {
            Sprite->NewCoord.y = Sprite->Coord.y + Sprite->Tile.h;
            if(Sprite->Coord.y > HEIGHT - Sprite->Tile.h)
                Sprite->Coord.y = HEIGHT - Sprite->Tile.h;
        }
     
        if(direction == RIGHT) {
            Sprite->NewCoord.x = Sprite->Coord.x + TILE;
            if(Sprite->Coord.x > WIDTH)
                Sprite->Coord.x = WIDTH - Sprite->Tile.w;
        }
     
        if(direction == LEFT) {
            Sprite->NewCoord.x = Sprite->Coord.x - TILE;
            if(Sprite->Coord.x < 0)
                Sprite->Coord.x = 0;
        }
    }
     
    void updateSprite (Chara *Sprite, int *direction)
    {
        if((direction == UP) && (Sprite->NewCoord.y != Sprite->Coord.y)) {
            Sprite->Coord.y -= 1;
        }
     
        else if((direction == DOWN) && (Sprite->NewCoord.y != Sprite->Coord.y)) {
            Sprite->Coord.y += 1;
        }
     
        else if((direction == RIGHT) && (Sprite->NewCoord.x != Sprite->Coord.x)) {
            Sprite->Coord.x += 1;
        }
     
        else if((direction == LEFT) && (Sprite->NewCoord.x != Sprite->Coord.x)) {
            Sprite->Coord.x -= 1;
        }
     
        SDL_FillRect(window, NULL, SDL_MapRGB(window->format, 0, 0, 0));
        SDL_BlitSurface(Sprite->Picture, &(Sprite->Tile), window, &(Sprite->Coord));
        SDL_Flip(window);
    }

    Finallement, t'as le droit de me dire si c'est bien ou mal codé !
    (ce que j'ai mal fait, ce que je peux améliorer surtout...)
    et j'aimerais savoir si l'inclusion d'un fichier header.h c'est bien ou non...

  10. #30
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok, commentaires sur le code :

    header.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef HEADER_H
    #define HEADER_H
     
    #define WIDTH 640
    #define HEIGHT 480
     
    #define TILE 32 //Taille d'une tuile de la map
     
    SDL_Surface *window;
    int i, j;
    #endif //HEADER_H
    Non, on ne fait pas ceci. On ne déclare pas des variables dans un .h et on ne déclare pas de variables globales nommées i ou j...

    On doit minimiser le nombre de variables globales au maximum car c'est souvent source d'erreur et de difficultés de maintenance du code.

    Si tu voulais le mettre dans un .h, il faudrait mettre en extern et le déclarer en un seul endroit. Mais je le déconseille. Tu n'as pas besoin de variable globale ici.

    Ensuite, un .h doit être indépendant, tu ne fais pas de include <SDL.h> ici car tu suppose que quelqu'un va le faire avant l'include "header.h". Ce n'est pas non plus correct. Tu dois inclure SDL.h dans header.h si tu en as besoin.

    Enfin, mettre la structure Chara ici n'est pas une bonne idée. Soit centraliser peut sembler bien mais il faut centraliser les choses en commun. Les fonctions gérant cette structure et sa définition sont généralement utilisées en même temps. Du coup, on les met ensemble.

    main.h
    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
     
    #ifndef MAIN_H
    #define MAIN_H
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "sprite.h"
    #include "header.h"
     
    #endif
     
    void initLib(void);
    void freeLib(void);
    void createWindow(void);
    Ce n'est pas non plus correct, tout doit se retrouver dans le ifndef/endif. En fait, ce n'est pas obligatoire mais cela n'a aucun intérêt de le faire comme tu le fait.

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef MAIN_C
    #define MAIN_C
     
    #include "main.h"
     
    #endif //MAIN_C
    Ceci ne sert à rien dans le cas présent. Les ifndef/define servent pour limiter la redondance de code à cause d'inclusion mais vu que t'es dans un .c, cela n'arrive pas. Du coup, c'est inutile. Cela sert par contre pour les .h


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Chara Chara;
        initChara(&Chara);
        updateSprite(&Chara, -1);
        SDL_Flip(window);
    On ne fait pas cela avant la boucle générale. Cela ne change pas grand chose mais cela ne sert à rien. Soit, l'initialisation du caractère je veux bien mais pas la mise à jour ou le flip. SURTOUT que ta mise à jour utilise une valeur -1 histoire de juste faire un SDL_FillRect, SDL_BlitSurface et un SDL_Flip du coup t'as fait deux SDL_Flip à la place d'un seul...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /*Boucle principale + événementielle*/
        int Continue = 1;
        int direction = -1;
        SDL_Event event;
    - La variable Continue est mal choisie vu que cela ressemble au mot clé continue. Utilise autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case SDL_QUIT: cont=0; break;
    Non, une seule instruction par ligne sinon cela devient vite illisible.
    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
     
                        switch(event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE: cont=0; break;
     
                            case SDLK_UP:   direction = UP;
                                            moveChara(direction, &Chara);
                                            break;
     
                            case SDLK_DOWN: direction = DOWN;
                                            moveChara(direction, &Chara);
                                            break;
     
                            case SDLK_RIGHT:direction = RIGHT;
                                            moveChara(direction, &Chara);
                                            break;
     
                            case SDLK_LEFT: direction = LEFT;
                                            moveChara(direction, &Chara);
                                            break;
                        }
    Ne jamais oublié le cas par défaut, dans mon cas, je compile avec beaucoup d'options et cela ne passe pas inappercu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if(SDL_Init(SDL_INIT_VIDEO) != 0) {
            fprintf(stderr, "Erreur lors de l'initialisation de la SDL : %d\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
    SDL_GetError retourne une chaîne de caractères donc il faut mettre %s.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if(window==NULL) {
            fprintf(stderr, "Erreur lors de la création de la fenêtre : %d\n", SDL_GetError);
            exit(EXIT_FAILURE);
        }
    Attention, tu as oublié de mettre () pour SDL_GetError.

    sprite.c

    - Même problème de ifndef/define que dans le main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void updateSprite (Chara *Sprite, int *direction)
    J'en parle ici car c'est là la définition de la fonction. Tu définis un pointeur d'entier comme deuxième paramètre mais dans le main tu passes un entier normal et dans cette fonction tu compares à un entier normal...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        SDL_FillRect(window, NULL, SDL_MapRGB(window->format, 0, 0, 0));
        SDL_BlitSurface(Sprite->Picture, &(Sprite->Tile), window, &(Sprite->Coord));
        SDL_Flip(window);
    - Pas de SDL_FillRect sur la fenêtre, et si tu voulais dessiner deux objets ?

    - Pas de SDL_Flip ici car si jamais tu veux dessiner plusieurs choses tu vas avoir un problème. Un seul SDL_Flip à la fin de la boucle du main.

    - Jamais mélanger le code de mis-à-jour et l'affichage. Dans certains cas, on voudra faire l'un et pas l'autre.

    Ensuite, regardons le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if((direction == DOWN) && (Sprite->NewCoord.y != Sprite->Coord.y)) {
            Sprite->Coord.y += 1;
        }
    Ceci suppose donc que tu es sur que Sprite->NewCoord.y >= Sprite->Coord.y...

    Regardons comment tu mets à jour NewCoord.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if((direction == DOWN) && (Sprite->NewCoord.y == Sprite->Coord.y)) {
            Sprite->NewCoord.y = Sprite->Coord.y + Sprite->Tile.h;
            if(Sprite->Coord.y > HEIGHT - Sprite->Tile.h)
                Sprite->Coord.y = HEIGHT - Sprite->Tile.h;
        }
    Donc effectivement, Tile.h >= 0 (vu le calcul qui est fait à l'initialisation).

    Mais c'est quoi ce test ? Pourquoi c'est sur Sprite->Coord.y ? C'est la destination qui peut sortir pas la position de départ ! On suppose que la position actuelle est toujours correcte.

    Enfin, c'est quoi ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sprite->NewCoord.y == Sprite->Coord.y
    Je sais que c'est pour être sûr que le mouvement se termine. Mais dans le cas où ou on change de direction horizontal/vertical, tu ne vas pas faire attention à la bonne coordonnée.

    Il faut donc faire les choses différemment.

    Autre chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Sprite->Coord.x = WIDTH/2-Sprite->Tile.w/2;
        Sprite->Coord.y = HEIGHT/2-Sprite->Tile.h/2;
    Problème ici : Tile.w, Tile.h ne sont pas initialisés. Il ne le sont qu'après.

    Si on regarde tes fonctions update et move on remarque une différence de structuration. Soit tu mets des if/else partout soit nul part. Bien sûr, dans ce cas présent, un switch serait mieux.

    - Trois de tes fonctions ont Chara* comme premier paramètre, ce serait mieux de faire de même pour moveChara, non ?

    Et enfin : pourquoi garder la direction de ton sprite dans le main ? Ajoute un champs dans la structure et utilise-là !

    En faisant tout ceci, j'ai mis à jour ton code,
    Jc

    PS: La plupart des remarques ont été guidées par le compilateur qui me disait ceci :
    In file included from main.c:4:
    main.h:6:21: error: SDL/SDL.H: No such file or directory
    main.c: In function ‘main’:
    main.c:18: warning: passing argument 2 of ‘updateSprite’ makes pointer from integer without a cast
    main.c:35: warning: enumeration value ‘SDLK_UNKNOWN’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_FIRST’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_BACKSPACE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_TAB’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_CLEAR’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RETURN’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PAUSE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_SPACE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_EXCLAIM’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_QUOTEDBL’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_HASH’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_DOLLAR’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_AMPERSAND’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_QUOTE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LEFTPAREN’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RIGHTPAREN’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_ASTERISK’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PLUS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_COMMA’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_MINUS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PERIOD’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_SLASH’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_0’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_1’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_2’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_3’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_4’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_5’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_6’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_7’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_8’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_9’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_COLON’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_SEMICOLON’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LESS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_EQUALS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_GREATER’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_QUESTION’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_AT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LEFTBRACKET’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_BACKSLASH’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RIGHTBRACKET’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_CARET’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_UNDERSCORE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_BACKQUOTE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_a’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_b’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_c’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_d’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_e’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_f’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_g’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_h’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_i’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_j’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_k’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_l’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_m’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_n’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_o’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_p’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_q’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_r’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_s’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_t’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_u’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_v’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_w’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_x’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_y’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_z’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_DELETE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_0’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_1’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_2’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_3’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_4’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_5’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_6’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_7’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_8’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_9’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_10’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_11’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_12’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_13’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_14’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_15’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_16’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_17’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_18’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_19’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_20’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_21’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_22’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_23’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_24’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_25’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_26’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_27’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_28’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_29’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_30’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_31’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_32’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_33’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_34’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_35’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_36’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_37’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_38’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_39’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_40’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_41’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_42’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_43’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_44’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_45’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_46’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_47’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_48’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_49’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_50’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_51’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_52’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_53’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_54’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_55’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_56’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_57’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_58’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_59’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_60’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_61’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_62’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_63’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_64’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_65’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_66’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_67’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_68’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_69’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_70’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_71’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_72’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_73’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_74’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_75’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_76’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_77’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_78’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_79’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_80’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_81’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_82’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_83’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_84’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_85’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_86’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_87’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_88’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_89’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_90’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_91’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_92’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_93’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_94’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_WORLD_95’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP0’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP1’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP2’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP3’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP4’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP5’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP6’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP7’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP8’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP9’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_PERIOD’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_DIVIDE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_MULTIPLY’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_MINUS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_PLUS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_ENTER’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_KP_EQUALS’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_INSERT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_HOME’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_END’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PAGEUP’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PAGEDOWN’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F1’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F2’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F3’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F4’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F5’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F6’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F7’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F8’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F9’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F10’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F11’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F12’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F13’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F14’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_F15’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_NUMLOCK’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_CAPSLOCK’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_SCROLLOCK’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RSHIFT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LSHIFT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RCTRL’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LCTRL’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RALT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LALT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RMETA’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LMETA’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LSUPER’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_RSUPER’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_MODE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_COMPOSE’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_HELP’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_PRINT’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_SYSREQ’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_BREAK’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_MENU’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_POWER’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_EURO’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_UNDO’ not handled in switch
    main.c:35: warning: enumeration value ‘SDLK_LAST’ not handled in switch
    main.c:59: warning: passing argument 2 of ‘updateSprite’ makes pointer from integer without a cast
    main.c:9: warning: unused parameter ‘argc’
    main.c:9: warning: unused parameter ‘argv’
    main.c: In function ‘initLib’:
    main.c:70: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘char *’
    main.c: In function ‘createWindow’:
    main.c:88: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘char * (*)(void)’
    In file included from sprite.c:4:
    sprite.h:6:21: error: SDL/SDL.H: No such file or directory
    sprite.c: In function ‘initChara’:
    sprite.c:15: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘char * (*)(void)’
    sprite.c: In function ‘updateSprite’:
    sprite.c:70: warning: comparison between pointer and integer
    sprite.c:74: warning: comparison between pointer and integer
    sprite.c:78: warning: comparison between pointer and integer
    make: *** [main] Error 1
    Fichiers attachés Fichiers attachés

  11. #31
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Eh ba ! Si mon compilateur m'aurait dit tout ça, j'aurais pas posté tout de suite sans réfléchir !
    Je n'ai aucun warning quand je compile ce code !


    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
     
    #ifndef MAIN_H
    #define MAIN_H
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "sprite.h"
    #include "header.h"
     
    #endif
     
    void initLib(void);
    void freeLib(void);
    void createWindow(void);
    Ce n'est pas non plus correct, tout doit se retrouver dans le ifndef/endif. En fait, ce n'est pas obligatoire mais cela n'a aucun intérêt de le faire comme tu le fait.
    Je pensais que les prototypes ne se mettaient pas dans la condition ! En tout cas c'est noté


    Ceci ne sert à rien dans le cas présent. Les ifndef/define servent pour limiter la redondance de code à cause d'inclusion mais vu que t'es dans un .c, cela n'arrive pas. Du coup, c'est inutile. Cela sert par contre pour les .h
    Ok, ok ! Là je ne savais pas trop ou il falait que j'en mette ! Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    case SDL_QUIT: cont=0; break;
    Non, une seule instruction par ligne sinon cela devient vite illisible.
    Je faisais comme ça parce que je trouvais ça plus lisible !!




    SDL_GetError retourne une chaîne de caractères donc il faut mettre %s.
    C'est ce que je me disais, mais je n'étais pas sûr !



    J'en parle ici car c'est là la définition de la fonction. Tu définis un pointeur d'entier comme deuxième paramètre mais dans le main tu passes un entier normal et dans cette fonction tu compares à un entier normal...
    Mais oui, c'est vrai !
    J'ai vraiment fais n'importe quoi !!


    - La variable Continue est mal choisie vu que cela ressemble au mot clé continue. Utilise autre chose.
    D'accord


    - Pas de SDL_FillRect sur la fenêtre, et si tu voulais dessiner deux objets ?
    Ba j'en dessine deux...Je ne vois pas trop le problème ! Je fais un SDL_FillRect sur l'écran, puis ensuite je crée les deux surfaces, je les colles et voilà !



    Mais c'est quoi ce test ? Pourquoi c'est sur Sprite->Coord.y ? C'est la destination qui peut sortir pas la position de départ ! On suppose que la position actuelle est toujours correcte.
    Bien en fait, c'est pour tester que le personnage n'est pas en train de changer de position...Mais je me rend compte que sa ne sert à rien, puisque j'apelle SDL_EnableKeyRepeat...


    Sinon, pour le fichier header.h, en fait je l'ai crée à la base parce que je n'arrivais pas à faire en sorte que la structure puisse être utilisée par les deux fichier main.c et sprite.c...
    Si tu pourrais m'aider encore une fois, sa serait sympa !

    Enfin je te remercie beaucoup pour tout ce que tu as fait pour moi !
    A l'avenir, j'esssaierais de réfléchir encore plus avant de poster
    Désolé

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Ba j'en dessine deux...Je ne vois pas trop le problème ! Je fais un SDL_FillRect sur l'écran, puis ensuite je crée les deux surfaces, je les colles et voilà !
    Ce qu'il veut dire, c'est que si tu appelle deux fois la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void updateSprite (Chara *Sprite, int *direction)
    { ...}
    avec deux Chara différent, et bien le programme va executer deux fois la commande FillRect et deux fois la commande Flip donc problème

    Sinon comme la souligné Fearyourself mélanger le code de mis-à-jour et l'affichage est une mauvaise idée : la fonction d'affichage peut-être appellée "à volonté" alors que généralement les fonctions de mis-à-jour sont cadencée. Ainsi le déplacement se fait à la même vitesse sur toutes les machines.

  13. #33
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    Eh ba ! Si mon compilateur m'aurait dit tout ça, j'aurais pas posté tout de suite sans réfléchir !
    Je n'ai aucun warning quand je compile ce code !
    Il faut ajouter les options de compilateur, j'ai mis -Wall -Wextra -O3.

    Sinon, pour le fichier header.h, en fait je l'ai crée à la base parce que je n'arrivais pas à faire en sorte que la structure puisse être utilisée par les deux fichier main.c et sprite.c...
    Si tu pourrais m'aider encore une fois, sa serait sympa !
    Regarde le code que j'ai mis dans mon précédent post.

    Jc

  14. #34
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ok, merci pour tout !
    Bon jvais fermer le sujet et aller voir quelque tutos

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/02/2009, 21h30
  2. Réponses: 4
    Dernier message: 21/11/2007, 12h19
  3. Réponses: 10
    Dernier message: 18/07/2007, 17h36
  4. Réponses: 5
    Dernier message: 05/01/2006, 18h43
  5. comment ne pas enregistrer dans le fichier log?
    Par trotters213 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 21/03/2005, 14h56

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