Qwerty - azerty avec sdl, une alternative

Contenu du snippet

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 / Exemple :


#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]

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.