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 ?
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)
je vais opter pour le dernier exemple merci
.
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 ?
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:
***
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
.
rectangle_perso.x = rectangle_map.x;
rectangle_perso.y = rectangle_map.y;
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
.
oui c´est dans le if
mais oublié de dire de faire un blitsurface pour le perso
effectivement ^^
j´essaie de suite
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 ^^
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.
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 ++ !
ok c´est bon j´y arrive, thx tlm
.
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 :/.
^^ tant de questions qui resteront apparemment sans réponse ![]()
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;
}
***
:/
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 *)´
"
:´(
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 ! !
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..
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..
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