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

[C++/SDL] Gestion evenements (Unicode)

elhuron
elhuron
Niveau 6
27 avril 2008 à 14:23:51

Salut. :)

Pour ne plus avoir de problemes entres les differents types de claviers, je gere les evenements clavier avec l'unicode.
Pour cela, j'utilise cette fonction au debut du programme :
SDL_EnableUNICODE(1);

Ensuite, j'ai créer une fonction largement inspirée par celle de FVirtman, declarée dans le namespace fonction :
(Avant d'utiliser la fonction, je declare : bool clavier[400]={0} ; int souris[4]={0};)
http://rafb.net/p/Ut10Ay47.html

La fonction en simplifiée (sans affichage)
void fonction::udpateEvents(bool* clavier, int* souris)
{
.....SDL_Event event;
.....while( SDL_PollEvent(&event) )
.....{
..........if(event.type==SDL_KEYDOWN)

...............clavier[event.key.keysym.unicode]=t
rue;
..........else if(event.type==SDL_KEYUP)

...............clavier[event.key.keysym.unicode]=f
alse;
.....}
}

Voila ce que j'obtient sous Notepad++ (il affiche les caracteres etranges) :

------------------------

DEBUT

DEBUT
UP : 'NUL'
DOWN : h

DEBUT

DEBUT
UP : 'NUL'
DOWN : a

DEBUT

------------------------

Les evenements de type SDL_KEYDOWN fonctionnent a priori tres bien, mais les evenements de type SDL_KEYUP sont tous 'NUL'.
Tout est donc fonctionnel, mais les evenements de type SDL_KEYUP sont 'NUL', je vois pas pourquoi...

Merci de m'aider a résoudre ce probleme. :)

elhuron
elhuron
Niveau 6
27 avril 2008 à 23:16:07

Mouarf, j'ai trouvé ceci :
http://www.siteduzero.com/recherche.html?src=unicode+SDL_KEYUP&c=6

mrbuisson : je precise juste que event.key.keysym.unicode ne contient rien en cas d'event SDL_KEYUP (jamais compris pourquoi...)

Je vais modifier le fonctionnement de mon programme donc, concernant le clavier, car pour la souris, ca a l'air de fonctionner correctement.
Juste avant d'utiliser ma fonction, je vais mettre a 0 mon clavier, et dans mon programme, virer les variables de blocages.
Du coup, c'st encore plus facile a gérer, mais bon, si j'ai besoin de connaitre l'etat du clavier a un instant t, c'est impossible, mais j'en ai pas besoin de toutes facons.

elhuron
elhuron
Niveau 6
28 avril 2008 à 18:59:43

Décidément, j'ai encore des problèmes avec l'unicode et SDL... :(

Lorsque j'ai activé l'unicode avec SDL_EnableUNICODE(1), et que j'utilise la fonction SDL_PollEvent(&event) en ayant préalablement declaré SDL_Event event, si j'appuie deux fois sur le circonflexe, mon programme plante, il se ferme, et ceci dans la fonction SDL_PollEvent()...

En effet, si j'appuie deux fois sur le circonflexe, cela donne : ^^
La fonction doit pas reussir a gerer ca... Mais bon, je fait comment pour contrer ce bug moi ? Je peux peut etre interragir directement avec le systeme d'Exploitation pour desactiver ceci ?

Quand j'appuie une seule fois sur le circonflexe, la valeur de la touche est 0, je pense que ca correspond a la constante SDL_UNKNOWN. Si j'appuie sur e apres par exemple, pas de problemes, j'ai un e circonflexe.
Admettons que j'appuie sur un p apres l'accent circonflexe, la, ca plante aussi, pareil que si j'appui deux fois sur la touche circonflexe.

En effet, circonflexe + p donne ceci : ^p
Soit deux caracteres.

Merci de proposer une solution, si vous en avez une :(

elhuron
elhuron
Niveau 6
28 avril 2008 à 19:05:15

Au passage, si je n'active pas la fonction Unicode, pas de bug, en effet, j'ai pas reussit a trouver la touche circonflexe. Mais l'unicode est donc inutilisable.

Je peux gerer les touches sans unicode, mais bon, ca pause problemes entres les claviers Qwerty/Azerty, pleins de touches sont décalés, ca ressemble a rien, et vu que l'utilisateur de mon programme utilise le clavier pour ecrire, l'unicode est beaucoup plus interressant.

Je vais tester le programme sous un autre Systeme d'Exploitation, (WinXP au lieu de WinMe), je vous tient au courant.

elhuron
elhuron
Niveau 6
28 avril 2008 à 19:19:20

Bon, j'ai rien dit, ca fonctionne parfaitement sous Windows Xp...
Vu le tres faible nombre d'utilisateurs de Windows Me, je vais laisser ce bug, mais si jamais vous avez une solution, n'hesitez pas :)

dnob700
dnob700
Niveau 10
28 avril 2008 à 20:36:37

c'est du au fait que la SDL, est décevante comme d'habitude, et au lieu de gérer les codes des touches elle gère les caractères émit par le système d'exploitation.

C'est très mauvais pour un jeu, car si la disposition du clavier n'est pas la même chez l'utilisateur les touches ne sont plus naturelles (en contrepartie, elles gardent le même label, ça dépend de ce qu'on veut).

Ici, c'est juste que quand tu appuie sur '^' le système envoie bien un numéro de touche, mais pas de code de caractère. C'est une "touche morte". Et manifestement, SDL ne peut pas gérer ce genre de chose.

elhuron
elhuron
Niveau 6
29 avril 2008 à 17:43:19

Merci pour cette explication. :)
Mais la SDL est-elle modifiable, comme Qt il me semble par exemple, pour la faire avancer ?
Par exemple, elle utilise une vieille version de DirectX, mettre cela a jours pourrait etre interressant. (A part pour moi, je ne peux pas installer la derniere version sur mon Ordinateur)

dnob700
dnob700
Niveau 10
29 avril 2008 à 21:02:03

la SDL est "plus" modifiable que Qt, car elle est entièrement sous LGPL donc des modifications que tu peut y faire on de bonne chance d'arriver dans la distribution principale, contrairement à Qt qui est développé par une entreprise privé (quoi que je ne connais pas l'importance de la communauté dans le développement de Qt)

Mais cette bibliothèque est vraiment entachée d'erreurs de conception énormes (bon, c'est bon, on a compris que je ne l'aime pas)

Je te conseille de jeter un coup d'œil à la bibliothèque SFML si tu ne l'a pas déjà fait. Elle est assez récente et manque de pas mal de fonctionnalité (quoi que le concepteur ne veut pas en ajouter beaucoup, pour conserver la simplicité). Et je trouve qu'elle est assez bien conçue (son gros défaut est de vouloir gérer toute sorte de chose qui n'ont rien à voir avec son but principale, mais il suffit de ne pas utiliser tout les module). De plus elle utilise DirectX pour tout (SDL n'utilise pas d'accélération 3D pour faire de la 2D si j'ai bonne mémoire) donc elle est plus rapide.

dnob700
dnob700
Niveau 10
29 avril 2008 à 21:02:29
  • OpenGL pour sfml je pense car la lib est multi-plateforme.
elhuron
elhuron
Niveau 6
29 avril 2008 à 21:48:17

Hum, j'entends pas mal parler de la SFML depuis peu.
J'ai pas tester car je compte d'abord finir ce que je fait, et vu que j'ai commencer avec la SDL, je continue sur ce chemin là.

Mais quand j'aurais terminer ce que je fait, je compte utiliser OpenGL, meme pour faire des jeux de type 2D, comme doit le faire la SFML, d'après ton commentaire.

Mais j'aurai besoin de la SDL ou de la SFML par exemple pour utiliser OpenGL, je sais pas si ca vaut le coup d'apprendre a utiliser la SFML juste pour cet usage.

elhuron
elhuron
Niveau 6
29 avril 2008 à 21:51:51

D'ailleurs, pourquoi utiliser OpenGL pour un fonctionnement similaire a la SFML ?
Tout simplement pour apprendre en douceur a utiliser OpenGL pour gerer par la suite la 3D plus facilement.

dnob700
dnob700
Niveau 10
30 avril 2008 à 01:02:05

pour utiliser OpenGL, tu as besoin d'une bibliothèque pour initialiser une fenêtre etc. SDL peut le faire, SFML peutle faire (mieux) advio2 peut le faire, ou tu peut le coder "à la main" en win32 ou avec X. Mais SFML me semble un bon choix pour ça car une surface OpenGL est de toute manière toujours initialiser avec (contrairement à SDL ou ce n'est pas le cas par défaut).

elhuron
elhuron
Niveau 6
30 avril 2008 à 17:26:19

Héhé, je suis passé vite fait sur le site de la SFML, et en effet, apres avoir vu un court axemple, ca me parait beaucoup plus facile à utiliser que la SDL.
Le fonctionnement reste a peu pres le meme, en meme temps, c'est normal :)

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