CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++/SDL] questions sur pong

sonic66
sonic66
Niveau 10
19 août 2005 à 11:13:15

Voila , j´etudie sdl en ce moment et je veut faire un pong , a partir du premeir tuto ( et pour le fun lol) j´ai realisé une raqutte qui bouge de haut en bas quand on appuis sur up et down , mais trois probleme s´imposent:

quand je le deplace , le pong clignote

le pong peut aller au dela de l´ecran ^^ ( je n´ai pas mit de decros , seulement le pong)

et ca rame ( si j´augmente le nombre de pixel bah ca fait trop sacaddé et on a quand meme l´impression qu´il rame)

comment arranger cela?

( voici mon code ps: je sais qu´il na pas encore de fonction pour sortir ^^ ( d´ou le while))

http://rafb.net/paste/results/nALq3h44.html

sonic66
sonic66
Niveau 10
19 août 2005 à 11:20:56

a oui , ca clignote tout le temps en fait , pas que quand on bouge mais tt le temps

sonic66
sonic66
Niveau 10
19 août 2005 à 11:22:17

( mais bon , ca bougge! :snif:

JeanYvesYves
JeanYvesYves
Niveau 10
19 août 2005 à 11:40:11

euh ? t´es au courant que tu mets ton init() dans ta boucle principale ?

sors moi ça de la ! :-)

sonic66
sonic66
Niveau 10
19 août 2005 à 11:52:53
  1. include < SDL/sdl.h>

SDL_Surface* img1;
SDL_Surface* img2;
SDL_Surface* img3;
SDL_Surface* img4;
SDL_Event event;
int d=0;

void init()
{
SDL_Init(SDL_INIT_VIDEO);
img1=SDL_SetVideoMode( 1024, 768, 32, SDL_FULLSCREEN|SDL_HWSURFACE|SDL_DOUBLEBUF);
img3=SDL_SetVideoMode( 1024, 768, 32, SDL_FULLSCREEN|SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_ShowCursor(0);
}

void bouger()
{
while(1)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_DOWN)
{
d=d+3;
return;
}
if(event.key.keysym.sym == SDLK_UP)
{
d=d-3;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
{
return;
}

}
}
}
}

int main(int argc, char *argv[])
{
init();
SDL_Rect carrer;
img4 = SDL_LoadBMP("decors.bmp");
carrer.x=0;
carrer.y=0;
carrer.w=1024;
carrer.h=768;
SDL_BlitSurface(img4 , NULL , img3 , &carrer);
SDL_Flip(img3);
SDL_Rect carre;
while(event.key.keysym.sym ! = SDLK_RETURN)
{
img2 = SDL_LoadBMP("pong.bmp");
carre.x=0;
carre.y=d;
carre.w=1024;
carre.h=768;
SDL_BlitSurface(img2 , NULL , img1 , &carre);
SDL_Flip(img1);
bouger();
}
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}

regarde ce bug! quand jappuis sur une direction , le decors caffiche , quand je reappuie , c le pong , et vice versa!

sonic66
sonic66
Niveau 10
19 août 2005 à 12:02:32

jyy ; , comment on efface l´ecran ensuite? car ca efface pas ce qui reste affiché resultat quand jappuie sur bas , on a l´impression que le pong setire

JeanYvesYves
JeanYvesYves
Niveau 10
19 août 2005 à 12:11:43

Attends, sur ce coup, il y a du relachement :
- tu appelles 2 fois setvideomode dans ton init.
- tu appelles un LoadBMP dans la boucle principale
- tu n´appelles qu´un seul blit dans la boucle principale alors que tu veux afficher 2 trucs.

Rikkuman4
Rikkuman4
Niveau 10
19 août 2005 à 12:17:03

as tu par hasard pensé à faire des limites ? pour pas que ton image ce barre de l´écrant ?

Rikkuman4
Rikkuman4
Niveau 10
19 août 2005 à 12:22:22

et dis moi, je suis pas un pros en SDL je débute aussi mais quesque sa vien faire dedans le D ?

-----------------------------
carre.y=d;
-----------------------------

img2 = SDL_LoadBMP("pong.bmp");
carre.x=0;
-----------------------------
carre.y=d;
-----------------------------
carre.w=1024;
carre.h=768;

Vengeur41
Vengeur41
Niveau 10
19 août 2005 à 12:48:51

Déjà n´oublie pas le
SDL_FillRect(img1 / *ce nom est mal choisi*/, NULL, 0);

Ensuite, le SDL_LoadBMP n´a rien à faire dans cette boucle, tu le met dans init().

SDL_Rect carer; / * Keske c´est que ca ? Inutile, tu le vire. 1 seul rect dans tout le programme et necessaire, pas besoin de 2 ou 3.*/

SDL_Surface *img4; / * Donner un nom plus expressif. On la charge dans init.*/

SDL_Surface* img1;
SDL_Surface* img2;
SDL_Surface* img3;
SDL_Surface* img4;
/ * Ca se regroupe ca :
SDL_Surface* img1, img2, img3, img4;
Ou mieux, SDL_Surface *imgs[4]; et après tu modifie ton code en conséquence*/

img3 c´est une deuxième fenetre ou quoi ? C´est pas clair du tout ton truc. 1 seule surface primaire suffit. Bref code à revoir. Corrige déjà tout ca et dis nous pourquoui t´as 2 surfaces primaires, 2 rects etc.

Bonne chance !

Vengeur41
Vengeur41
Niveau 10
19 août 2005 à 12:51:31

Rikkuman4 > Le d c´est l´ordonnée du graphisme qui sera blitté aux coordonées du carre.

Sinon Sonic66, donne des vrais noms à tes surfaces et ne fait qu´un rect dans tout le programme si tu prends toujours toute l´image ou 2 rects si tu prends qu´un bout de la surface à blitter ( sauf si ton programme est multi-thread).
Et ce avec des vrais nom exemple :

SDL_Rect rcsrc, rcdst; / *=Rectanglesource, Rectangledestination*.

sonic66
sonic66
Niveau 10
19 août 2005 à 12:54:43

ok , et pour le code , je vais le revoir ouais ^^
en fait , je voulait afficher deux images a la fois , et je ne savais pas comment faire ( avec le premier tuto seulement que j´ai fais ca donc....)

Vengeur41
Vengeur41
Niveau 10
19 août 2005 à 12:59:34

Ben img3 tu l´enlève.
L´img1 reste alors la surface primaire.
En fait pour afficher les 2 images en meme temps, tu les affiche les une après les autres mais le joueur n´y voit rien.

Le principe du blit puis du flip, c´est que tu dessine d´abord la raquette1 puis la raquette2 sur img1 puis avec le flip, img1 s´affiche a l´écran.
Normal que le joueur ne voit rien donc puisque quand il n´ya que la raquette1 l´ecran correspond à la frame précédante.
Comparaison à un dessinateur de bande dessinée: il dessine sa BD et elle n´apparait que quand elle est terminée.

sonic66
sonic66
Niveau 10
19 août 2005 à 13:08:31

deja , j´ai enlever les 2 autres image pour m´attaquer a un autre probleme : le pong , grace a vous , ca ne clignote plus , mais quand on laisse appuyée la touche bas ou haut , bas le pong ce deplace une fois , et..... c´est tout :-(

  1. include < SDL/sdl.h>

SDL_Surface* imgpong1;
SDL_Surface* imgpong2;
SDL_Event event;
int vit=0;

void init() / *Pour initialiser SDL*/
{
SDL_Init(SDL_INIT_VIDEO);
imgpong1=SDL_SetVideoMode( 1024, 768, 32, SDL_FULLSCREEN|SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_ShowCursor(0);
}

void bouger() / *Pour controler les touches*/
{
while(1)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_DOWN)
{
vit=vit+4;
return;
}
if(event.key.keysym.sym == SDLK_UP)
{
vit=vit-4;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
{
return;
}

}
}
}
}

int main(int argc, char *argv[])
{
init();
SDL_Rect rectangle;
imgpong2 = SDL_LoadBMP("pong.bmp");
init();
while(event.key.keysym.sym ! = SDLK_RETURN)
{
SDL_FillRect(imgpong1 , NULL, 0); / * que veut dire cette instruction au fait?*/
rectangle.x=0;
rectangle.y=vit;
rectangle.w=1024;
rectangle.h=768;
SDL_BlitSurface(imgpong2 , NULL , imgpong1 , &rectangle);
SDL_Flip(imgpong1);
bouger();
}
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}

sonic66
sonic66
Niveau 10
19 août 2005 à 13:16:55

En fait , je construit deux rectangles pour les images et tout et tout , mais je les stoke dans la meme surface? je teste

sonic66
sonic66
Niveau 10
19 août 2005 à 13:18:30

a non , je garde un seul rect

sonic66
sonic66
Niveau 10
19 août 2005 à 13:19:40

houla , j´ai mal compris comment faire pour mettre deux images en meme temps ( le pong et le decors) , vrament pas compris :-(

Vengeur41
Vengeur41
Niveau 10
19 août 2005 à 13:25:30

Le fill_rect signifie : " on remplit l´ecran de noir".
C´est quoi la surface que tu veut mettre en image de fond ?

sonic66
sonic66
Niveau 10
19 août 2005 à 13:27:38

bah en fait , je veut mettre une image au fond , et c´est pour cela que j´avais créé les surfaces img3 et 4 , pour mettre une autre image

mais la , j´ai refait le code sans img3 4 et tout et j´aimerais pouvoir mettre mon image de ofnd , mais comment? ( en pus du pong hein? ^^)

Vengeur41
Vengeur41
Niveau 10
19 août 2005 à 13:34:07

Eh bien tu charges ton image de fond dans img3 ( par exemple) , tu la blit avec le SDL_Rect rectangle juste après le SDL_FillRect
(rectangle.x=0;rectangle.y=0;SDL_BlitSurface(...))
et après tu blit les autres images dans l´ordre que tu veux les afficher ( la première image blittée sera derrière la dernière) puis tu flip une fois que t´as tout blitté !

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment