slt
,
j´suis en train de faire un ptit " exercice" mais j´arrive pas à mettre le curseur et tout.. donc j´aimerais créer moi même un curseur ( donc blitter une image de curseur à chaque mouvement de souris à l´emplacement voulu, vous voyez?). vlà le bout de code source intéressant ^^:
***
if(event.type == SDL_MOUSEMOTION)
{
rectangle_cursor.x = event.motion.x;
rectangle_cursor.y = event.motion.y;
}
***
bon bah comme vous vous en êtes sûrement douté, ca fonctionne pas ^^.
merci d´avance
.
bizarre ! Débug ça comme ça :
if(event.type == SDL_MOUSEMOTION)
{
cout < < " plouf" endl;
rectangle_cursor.x = event.motion.x;
rectangle_cursor.y = event.motion.y;
}
Lance en mode fenetré, pour voir la console derriere. Tu regardes si les ploufs apparaissent
Si ils apparaissent, le motion marche, et C tes rectangles derriere qui ne vont pas
S´ils n´apparaissent pas : C que la motion n´est pas ative ( faudra voir dans ce cas d´ou ça vient)
non, j´ai aucun message qui se pointe :/.
la console reste noir de chez noir :o
tu le places au bon endroit?
while(pollevents)
if ( type==keydown)
{
if(key=..)
if(key=..)
. .
}
if ( type=mousemotion)
< <mets ton code ici>>
oui oui, je le mets au bon endroit !
je me demandais si ça venait pas du faite qu´il fallait activer qqchose, du genre: SDL_ActiveEvent
je viens de tomber dessus dans la doc
( http://sdldoc.csn.ul.ie/sdlactiveevent.php )
fais voir ton code pcq ca devrait marcher ![]()
il est pas très court!
le voici:
***
SDL_Surface* screen;
SDL_Surface* map;
SDL_Surface* perso;
SDL_Surface* selection;
SDL_Surface* cursor;
SDL_Rect rectangle_map;
SDL_Rect rectangle_perso;
SDL_Rect rectangle_selection;
SDL_Rect rectangle_cursor;
SDL_Event event;
int cursor_x = 0;
int cursor_y = 0;
int waitclick()
{
if(event.type == SDL_MOUSEBUTTONDOWN)
{
if(event.button.button == SDL_BUTTON_LEFT)
{
if(event.button.x == rectangle_perso.x && event.button.y == rectangle_perso.y)
{
rectangle_selection.x = rectangle_perso.x + 3;
rectangle_selection.y = rectangle_perso.y + 3;
SDL_SetColorKey(selection, SDL_SRCCOLORKEY, SDL_MapRGB(selection->format,0,0,255));
SDL_BlitSurface(map, &_map, screen, &_map);
SDL_BlitSurface(perso, NULL, screen, &_perso);
SDL_BlitSurface(selection, NULL, screen, &_selection);
SDL_Flip(screen);
}
}
}
}
int motion()
{
if(event.type == SDL_MOUSEMOTION)
{
rectangle_cursor.x = event.motion.x;
rectangle_cursor.y = event.motion.y;
}
}
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;
}
if(event.key.keysym.sym == SDLK_DOWN)
{
rectangle_map.y = rectangle_map.y + 10;
}
if(event.key.keysym.sym == SDLK_LEFT)
{
rectangle_map.x = rectangle_map.x - 10;
}
if(event.key.keysym.sym == SDLK_RIGHT)
{
rectangle_map.x = rectangle_map.x + 10;
}
if(rectangle_map.x < 0)
{
rectangle_map.x = 0;
rectangle_perso.x = rectangle_perso.x + ( -1*rectangle_map.x);
}
if(rectangle_map.x > 976)
{
rectangle_map.x = 976;
rectangle_perso.x = rectangle_perso.x + ( -1*rectangle_map.x);
}
if(rectangle_map.y < 0)
{
rectangle_map.y = 0;
rectangle_perso.y = rectangle_perso.y + ( -1*rectangle_map.y);
}
if(rectangle_map.y > 1232)
{
rectangle_map.y = 1232;
rectangle_perso.y = rectangle_perso.y + ( -1*rectangle_map.y);
}
motion();
waitclick();
rectangle_perso.x = rectangle_perso.x + ( -1*rectangle_map.x);
rectangle_perso.y = rectangle_perso.y + ( -1*rectangle_map.y);
SDL_BlitSurface(map, &_map, screen, NULL);
SDL_BlitSurface(perso, NULL, screen, &_perso);
SDL_BlitSurface(cursor, NULL, screen, &_cursor);
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");
selection = SDL_LoadBMP("selection.bmp");
cursor = SDL_LoadBMP("cursor.bmp");
SDL_GetMouseState(&_x, &_y);
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;
rectangle_cursor.x = cursor_x;
rectangle_cursor.y = cursor_y;
rectangle_cursor.h = 13;
rectangle_cursor.w = 13;
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_SetColorKey(cursor, SDL_SRCCOLORKEY, SDL_MapRGB(cursor->format,0,0,255));
SDL_BlitSurface(cursor, NULL, screen, &_perso);
SDL_Flip(screen);
waitkey();
SDL_Quit();
return 0;
}
***
:/
( et c´est la que je me rends compte que j´aurais du faire 1 ou 2 ptits commentaires
) .
ca ne marche pas pcq tu appelles motion() a l´interieur du if(event.type==keydown)
enfin a 1ere vue, pcq sans l´indentation c´est pas facile a voir.
Donc si event.type est egal a keydown, il sera jamais egale a mousemotion ![]()
ah le con! j´ai pas fait attention x).
alala, ces fautes toutes bêtes en +^^.
merci beaucoup
.
ah miracle ca fonctionne! ![]()
mais maintenant l´autre problème, c´est que il y a un effet de " lag", vous voyez?
le curseur bouge en retard.. très en retard ( 2-3secondes après). vous savez pourquoi ?
arf !
ça vient peut etre de la refresh rate du motion(), si ça se trouve, l´evenement n´est pas appelé assez souvent.
Sinon, essaie de charger ton image de fond en VRAM et non en RAM : tu y gagneras : regarde mon tuto, le 2e tuto sur SDL que j´ai fait.
je vais voir tout de suite, merci
.
Deja tu peux ameliorer un petit peu le code
mets deja ca dans le main, ca evitera d´y repeter a chaque fois. 1fois ca suffit
SDL_EnableKeyRepeat(1, 1);
Ensuite pour le scrolling ou le curseur, utilises une variable qui permet de voir si il est necessaire de metrte a jour.
Comme ca tu fais le blit que si une touche a ete pressee ou si la souris a bouge.
Y´a aussi le fait que quand tu fais le blit du curseur tu utilises rectangle perso a la place de rectangle_cursor. Tu devrais changer ca
Sinon, je vois pas pk il y aurait 3sec de decalage. Tu as garde le meme programme qu´au dessus?
oui, à 2 différences près:
j´ai appelé les 2 fonctions ailleurs.
ah oui et j´ai un ptit peu modifié certains trucs ( comme les blits, des trucs un peu faux) mais rien de très important.
si tu veux voir comment réagi la souris, va voir ici j´ai mis le prog en ligne:
http://conker.tonsite.bizbiz/perso%20en%20mouvement.zip
tu verras.
sinon jyy, pendant que je lis ton exemple ultra commenté, peux-tu me faire un bref résumé des différences entre la RAM et la VRAM?
Hum, faudrait refaire voir ton code source alors, si tu pouvais aussi l´uploader, ca serait plus lisible ![]()
j´ai rien dit, je l´avais pas vu ![]()
je viens de le faire
.
tu trouveras le code source dans le zip
.
Pour ameliorer ton code, tu pourrais aussi, soit rassembler tout tes traitements d´event dans une même fonction, soit mettre tous les traitement dans une fonction à part. Parce que là, c´est un peu bizarre...
Et puis utilises des switchs
C´est quand même ´achemenet plus lisible que des if imbriqués.
genre :
switch(event.type) {
. ..case SDL_MOUSEMOTION : motion();
. ..break;
. ..case SDL_MOUSEBUTTONDOWN : waitclick();
. ..break;
. ..case SDL_KEYDOWN : key();
. ..break;
. ..default : std::cout < < " evenement non gere" < < std::endl;
. ..break;
}
Comme ça, c´est clair, et tu vois vite d´où viens le bug.