Bien bonjour à tous et à toutes tout d'abord
Je suis sous windows, j'ai CodeBlocks comme IDE et je code en C uniquement.
Je suis actuellement en train d'apprendre la SDL depuis disons 3 semaines ou un peu plus...(je ne me souviens plus très bien)
J'ai donc 2 petits problèmes avec la SDL dont je n'arrive pas à trouver les solutions tout seul...
Le premier problème est le suivant :
Lorsque j'appuis sur la touche ECHAP (que j'ai configurer comme étant une touche servant à fermer la fenêtre) ou que je clique sur la croix en haut à droite, il me faut le faire plusieurs fois avant que la fenêtre ne se ferme...
Au début, croyant que c'était un lag, j'ai laissé passé, mais en fait sa n'en ai pas un![]()
Le deuxième problème est celui-ci :
Mon programme sert à déplacer un personnage. L'affichage du sprite se fait dans la fonction principale et le déplacement du personnage (avec la mise à jour de l'écran, etc...) se fait dans la fonction que j'ai appellée "mouvemen.c"
Je met les prototypes des fonctions dans un fichier header à part que j'ajoute à un fichier header pour la fonction "main".
Mais lorsque j'appuis sur la touche qui sert à déplacer mon personnage, cela affiche comme prévue une image 32 pixel plus bas (puisque la touche est la flèche bas du clavier et que le quadrillage a des carreaux de 32X32 px), mais l'image n'est pas effacée alors que j'ai remplacée l'image précédente par un carreau noir(la couleur de fond est le noir);
puis ensuite lorsque je réappuis sur la touche bas, il ne se passe plus rien
En résumé, j'appuis une fois sur la touche bas, le sprite est réaffiché 32 pixel plus bas, mais l'image précédente du sprite ne s'affiche pas, et lorsque j'appuis une deuxième fois sur la touche bas, il ne se passe rien !
Voici donc mes fichiers (je met uniquement les fichiers sources, sachant que les headers ne servent pas vraiment à quelque chose dans ce cas précis) :
main.c :
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
86
87
88
89
90
91 //============================================================================== //{Directives de préprocesseur : //{Include : #include <stdlib.h>//Chargement de la bibliothèque standard stdlib.h #include <stdio.h>//Chargement de la bibliothèque standard stdio.h #include <SDL/SDL.h>//Chargement de la bibliothèque de la SDL #include <SDL/SDL_image.h>//Chargement de la bibliothèques pour gérer plusieurs types d'images en SDL # include "sdl_main.h"//Chargement des protoypes des fonctions du jeu //} //------------------------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------------------------ //{Defines : #define LONGUEUR_FENETRE 640 //On définit la largeur de la fenêtre #define HAUTEUR_FENETRE 480 //On définit la longueur de la fenêtre #define RESOLUTION 32//Ici, le type de résolution (couleurs par pixels) #define TITRE_DE_LA_FENETRE "Yggdrasil"//Titre de la fenêtre //} //} //============================================================================== //============================================================================== int main(int argc, char *argv[]) {//Début de la fonction principale //Déclaration des variables et pointeurs et assignement de valeurs SDL_Surface *ecran = NULL; //Initialisation de la SDL SDL_Init(SDL_INIT_VIDEO); //Création d'une fenêtre sur la variable ecran ecran = SDL_SetVideoMode(LONGUEUR_FENETRE, HAUTEUR_FENETRE, RESOLUTION, SDL_HWSURFACE | SDL_DOUBLEBUF); //Titre (il faut le mettre juste après la création de la fenêtre) SDL_WM_SetCaption(TITRE_DE_LA_FENETRE, NULL); //Création des surfaces SDL_Surface *personnage_principal = NULL; personnage_principal = IMG_Load("images/personnages/héros/hero1_bas1.png"); //Mise à jour de l'écran SDL_Flip(ecran); //Mise en pause en attendant les événements //{------------------------------------------------------------------------------------ //Déclaration des variables int continuer = 1; SDL_Event event; //Boucle pour la pause while (continuer) { //--------------------------------------------------------- //Gestion de la fermeture de la fenêtre SDL_WaitEvent(&event); switch(event.type) {//début du switch case SDL_QUIT: continuer = 0; break; case SDL_KEYDOWN: switch (event.key.keysym.sym) {//début du switch case SDLK_ESCAPE: continuer = 0; break; }//Fin du switch break; }//Fin du switch //--------------------------------------------------------- //--------------------------------------------------------- //Gestion des mouvements du personnage et affichage de son sprite mouvement(ecran, personnage_principal); //--------------------------------------------------------- } //}------------------------------------------------------------------------------------ //Libération de la mémoire des surfaces SDL_FreeSurface(ecran); //Libération de la mémoire des systèmes de la SDL SDL_Quit(); //Renvois de la valeur 0 return EXIT_SUCCESS; }//Fin de la fonction principale //==============================================================================
mouvement.c :
Je remercie d'avance tout ceux qui prêteront attention à ce sujet
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 //{==================================================================== //Includes et defines #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <SDL/SDL_timer.h> //}==================================================================== //==================================================================== void mouvement(SDL_Surface *ecran, SDL_Surface *personnage) {//Début de la fonction //Déclaration des variables et pointeurs et assignement des valeurs SDL_Event event; SDL_Rect coordonnees_personnage_principal; //Enumérations typedef enum direction direction; enum direction {//Début de l'énumération direction HAUT = 1, BAS = 2, GAUCHE = 3, DROITE = 4 }; //Fin de l'énumération direction //SDL_EnableKeyRepeat(10, 10);//répétition de la touche enfoncée SDL_WaitEvent(&event); switch(event.type) {//début du switch case SDL_KEYDOWN: switch (event.key.keysym.sym) {//Début du switch case SDLK_UP: break; case SDLK_DOWN: coordonnees_personnage_principal.y =coordonnees_personnage_principal.y + 32; break; case SDLK_RIGHT: break; case SDLK_LEFT: break; }//Fin du switch break; }//Fin du switch //Bliltage des surfaces SDL_BlitSurface(personnage, NULL, ecran, &coordonnees_personnage_principal); //On efface la surface que l'on veut bouger SDL_FillRect(personnage, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); //Mise à jour de l'écran SDL_Flip(ecran); }//Fin de la fonction //====================================================================![]()
Partager