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

PB C++/SDL : scrolling

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 17:34:21

Bjour tlm :).
Bon, je suis en train de faire un exercice en C++ avec la librairie SDL.. le but est de scroller une map.
Le problème dans mon prog, c´est que quand je déplace la map, elle se déplace du faux sens, je peux pas la déplacer dans le bon, et je vois que du vert et non la map ( si vous avez pas compris, je donne un lien vers un zip de 200ko environ avec tous les fichiers necessaire(y compris le fichier source) à l´execution).

Voici le code source:

***

  1. include < stdio.h>
  2. include < stdlib.h>
  3. include < iostream.h>
  4. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* map;
SDL_Rect rectangle;
SDL_Event event;

int waitkey()
{
SDL_EnableKeyRepeat(1, 10);

while(1)
{
while(SDL_PollEvent(&))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_ESCAPE)
{
return 0;
}
if(event.key.keysym.sym == SDLK_UP)
{
rectangle.y++;
SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_DOWN)
{
rectangle.y--;
SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_LEFT)
{
rectangle.x++;
SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_RIGHT)
{
rectangle.x--;
SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);
}
}
}
}
}
int main(int argc, char *argv[])
{
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);
map = SDL_LoadBMP("map.bmp");

rectangle.x = 640;
rectangle.y = 480;
rectangle.w = 2000;
rectangle.h = 2000;

SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);

waitkey();

SDL_Quit();

return 0;
}

***

et voici le programme une fois compilé ( avec les fichiers necessaires à l´execution)(~200k):

***

http://conker.tonsite.biz/scrolling.zip

***

ouais bon je sais que c´est long, mais si vous pouviez jeter un coup d´oeil ça serait sympa, car j´ai beau reparcourir le programme, je vois pas ce qui cloche :/.
merci d´avance :).

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 17:37:27

PS: je précise encore qu´il se compile parfaitement, mais que le prog fait pas ce que j´aimerais ( bien scroller la map),
le zip contient le fichier compiler, la map et la . dll ( et le code source . cpp).
je précise aussi les touches ^^:
esc pour sortir, les fleches pour déplacer la map.

JeanYvesYves
JeanYvesYves
Niveau 10
29 mars 2004 à 17:49:40

C normal, tu flip qu´une seule fois

essaie de mettre :

while(1)
{
waitkey();
flip(...);
}

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 17:55:37

mais non, regardes dans mes if en haut, je flip a chaque if! je vais quand même faire ce que tu m´as dit, mais j´ai pas bien compris pourquoi je devrais remettre un flip!

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 17:55:57

Si j´ai bien compris ce que tu veux faire, tu devrais plutot écrire :

SDL_BlitSurface(map, &, screen, NULL);

En effet, il est dit dans la doc
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

Toi tu veux afficher une partie de l´image, sur tout l´ecran donc il faut changer l´ordre.

Ensuite, il faut penser a mettre rectangle.width et height à la taille de ton écran, pcq c ce qui détermine la taille de l´image a copier.

Et enfin, si l´ordre est inversé c´est pcq tu fais mal les opérations. Pour faire descendre la map, il faut augmenter la valeur y de rectangle et non la diminuer.

Et un dernier petit truc, tu répètes 4 fois les 2 meme lignes.
Tu devrais mettre le blit et le flip après tous les if qui testent les touches.

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:01:19
  • Et un dernier petit truc, tu répètes 4 fois les 2 meme lignes.

Tu devrais mettre le blit et le flip après tous les if qui testent les touches.

oui merci de me le faire remarquer :).

pour le reste, je vais essayer tout ca :).

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:08:23

j´ai remodifié comme tu me l´as conseillé i_am_the_law, mais sans succès.. la je peux carrément pas scroller.. le code actuel:

***

  1. include < stdio.h>
  2. include < stdlib.h>
  3. include < iostream.h>
  4. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* map;
SDL_Rect rectangle;
SDL_Event event;

int waitkey()
{
SDL_EnableKeyRepeat(1, 10);

while(1)
{
while(SDL_PollEvent(&))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_ESCAPE)
{
return 0;
}
if(event.key.keysym.sym == SDLK_UP)
{
rectangle.h--;
SDL_BlitSurface(map, &, screen, NULL);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_DOWN)
{
rectangle.h++;
SDL_BlitSurface(map, &, screen, NULL);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_LEFT)
{
rectangle.w--;
SDL_BlitSurface(map, &, screen, NULL);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_RIGHT)
{
rectangle.w++;
SDL_BlitSurface(map, &, screen, NULL);

SDL_Flip(screen);
}
}
}
}
}
int main(int argc, char *argv[])
{
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);
map = SDL_LoadBMP("map.bmp");

rectangle.x = 0;
rectangle.y = 0;
rectangle.w = 640;
rectangle.h = 480;

SDL_BlitSurface(map, NULL, screen, &);

SDL_Flip(screen);

waitkey();

SDL_Quit();

return 0;
}

***

:/

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:10:07

mais je vous conseille de telecharger l´exe pour voir le type de problème, parce qu´il m´a l´air bizarre.. si vous avez le temps bien sûr :>.

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:12:19

c´est normal, quand tu testes tes touches tu dois diminuer ou augmenter rectangle.y et rectangle.x

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:13:35

c´est pas tout à fait con ça, j´essaie de suite ^^

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:13:40

Si tu vois pas bien pourquoi, imagine que tu as une petite fenetre qui glisse sur ta grande image.
Sa taille ne bouge pas ( c´est la taille de ton ecran, 640*480) et c´est sa position qui varie.
La position c´est x et y ( le coin superieur gauche du rectangle).

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:18:01

oui, mais j´ai beau la faire varié, ca bouge pas ou ca bouge dans le faux sens ( en prenant compte que x et y sont le coin inférieur droite!!).
je reessaie un truc, mais ca n´a pas l´air marcher.

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:19:22

voici le code, ca devrait être censé marcher pourtant!

***

  1. include < stdio.h>
  2. include < stdlib.h>
  3. include < iostream.h>
  4. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* map;
SDL_Rect rectangle;
SDL_Event event;

int waitkey()
{
SDL_EnableKeyRepeat(1, 10);

while(1)
{
while(SDL_PollEvent(&))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_ESCAPE)
{
return 0;
}
if(event.key.keysym.sym == SDLK_UP)
{
rectangle.y--;
SDL_BlitSurface(map, &, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_DOWN)
{
rectangle.y++;
SDL_BlitSurface(map, &, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_LEFT)
{
rectangle.x--;
SDL_BlitSurface(map, &, screen, &);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_RIGHT)
{
rectangle.x++;
SDL_BlitSurface(map, &, screen, &);

SDL_Flip(screen);
}
}
}
}
}
int main(int argc, char *argv[])
{
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);
map = SDL_LoadBMP("map.bmp");

rectangle.x = 0;
rectangle.y = 0;
rectangle.w = 640;
rectangle.h = 480;

SDL_BlitSurface(map, &, screen, &);

SDL_Flip(screen);

waitkey();

SDL_Quit();

return 0;
}

***

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:25:17

Il faut mettre NULL dans le 4eme parametre du blit, pcq tu veux afficher le rectangle source dans tout l´ecran.

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:27:45

les parametres étant à rectangle.x et rectangle.y sont à 0, donc mettre NULL reviendrait au même, non ?
sinon, même en mettant NULL, ca ne change pas mon pb.. :(

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:28:10

au debut x et y valent 0
si par ex tu appuie sur la touche de droite, x passe a 1.
Donc ce que tu demandais c´est afficher le rectangle(1,0,640,480) a l´ecran, dans la fenetre(1,0). Comme l´ecran n´etait pas efface, ca reecrivais par dessus, et tu n´avais pas de scrolling vu que tu reecrivais la meme image.
Pour avoir du scrolling il faut que le rectangle ( 1,0,640,480) soit affiche a partir de ( 0,0)

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:29:01

si ca change, pcq x et y varient a chq appuie sur une touche, faut bien mettre null. Et t´as pense a les changer partout dans tes if?

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:29:06

ah merde j´ai parlé trop vite je m´en excuse ^^.
en effet, j´ai mis null et tout va, moi qui croyais que c´était pareil de mettre x et y à zero :o.
merci beaucoup :).

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:34:21

un dernier petit truc, je sais pas comment sdl gere ses rectangles lors des blits mais il faut que tu testes si x>0 et x<2000-640
et si y>0 et y<2000-480
si c´est pas le cas, tu les mets a 0 ou 2000-XXX
sinon le rectangle sortira de ton image et je sais pas ce qui risque de se passer.

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 18:37:50

oui merci j´y penserai à l´avenir :). mais c´était " qu"´un exercice ( qui m´a permis de comprendre beaucoup de chose :)).
sinon une dernière ( enfin je pense lol) question:
SDL_EnableKeyRepeat(1, 10);

il est marqué dans la doc que pour augmenter la vitesse, il faut baisser le dernier nombre ( soit ici " 10"), or quand je le mets à 1, la vitesse ne semble pas changer, et je ne peux pas aller plus bas car je ne crois pas qu´il accepte les codes decimaux ( float). qqun peut m´aider ?

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