Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Jeux en Sdl

14 réponses
Avatar
midtownmadnes52
BOnjour,
Je suis entrain d'essayer de faire un Juez sous win avec la SDL. J'ai
quelques difficulté de logique pour la SDL. Mon probleme c'est mon
personnage qui ce déplace pas. ET j'aimerais que vous examiner le code
suivant et apporter des amilioration si besoins s.v.p


/////////////////////////
//* Include Lib //
////////////////////////
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>


//////////////////////////////////////
//* Variable global et pointeur //
/////////////////////////////////////
int EXIT = 0; //Controle la fin du programme
int show; //Étape du jeux en cours
int mouseX, mouseY; //Variables de souris
int x;
int y;
int s;
SDL_Surface* screen;

SDL_Surface* fond;
SDL_Surface* perso;
SDL_Rect fond1, perso1;




///////////////////////////////////
//* Déclaration des fonction //
//////////////////////////////////
void init_sdl(void);
void LoadImage();
void game(void);
void Rect ();



//##################################################################//
//## Bloque principal ##//
//##################################################################/
int main(int argc, char *argv[])
{
init_sdl();

SDL_GetMouseState(&mouseX, &mouseY);



while (!EXIT)
{
SDL_Event event;
SDL_WaitEvent(&event);



switch (event.type) {
//Touche pressée
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
SDL_FreeSurface(screen);
EXIT=1;
break;

case SDLK_LEFT:

fond1.x = +10;
fond1.y = fond1.y;
fond1.w = fond1.w;
fond1.h = fond1.h;

SDL_BlitSurface(fond,NULL,screen,&fond1); // colle
l'image sur l'écran, a la position rect1, donc surtout a x pour la
coordonnée x.
SDL_Flip(screen); // affiche la prochaine fr

break;

case SDLK_RIGHT:
SDL_FreeSurface(screen);
//persox=persox - 10;
break;

case SDLK_UP:
SDL_FreeSurface(screen);
//persoy = persoy + 10;
SDL_UpdateRect(screen, 0, 0, 0, 0);

break;

case SDLK_DOWN:
SDL_FreeSurface(screen);
//persoy = persoy - 10;
break;

case SDLK_RETURN:
//show=2;
break;


default:break;
}
break;
case SDL_MOUSEMOTION:

break;
//exit
case SDL_QUIT:
EXIT=1;
break;
}
game();
}//fin boucle while

}



//##################################################################//
//## Function : Rect ##//
//##################################################################//
SDL_Rect Rect(int x,int y,int w,int h) // pour faire un rectangle
plus vite
{
SDL_Rect r;
r.x=x;
r.y=y;
r.w=w;
r.h=h;
return r;
}

//##################################################################//
//## Function Sdl_init ##//
//##################################################################/
void init_sdl()
{

//Init a la sdl
if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Impossible d'initialiser SDL: %s\n",
SDL_GetError());
exit(1);
}
//quitter proprement
atexit(SDL_Quit);

//Création de la fenetre sdl
screen = SDL_SetVideoMode(800, 600, 32,
SDL_SWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
if ( screen == NULL ) {
fprintf(stderr, "Impossible de crée la fenetre de jeux: %s\n",
SDL_GetError());
exit(1);
}

//titre de la fenetre sdl
SDL_WM_SetCaption ("test", NULL);


}

//##################################################################//
//## Function : Loadimage ##//
//##################################################################//
SDL_Surface* LoadImage(char* fichier,int vram=1) // 3e forme
{
SDL_Surface* f = IMG_Load(fichier); // charge l'image dans f en RAM
SDL_Surface* r=NULL;
if (vram)
r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0,
0);// cree une image en VRAM
if (r==NULL) vram=0; // Si plus de place en VRAM, alors r= NULL.
if (!vram)
r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
// cree une image en VRAM
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,r,&R); // copie l'image f de la RAM vers
firstscreen en VRAM
SDL_FreeSurface(f); // supprime la surface f : inutile
maintenant --> libere la mémoire
return r;
}


//##################################################################//
//## Function : Game ##//
//##################################################################//
void game(void) {

switch (show)
{
//exit
case(1):
EXIT=1;
break;

//Menu
default:

SDL_Rect fond1, perso1;

//Affiche le fond
fond1.x = 0;
fond1.y = 0;
fond1.w = 1024;
fond1.h = 768;

//affiche le perso
perso1.x = 400;
perso1.y = 300;
perso1.w = 1024;
perso1.h = 768;

SDL_Surface* fond;
SDL_Surface* perso;

fond = LoadImage("./IMG/menu/menu.jpg");
perso = LoadImage("./IMG/menu/perso.jpg");

SDL_BlitSurface(fond,NULL,screen,&fond1); // colle l'image sur
l'écran, NULL car on affiche TOUTE l'image
SDL_BlitSurface(perso,NULL,screen,&perso1);
SDL_Flip(screen);


break;
}


}

10 réponses

1 2
Avatar
cedric
Tommy Jean wrote:
BOnjour,
Je suis entrain d'essayer de faire un Juez sous win avec la SDL. J'ai
quelques difficulté de logique pour la SDL. Mon probleme c'est mon
personnage qui ce déplace pas. ET j'aimerais que vous examiner le code
suivant et apporter des amilioration si besoins s.v.p


Mais avec plaisir !
Justement, le soir quand je rentre chez moi après avoir passé la journée
à obéir à mon boss, je ressent le besoin de continuer de travailler
servilement pour des inconnus sur internet. C'est ce qui motive, je
crois, tous les lecteurs assidus de ce news-group, et c'est pourquoi
nous t'invitons à poster sans retenue toute autre requête, exos d'école
ou cahier des charges.

Merci !

Maintenant, place à ton beau programme :

//////////////////////////////////////
//* Variable global et pointeur //
/////////////////////////////////////


Ici, il manque un 'e' à "global".

int mouseX, mouseY; //Variables de souris


Ici, le commentaire, vif et précis, mériterait de rentrer davantage dans
le détail pour aider les novices : par exemple, est-ce que c'est mouseX
la coordonnée X, ou bien mouseY ?

///////////////////////////////////
//* Déclaration des fonction //
//////////////////////////////////


Pour être portable, il faudrait un 's' à fonction.

//##################################################################//
//## Bloque principal ##//
//##################################################################/


Que dire ?
Félicitation pour le style shello-gotique de ce commentaire.

//persox=persox - 10;
//persoy = persoy + 10;
//persoy = persoy - 10;


J'ai trouvé pourquoi le sprite ne bouge pas :
Il faut enlever les "//" en début de ligne !

Avatar
Stephane Legras-Decussy
Tommy Jean a écrit dans le message :

#include <iostream>


ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)

Avatar
cedric
Stephane Legras-Decussy wrote:
ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)


Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...

Avatar
screetch
cedric wrote:
Stephane Legras-Decussy wrote:

ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)



Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...


#include <iostream>



Avatar
screetch
screetch wrote:
cedric wrote:

Stephane Legras-Decussy wrote:

ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)




Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...


#include <iostream>

j'ajouterai aussi : les commentaires //

apres avoir scanné tres rapidement le code, il me semble que ces trucs
la sont pas indispensables, donc c'est du quasi-C (aka Crade-C)



Avatar
midtownmadnes52
cedric wrote in message news:<422cf63f$0$16318$...
Stephane Legras-Decussy wrote:
ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)


Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...


Je vous remerci. Mon projet est en c et non c++, mon projet est
compiler en c et non c++. Les commentaire je sais les // car jai
voulue faire un test et jai pas passencer de les remettre. SI non meme
enlever les commentaires ne fonctionne pas. C'est ma premiere
aplication sdl, Je me tente lol. Pis pour les commentaires, c'est que
je suis habituer en Perl alors je met des # aulieu de //---- :P

Pis c'est tu moi ou c'est long quand on poste un message avant de le
voir afficher?.


Avatar
Antoine Leca
En , Tommy Jean va escriure:
:P


Sur Usenet cela signifie que tu lui tires la langue.
Si cela te fait rire essaye plutôt :-D


Pis c'est tu moi ou c'est long quand on poste un message avant de le
voir afficher?.


On est pas sur un forum en direct (chat).

Tu postes un message, celui-ci est diffusé sur l'ensemble des serveurs du
monde entier, simultanément. Et vice-versa, évidemment. Tes messages sont
stockés sur ton serveur à toi, qui le resservira à ton client, à la
prochaine fois qu'il sera rafraîchi (fréquence paramétrable, toutes les 10
minutes par exemple). Le délai est donc en principe court sur ton serveur.

Par contre, pour ceux qui viennent d'autres serveurs, il faut attendre que
le message soit passé à ton serveur. Un délai d'une heure est considéré
comme parfaitement anodin (voire rapide). Je vois souvent arriver des
messages qui sont agés de plus d'une journée; et il faut faire avec.


Si tu me permets un conseil, tu devrais faire un petit effort et te relire
rapidement avant d'envoyer un message; comme de toutes manières tu n'auras
pas de réponses dans le quart d'heure, tu n'es pas à une minute près,
n'est-ce-pas? Et je pense que cela va faire gagner du temps à beaucoup de
tes milliers de lecteurs.


Antoine

Avatar
Thomas Labourdette
Tommy Jean a écrit le Mardi 08 Mars 2005 15:49 :

cedric wrote in message
news:<422cf63f$0$16318$...
Stephane Legras-Decussy wrote:
ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)


Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...


Je vous remerci. Mon projet est en c et non c++, mon projet est
compiler en c et non c++.


Ça m'étonnerait qu'avec "#include <iostream>", ça compile en C.

@+
--
Ilse ENBALAICOUILLES (signature aléatoire)
AUTOBUS : Véhicule qui roule deux fois plus vite quand on court après
que lorsqu'on est dedans.



Avatar
Targeur fou
Thomas Labourdette wrote:
Tommy Jean a écrit le Mardi 08 Mars 2005 15:49 :

cedric wrote in message
news:<422cf63f$0$16318$...
Stephane Legras-Decussy wrote:
ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)


Qu'est ce qui vous fait croire que c'est davantage du C++ que du C
?




J'ai du passer à coté...


Je vous remerci. Mon projet est en c et non c++, mon projet est
compiler en c et non c++.


Ça m'étonnerait qu'avec "#include <iostream>", ça compile en C.


Sans oublier aussi la valeur par défaut donnée au paramètre vram :
"SDL_Surface* LoadImage(char* fichier,int vram=1) {..."

Regis




Avatar
midtownmadnes52
Thomas Labourdette wrote in message news:...
Tommy Jean a écrit le Mardi 08 Mars 2005 15:49 :

cedric wrote in message
news:<422cf63f$0$16318$...
Stephane Legras-Decussy wrote:
ce programme n'est pas du C... voir un groupe C++ qui va adorer
corriger ce code... :-)


Qu'est ce qui vous fait croire que c'est davantage du C++ que du C ?

J'ai du passer à coté...


Je vous remerci. Mon projet est en c et non c++, mon projet est
compiler en c et non c++.


Ça m'étonnerait qu'avec "#include <iostream>", ça compile en C.

@+



Merci c'est en c/c++ jutulsie les 2 avraie dire. Bon j'ai reglé mon
probleme mais j'ai un autre probleme.

J'ai un fichier video.c
---------------------------
//----------------------------------------------------------------//
// SDL_Rect Rect(void) //
//----------------------------------------------------------------//
SDL_Rect Rect(int x,int y,int w,int h) // pour faire un rectangle
plus vite
{
SDL_Rect r;
r.x=x;
r.y=y;
r.w=w;
r.h=h;
return r;
}

//----------------------------------------------------------------//
// Load_Image(char img, int vram) //
//----------------------------------------------------------------//

SDL_Surface* LoadImage(char* fichier,int vram=1) // 3e forme
{
SDL_Surface* f = IMG_Load(fichier); // charge l'image dans f en RAM
SDL_Surface* r=NULL;
if (vram)
r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0,
0);// cree une image en VRAM
if (r==NULL) vram=0; // Si plus de place en VRAM, alors r= NULL.
if (!vram)
r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
// cree une image en VRAM
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,r,&R); // copie l'image f de la RAM vers
firstscreen en VRAM
SDL_FreeSurface(f); // supprime la surface f : inutile
maintenant --> libere la mémoire
return r;
}



Un autre fichier main.c -> Fichier non complet
----------------------

//----------------------------------------------------------------//
// wiewmenu(void) //
//----------------------------------------------------------------//
void viewmenu(void)
{
extern SDL_Surface* presentation; //surface prsentation
SDL_Rect presentation1; //rectangle de dessin presentation

presentation = LoadImage("./IMG/presentation.jpg",1);
SDL_BlitSurface(presentation,NULL,screen,&presentation1);
SDL_Flip(screen);
}


et mon probleme est lors de lapelle de LoadImage. SI je la met dans le
meme fichier que video.c je n'est pas de probleme. mais si je la met
dans main j'ai l'erreur "no matching function call to
'LoadImageA(const char [23]'"

Merci de votre aide

Je suis expétimenté en perl, mais en c je débute.




1 2