Question

J'ai créé un jeu FPS avec MSVC ++ qui fonctionne très bien sous Windows. Mais maintenant j'essaye de le rendre portable (au moins je veux créer une version Linux et une version Windows), alors j'ai décidé de changer l'EDI en Code :: Blocks et le framework en wxWidgets. Mais il semble que les codes de clé virtuelle et les codes de balayage soient différents sur différents systèmes.

J'ai déjà constaté que les codes de clé virtuels pouvaient être différents, même sur le même système d'exploitation, mais sur un ordinateur différent (j'ai reçu des rapports de bugs sur l'impossibilité de contrôler le caractère (en fonction de l'état de numlock, lol, pas de blague), ce qui est corrigé. quand changer le code pour utiliser scancodes au lieu de codes virtkey) (edit: avec wxWidgets, les codes virtkey et scan sur le pavé numérique ont des valeurs différentes selon l’état de numlock, bang!)

Maintenant, avec wxWidgets, il semble que wxKeyEvent :: GetRawKeyCode et le code obtenu précédemment de lParam de WM_KEYDOWN sont différents. Et je reçois également un code d'analyse complètement différent sous Linux (Ubuntu) à partir de GetRawKeyCode.

Eh bien, je peux créer mon propre tableau de codes de balayage en appuyant sur toutes les touches et en voyant le code qu’il donne, mais le seul problème qui se pose est que Ubuntu est exécuté sur mon ordinateur portable et que celui-ci n’a pas de clavier complet ... Mais il me faut tous pour que les paramètres de contrôle fonctionnent.

La question est donc la suivante: existe-t-il un moyen standard et multi-plateforme d'obtenir le même code pour la même clé (la clé au même emplacement pour être plus précis)? (au moins sur Windows et Linux)

Était-ce utile?

La solution

Si vous n'y avez pas déjà pensé, vous pourrez peut-être utiliser SDL .

Autres conseils

Ceci étant un FPS, la boîte à outils graphiques de niveau inférieur que vous utilisez fait une différence énorme (je suppose que vous n’écrivez pas d’images 3D dans wxWidgets). Si vous utilisez OpenGL, avez-vous examiné ce que GLUT peut faire?

Le glutKeyboardFunc et glutSpecialFunc associé à glutGetModifiers pourrait être suffisant pour le code de clavier multiplateforme, et GLUT peut même être utilisé pour d'autres périphériques d'entrée.

Pour être honnête cependant, je ne vois toujours pas comment cela pourrait avoir quelque chose à voir avec wxWidgets.

Mon opinion est qu'il est totalement faux d'utiliser wxWidgets pour coder des jeux 3D rapides. Dans " hardcore " jeu, vous devez l’utiliser pour développer des outils d’appui, tels que des éditeurs et des convertisseurs.

SDL est la voie à suivre. Cela peut sembler assez élémentaire, mais une fois que vous commencez à sacrifier les petits enfants aux dieux impies de SDL, des choses comme SDL_image (idéal pour lire de nombreux formats de fichier image - dans la mesure où j'utilise parfois SDL uniquement pour lire, par exemple, JPEG) ou SDL_mixer (solution unique pour la lecture et la lecture de données audio de base - OGG, WAV, ...).

Alors, ne cherchez pas plus loin que SDL. Même le support graphique 2D est bon une fois que vous commencez à utiliser SDL_gfx. Au début, SDL peut sembler élémentaire, mais une fois que vous avez compté dans toutes les bibliothèques supplémentaires construites autour de lui et une fois que vous codez quelques wrappers, vous verrez que SDL est l’équilibre parfait entre le strict nécessaire et la facilité d’utilisation avancée.

Je serai ravi de vous aider de quelque manière que ce soit avec SDL, car je le trouve tellement génial.

Je peux mal interpréter ce que vous voyez ici, mais en regardant le code de clé brut renvoyé entraînera des différences au niveau du matériel, des systèmes d'exploitation, de la configuration et de la plate-forme. Vous devez donc consulter le code-clé virtuel renvoyé par un événement clé .

EDIT: Peut-être wxWidgets ne le gère-t-il pas correctement (douteux) . Le problème de la clé numérique est "forcer". de contourner (mal) ce problème en utilisant le code de numérisation brut.

Si tel est le cas, vous n'avez pas besoin de jeter ce que vous avez fait, mais si vous ajoutez SDL . rien que pour les entrées, vous trouverez des appels qui renverront le SDL_keysym don Ne retournez pas simplement le scancode du matériel (vous ne pouvez rien faire en matière de "réparation"), mais mappez-le également sur un caractère unicode et un symbole virtuel, ce qui, je pense, est ce que vous recherchez. Espérons que leurs appels n'ont pas ce problème de modlock numlock.

Si vous ne souhaitez pas utiliser SDL, je vous recommande de SFML - Bibliothèque multimédia simple et rapide . Il est multiplateforme et très simple à utiliser. Par exemple, dans la section de didacticiels :

.
bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

où Entrée est

const sf::Input& Input = App.GetInput();

Il existe certaines indications indiquant que SFML est plus rapide que SDL, mais j’ai tendance à l’utiliser pour créer un code rapide et portable, car j’aime son utilisation plus que SDL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top