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

SDL/C++ : SDL_MOUSEMOTION

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:08:38

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 :).

JeanYvesYves
JeanYvesYves
Niveau 10
30 mars 2004 à 20:25:47

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)

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:30:53

non, j´ai aucun message qui se pointe :/.

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:31:26

la console reste noir de chez noir :o

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 20:44:21

tu le places au bon endroit?

while(pollevents)
if ( type==keydown)
{
if(key=..)
if(key=..)
. .
}
if ( type=mousemotion)
< <mets ton code ici>>

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:46:53

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 )

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 20:51:32

fais voir ton code pcq ca devrait marcher :)

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:52:06

il est pas très court!
le voici:

***

  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_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;
}

***

:/

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 20:53:13

( et c´est la que je me rends compte que j´aurais du faire 1 ou 2 ptits commentaires :-p ) .

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 20:58:50

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 :)

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 21:00:24

ah le con! j´ai pas fait attention x).
alala, ces fautes toutes bêtes en +^^.
merci beaucoup :).

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 21:04:57

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 ?

JeanYvesYves
JeanYvesYves
Niveau 10
30 mars 2004 à 21:14:12

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.

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 21:17:13

je vais voir tout de suite, merci :).

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 21:18:02

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?

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 21:27:16

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?

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 21:29:09

Hum, faudrait refaire voir ton code source alors, si tu pouvais aussi l´uploader, ca serait plus lisible :)

i_am_the_law
i_am_the_law
Niveau 6
30 mars 2004 à 21:29:50

j´ai rien dit, je l´avais pas vu :)

_[CONKER]_
_[CONKER]_
Niveau 10
30 mars 2004 à 21:30:04

je viens de le faire :).
tu trouveras le code source dans le zip :).

zedix
zedix
Niveau 5
30 mars 2004 à 21:31:58

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.

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