begin process at 2012 02 13 13:34:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > QWERTY - AZERTY AVEC SDL, UNE ALTERNATIVE

QWERTY - AZERTY AVEC SDL, UNE ALTERNATIVE


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :qwerty, azerty, SDL, problème, clavier Niveau :Débutant Date de création :07/06/2009 Date de mise à jour :07/06/2009 18:42:14 Vu :3 860

Auteur : Scheb

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Voilà, dernierement il m'est arrivé un problème avec la SDL:
Quand je programmais une touche sur du SDLK_q, c'était la touche "a" qui reagissait
Je programmais pour du Azerty mais SDL le traiter en Qwerty

Ce problème n'arrive pas à tout les claviers Azerty, cependant une minorité subit le problème et n'est pas écouter...
J'avais donc passer des heureS à chercher une solution;
-Soit faire sa propre map Azerty (déconseiller, travaille fastidieux et en plus finalement ça ne marche plus que sous du Azerty)
-Soit proposer à l'utilisateur de configurer ses touches (d'accord, mais assez bancale quand on veut jouer au pendu on demande toute les touches lettrés ?!)
-Soit bien sûr dans le code mettre un SDLK_q sachant très bien qu'on aura du "a" à la sortie (mais une fois encore, pour un snake à 4 touche ok, mais sur un tchat....on s'emmele vite fait)
-Soit, l'utilisation de l'unicode; on se sert de la Fonction "SDL_EnableUNICODE(1)" au départ et après au lieu d'utilisé keysym.sym on utilise keysym.unicode(/!\ certaines touches comme les flêches sont universelle et l'unicode marche pas mais on peut contourner ceci avec une verification "!=0")

Ces solutions peuvent être toutes utilisé et peuvent être bien, cela depend juste du jeu impliqué.
La dernière, l'unicode, semble être la meilleur (car cela gère le qwerty, l'azerty, mais aussi les autres types de claviers universelle). Le problème c'est qu'elle ne fonctionne  que quand on a un SDL_KEYDOWN (pour des raisons techniques)

Donc voilà, certain comme moi on surrement besoin de repérer le relachement de la touche aussi, et je viens de trouver une alternative sympa (j'en ai trouver AUCUNE sur internet, c'est pourquoi je post ma source ici pour ceux qui serait aussi dans le besoin).


Dans le code ci-dessous je stock dans un tableau l'equivalance de keysym.sym en keysym.unicode

Source

  • #include "stdlib.h"
  • #include "SDL/SDL.h"
  • #include <iostream>
  • using namespace std;
  • SDLKey Clav[SDLK_LAST];//"SDLK_LAST" indique le nombre d'enum de SDLK
  • void Traduction(SDL_KeyboardEvent *key);
  • using namespace std;
  • int main(int argc, char *argv[])
  • {
  • SDL_Surface *screen;
  • SDL_Event event;
  • int running = 1;
  • if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  • return 1;
  • }
  • SDL_KeyboardEvent *key;
  • SDL_EnableUNICODE(1);
  • atexit(SDL_Quit);
  • screen = SDL_SetVideoMode(320, 240, 0, SDL_ANYFORMAT);
  • if (screen == NULL) {
  • return 1;
  • }
  • while(running) {
  • while(SDL_PollEvent(&event)) {
  • switch(event.type){
  • case SDL_KEYDOWN:
  • Traduction(&event.key);
  • cout << "pressé: " << SDL_GetKeyName(Clav[event.key.keysym.sym]) << endl;
  • break;
  • case SDL_KEYUP:
  • cout << "relaché: " << SDL_GetKeyName(Clav[event.key.keysym.sym]) << endl;
  • if((Clav[event.key.keysym.sym]) == SDLK_q){ running = 0;} //ici on peut tester:
  • //on remarque que c'est bien quand on appuie sur "q" que cela quitte et non "a"
  • break;
  • case SDL_QUIT:
  • running = 0;
  • break;
  • }
  • }
  • }
  • return 0;
  • }
  • void Traduction(SDL_KeyboardEvent *key)
  • {
  • if(Clav[key->keysym.sym] != 0)
  • {
  • return;
  • }
  • if(((key->keysym.unicode) != 0) && (key->keysym.unicode < 256) )
  • {
  • Clav[key->keysym.sym] = (SDLKey)key->keysym.unicode;
  • }
  • else
  • {
  • Clav[key->keysym.sym] = key->keysym.sym;
  • }
  • }
#include "stdlib.h"
#include "SDL/SDL.h"
#include <iostream>

using namespace std;

SDLKey Clav[SDLK_LAST];//"SDLK_LAST" indique le nombre d'enum de SDLK

void Traduction(SDL_KeyboardEvent *key);

using namespace std;

int main(int argc, char *argv[])
{
	SDL_Surface *screen;
	SDL_Event event;
	int running = 1;

	if (SDL_Init(SDL_INIT_VIDEO) != 0) {
		return 1;
	}
	SDL_KeyboardEvent *key;

        SDL_EnableUNICODE(1);
	atexit(SDL_Quit);

	screen = SDL_SetVideoMode(320, 240, 0, SDL_ANYFORMAT);
	if (screen == NULL) {
		return 1;
	}

	while(running) {
		while(SDL_PollEvent(&event)) {
			switch(event.type){
				case SDL_KEYDOWN:
                                Traduction(&event.key);
                                cout <<  "pressé: " << SDL_GetKeyName(Clav[event.key.keysym.sym]) << endl;
                                break;
				case SDL_KEYUP:
                                cout <<  "relaché: " << SDL_GetKeyName(Clav[event.key.keysym.sym]) << endl;
                                if((Clav[event.key.keysym.sym]) == SDLK_q){ running = 0;} //ici on peut tester: 
//on remarque que c'est bien quand on appuie sur "q" que cela quitte et non "a"
					break;
				case SDL_QUIT:
					running = 0;
					break;
			}
		}
	}
	return 0;
}


void Traduction(SDL_KeyboardEvent *key)
{
    if(Clav[key->keysym.sym] != 0)
    {
        return;
    }
    if(((key->keysym.unicode) != 0) && (key->keysym.unicode < 256) )
    {
        Clav[key->keysym.sym] = (SDLKey)key->keysym.unicode;
    }
    else
    {
        Clav[key->keysym.sym] = key->keysym.sym;
    }
}

 Conclusion

après on peut effectuer un tas d'alternative pour regler toutes sorte de problème;
Comme pour savoir si un touche est enfoncé avec un tableau bool, au moment de son KEYDOWN on mets Tab[Clav[keysym.sym]] = true, et on le mets a false quand on a un KEYUP (après on peux test si la touche est appuyer avec un if(Tab[Clav[SDLK_a]] == true)

n'hesitez pas à commentez car si je me suis planté quelque part, c'est génétique^^

[notez qu'il faut regarder le fichier stdout où SDL y inscrit les sorties]


 Historique

07 juin 2009 14:39:03 :
Modification de la taille du tableau Clav j'ai mis "SDLK_LAST", c'est le dernier élément de l'enumeration SDLK (on est sûr d'avoir la bonne taille^^)
07 juin 2009 18:42:14 :
Modification de if(((key->keysym.unicode) != 0)" && (key->keysym.unicode < 256) ") dans le fonction Traduction(): Au dessus de 255, les codages sont universelle (comme alt, ctrl) ou particulier (le pavé numérique, sans la modification, quand on appuie sur le "+" du pavé numérique, l'unicode nous retourne le "+" à coté de la touche entrée)

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture JEUX SERPENT par antho974
Source avec Zip Source avec une capture PENDU EN SDL par Damsou91
CASSE BRIQUE SDL MODIFICATION par Vardosh
Source avec Zip Source avec une capture BOMBERMAN 4 PLAYERS LAN (C & SDL) par c1702
PONG 1.0 EN C AVEC LA BIBLIOTHÈQUE SDL par qaz1289

Commentaires et avis

Commentaire de antho974 le 10/01/2012 18:50:05

Merci beaucoup pour la solution !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Raccourci Clavier [ par lgrenon ] Salut,En fait, je travaille sous Borland C++ Builder et je cherche comment faire un raccourci clavier (Alt+A, par exemple). J'ai essayé par la méthode Utilisation du clavier avec QT 3.2.1 et VC++ [ par jlbrd ] J'ai installer la version d'évaluation de QT 3.2.1 pour Windows. Lorsque j'utilise les applis fournies: designer, assistant ou que je compile un progr problème de processeur avec SDL [ par Goliath49 ] Bonjour,je suis entrain de développer un casse brique en C avec SDL.J'utilise DevCpp et suis sous XP.J'aimerais savoir qu'elles sont les possibiltés p gestion clavier SDL trop rapide !!! [ par _Jonathan ] bonjour a tousj'ai créé un programme avec sdl/opengl mais la gestion du clavier(sdl) est beaucoup tro rapide.j'ai pourtant essayé avec SDL_KEYUP, mais problème SDL [ par Synhok ] J'ai essayer le tut sur la librairie SDL et quand je compile avec DevC++, le linker me marque :C:\...\BIN\ld.exe: cannot open -lSDLmain: No such file MFC: Problème de saisie de touches au clavier dans une boite de dialogue [ par cedsan ] Salut à tousVoila mon problème: J'ais une petite application MFC ou je n'arrive pas à prendre le code ascii des touches taper au clavier. Voici mon bo Problème de langue... [ par goldocrack ] Ce n'est pas vraiment un pb de programmation mais c très génant : le logiciel que j'utilise est Turbo C (sous DOS) et d'un coup d'un seul il a choisi sdl et clavier [ par scawf ] Bonjour, j ai un petit probleme avec SDL et la gestion du clavier.. je met: while(done == 0) { //... while ( SDL_PollEvent(&amp;event) ) &nbsp;{ if ( Jeu mario avec SDL (problème) [ par dmontavon ] bonjour, je suis en train de fair un super mario avec SDL... J'en suis qu'au d&#233;but, j'ai d&#233;ja r&#233;ussi &#224; le faire&nbsp;avancer &#224 problème avec SDL, struct? [ par foxley ] Bonjour, je suis nouveau ici.J'ai un projet en C &#224; faire pour la fac.Et &#224; vrai dire je suis bloqu&#233; a un endroit:"tab[i]-&gt;surface-&gt


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales