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 à 18:43:34

bon oui la fonction fonctionne, je vois très bien la difference en remplacant 1 par 1000.. mais si je suis à 1 et que je trouve que la vitesse de repetition n´est pas encore assez rapide, comment faire pour aller plus bas ?

i_am_the_law
i_am_the_law
Niveau 6
29 mars 2004 à 18:53:32

ca augmentera pas la vitesse du scrolling de modifier ces valeurs. La seul chose qui changera, c´est que l´evenement " touche enfoncee" sera cree plus souvent. Donc ton scrolling bougera un peu + vite.
Si tu ne vois pas de difference entre 10 et 1 c´est normal.
A 1à ca veut dire 10ms d´ecrat. Ca fait en gros 100 appels par secondes.
Si une touche est pressee, tu fais un flip. Le flip est synchronise avec le balayage vertical ( pour eviter les effets de clignotements). Et donc, tu peux faire un nombre limité de flip par secondes. Y´a de fortes chances que ca soit 60Hz si t´as pas touche a la config des modes d´affichages. Donc tu ne peux pas faire plus de 60flip par secondes. Donc je pense que toutes valeur plus petite que 16 ( 1/60) ne change rien :)

Si tu veux une difference, soit tu sors le blit et le flip de ton while(event) ( je suis pas sur que ca marche, je sais pas comment sdl gere ses evenements, et s´il rend la main apres le flip ou s´il bloque ton prog). Mais le principe de cette methode c´est que ton prog passe par ex 3 fois dans l´evenement key_down, depuis le dernier flip et donc tu feras descendre ton ecran de 3 pixel entre chaque.

Sinon plus simplement, tu fais varier x et y d´une autre valeur
( 2,3,4...etc)

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

je vais opter pour le dernier exemple merci :).

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 20:14:46

hep les gars, encore une question :).
je veux coller un gars sur ma map que je peux " scroller", je veux le coller en haut a gauche ( coordonnées 0,0) et quand je scroll, qu´il reste en haut a gauche DE LA MAP, car quand je scroll, il reste en haut a gauche de l´écran et non en haut a gauche de la map, vous suivez? comment je pourrais faire ca plz ?

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 21:19:59

bon comme je pense que c´était pas très claire, je reformule ma question:

j´ai créé un mini prog via la à l´aide de la SDL qui permet de " scroller" une sorte de map.
c´est un exercice que je fais pour me permettre de comprendre certaines fonctions par la suite, et j´aimerais pouvoir coller un ptit bonhomme en haut a gauche de la MAP. le problème, c´est que le bonhomme n´est pas en haut a gauche de la map, il est carrément en haut a gauche de l´écran, ce qui fait que quand je scroll, le ptit bonhomme reste en haut a gauche de l´écran au lieu de disparaitre ( rester en haut a gauche de la MAP), vous suivez? ^^
je sais pas si c´est très claire, mais voici le code:

***

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

SDL_Surface* screen;
SDL_Surface* map;
SDL_Surface* perso;
SDL_Rect rectangle_map;
SDL_Rect rectangle_perso;
SDL_Event event;

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

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_map.y = rectangle_map.y - 10;
SDL_BlitSurface(map, &_map, screen, NULL);

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

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

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

SDL_Flip(screen);
}
}
}
}
}
int main(int argc, char *argv[])
{

SDL_Init(SDL_INIT_VIDEO);

screen = SDL_SetVideoMode(1024, 768, 32, SDL_DOUBLEBUF|SDL_HWSURFACE|SDL_FULLSCREEN);
map = SDL_LoadBMP("map.bmp");
perso = SDL_LoadBMP("perso.bmp");

rectangle_map.x = 0;
rectangle_map.y = 0;
rectangle_map.h = 768;
rectangle_map.w = 1024;
rectangle_perso.x = 0;
rectangle_perso.y = 0;
rectangle_perso.h = 32;
rectangle_perso.w = 32;

SDL_BlitSurface(map, &_map, screen, &_map);
SDL_SetColorKey(perso, SDL_SRCCOLORKEY, SDL_MapRGB(perso->format,0,0,255));
SDL_BlitSurface(perso, NULL, screen, &_perso);
SDL_Flip(screen);

waitkey();

SDL_Quit();

return 0;
}

***

en espérant recevoir un peu d´aide ^^.
merci d´avance :).

kokoala
kokoala
Niveau 7
29 mars 2004 à 21:38:47

rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 21:45:14

et je le mets ou? j´ai pas bien compris pk je dois mettre ça :/
j´ai essayé de le mettre dans mes if ( dans la fonction waitkey()) mais ca fonctionne pas :(.

kokoala
kokoala
Niveau 7
29 mars 2004 à 21:55:21

oui c´est dans le if
mais oublié de dire de faire un blitsurface pour le perso

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 21:56:42

effectivement ^^
j´essaie de suite

_[CONKER]_
_[CONKER]_
Niveau 10
29 mars 2004 à 21:59:28

comme ca?:

***

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

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_map.y = rectangle_map.y - 10;
rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;
SDL_BlitSurface(map, &_map, screen, NULL);
SDL_BlitSurface(perso, NULL, screen, &_perso);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_DOWN)
{
rectangle_map.y = rectangle_map.y + 10;
rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;
SDL_BlitSurface(map, &_map, screen, NULL);
SDL_BlitSurface(perso, NULL, screen, &_perso);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_LEFT)
{
rectangle_map.x = rectangle_map.x - 10;
rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;
SDL_BlitSurface(map, &_map, screen, NULL);
SDL_BlitSurface(perso, NULL, screen, &_perso);

SDL_Flip(screen);
}
if(event.key.keysym.sym == SDLK_RIGHT)
{
rectangle_map.x = rectangle_map.x + 10;
rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;
SDL_BlitSurface(map, &_map, screen, NULL);
SDL_BlitSurface(perso, NULL, screen, &_perso);

SDL_Flip(screen);
}
}
}
}
}

***

bah ca fonctionne pas, le perso avance et fait la largeur de lecran pendant que je scroll la map contre la droite.. :/
je voudrais qu´il reste tout en haut a gauche de la map ^^

kookii
kookii
Niveau 4
29 mars 2004 à 22:29:34

Y´a 2 methodes
Si l´objet ne bougera jamais alors tu fais un blit sur ta carte.
Si il doit bouger, il faut tester s´il est visible et l´afficher dans ce cas.

JeanYvesYves
JeanYvesYves
Niveau 10
30 mars 2004 à 04:41:01

Tu peux compter sur I´m the law, je le connais bien personnellement, il touche un maximum en programmation :)

Bon, je reviens de soirée, je suis claqué, je V me coucher, a ++ !

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 17:41:45

ok c´est bon j´y arrive, thx tlm :).

_[CONKER]_
_[CONKER]_
Niveau 10
03 avril 2004 à 15:12:37

sinon, je ferais comment pour vider le contenu d´un SDL_CreateRGBSurface ?
car si je fais ca:

***

bg = SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0);
temp_bg = SDL_LoadBMP("img/bg1.bmp");
SDL_BlitSurface(temp_bg, NULL, bg, &_bg);
SDL_FreeSurface(temp_bg);

. ..
. ..

SDL_FreeSurface(bg);

***

bah le SDL_FreeSurface(bg); me rapporte un segment fault :/.

_[CONKER]_
_[CONKER]_
Niveau 10
05 avril 2004 à 00:45:46

^^ tant de questions qui resteront apparemment sans réponse :snif:
sinon j´ai un autre pb:
je vois pas très bien ce qui ne joue pas dans cette fonction:

***

/ * id est le nom du rectangle, c´est un chiffre. */
void CreateRectangle(int id)
{
SDL_Rect id;
id.x = rectangle_ship.x;
id.y = rectangle_ship.y;
}

***

:/

_[CONKER]_
_[CONKER]_
Niveau 10
05 avril 2004 à 00:47:05

les erreurs de compilation sont:

" 33 shootemup.cpp
declaration of `id´ shadows a parameter
"
et
" 42 shootemup.cpp
passing `int *´ as argument 4 of `SDL_UpperBlit(SDL_Surface *, SDL_Rect *, SDL_Surface *, SDL_Rect *)´
"
:´(

JeanYvesYves
JeanYvesYves
Niveau 10
05 avril 2004 à 02:11:01

Alors :

SDL_FreeSurface(bg);

ne devrait pas planter, sauf si tu utilises bg APRES. Attention, c´est la derniere instruction qui doit porter bg.
Ensuite, vérifie que tu manipules bg, et non une copie de bg, donc que tu parles du meme bg !
Bizarre ! !

Autre message :

void CreateRectangle(int id)
{
SDL_Rect id;
id.x = rectangle_ship.x;
id.y = rectangle_ship.y;
}

Cette fonction ne tient pas debout :
- est ce que id est un int ? ( voir entete) ou un SDL_Rect ? ? --> shadow parameter veut dire en fait que tu déclares la meme variable 2 fois...

Du coup, je pense que ça fout tout le reste en l´air...
Ensuite, quel est l´interet de ta fonction ?
Au nom, elle est cencée créer un rectangle. Bon, d´abord, pourquoi tu lui donnes un int ? Peut etre parce que c´est une variable globale ? ? Un indice dans un tableau de variables globales ?
Dans ces cas la, pas besoin de redéclarer un autre SDL_Rect, il existe dans ton tableau global !
Sinon, si ça ne parle pas de variable globale, retourne donc un SDL_Rect, et pas void ! !

_[CONKER]_
_[CONKER]_
Niveau 10
05 avril 2004 à 12:40:23

oui c´est vrai j´ai pas bien réflechi :).
en fait, à chaque appui de la barre espace je veux tirer un coup de feu.. donc j´incrémente un nombre et ce nombre est le nom du rectangle => voilà le int.. mais c´est vrai que ça tient pas debout ^^´.
sinon pour le SDL_FreeSurface() bah j´utilise bg en VRAM pour contenir le fond.. et au bout d´un moment je veux changer de fond.. donc je fais SDL_FreeSurface(bg); SDL_BlitSurface(temp_bg, NULL, bg, &_bg); et il veut pas apparement..

_[CONKER]_
_[CONKER]_
Niveau 10
05 avril 2004 à 13:18:14

En fait pour la fonction, à chaque fois qu´on appuie sur la barre d´espace, on incrémente un nombre.. et, normalement, grace à cette fonction, on devrait créer un rectangle qui prendrait les coordonnées x et y du vaisseau au moment de l´appui et qui aurait comme nom le nombre incrémenté, tu suis ?
donc SDL_Rect id; serait pour faire un rectangle portant le nom ( ici un nombre puisque id est un int) de id. pas très claire tout ça, mais je savais pas comment faire autrement..

JeanYvesYves
JeanYvesYves
Niveau 10
05 avril 2004 à 13:49:32

Tu fais une liste chainée dans laquelle tu stockes tes missiles.

Une liste chainée est un conteneur ( un truc si tu preferes) représentant une liste qui peut avoir un nombre d´élements variable. Tu peux ajouter des élements a la liste, ou en retirer : donc quand tu tires un missile, tu l´ajoute a la liste, quand il se détruit, tu le retire de la liste...

regarde mon tutorial sur les STL

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