Domanda

Ho realizzato un gioco FPS con MSVC ++ che funziona molto bene su Windows. Ma ora sto cercando di renderlo portatile (almeno voglio creare una versione Linux e una versione Windows), quindi ho deciso di cambiare l'IDE in Code :: Blocks e il framework in wxWidgets. Ma sembra che i codici chiave virtuali e i codici di scansione siano diversi su sistemi diversi.

In precedenza ho sperimentato che i codici chiave virtuali potrebbero essere diversi anche sullo stesso sistema operativo ma su un computer diverso (ho ricevuto segnalazioni di bug che non sono in grado di controllare il carattere (a seconda dello stato del blocco numerico, lol, non scherzo), che è stato risolto quando si modifica il codice per utilizzare scancodes anziché i codici virtkey) (modifica: con wxWidgets sia i codici virtkey che quelli di scansione sul tastierino numerico hanno valori diversi a seconda dello stato del blocco numerico, bang!)

Ora con wxWidgets sembra che wxKeyEvent :: GetRawKeyCode e il codice ottenuto in precedenza da lParam di WM_KEYDOWN siano diversi. E ottengo anche un codice di scansione completamente diverso su Linux (Ubuntu) da GetRawKeyCode.

Beh, posso creare la mia tabella dei codici di scansione premendo tutti i tasti e vedendo quale codice fornisce, ma l'unico problema che Ubuntu esegue sul mio laptop e il laptop non ha una tastiera completa ... Ma ho bisogno di tutti loro per far funzionare le Impostazioni di controllo.

Quindi la domanda: esiste un modo standard e multipiattaforma per ottenere lo stesso codice per la stessa chiave (la chiave nella stessa posizione per essere più precisi)? (almeno su Windows e Linux)

È stato utile?

Soluzione

Nel caso in cui non lo abbiate già considerato, potreste essere in grado di utilizzare SDL .

Altri suggerimenti

Trattandosi di un FPS, il toolkit di grafica di livello inferiore che stai usando fa una grande differenza (suppongo che non stai scrivendo grafica 3d in wxWidgets). Se stai usando OpenGL, hai visto cosa GLUT puoi fare?

Il glutKeyboardFunc e glutSpecialFunc combinato con glutGetModifiers potrebbe essere sufficiente per il codice tastiera multipiattaforma e GLUT può anche essere utilizzato per altri dispositivi di input.

Ad essere sincero, comunque, non vedo ancora come ciò possa avere a che fare con wxWidgets.

La mia opinione è che è completamente sbagliato usare wxWidgets per codificare giochi 3D frenetici. In "hardcore" sviluppo del gioco, dovresti usarlo per sviluppare strumenti di supporto, come editor e convertitori.

SDL è la strada da percorrere. Può sembrare abbastanza semplice, ma una volta che inizi a sacrificare i bambini piccoli agli dei empi di SDL, cose come SDL_image (perfetto per leggere numerosi formati di file di immagini - nella misura in cui a volte uso SDL solo per leggere ad esempio JPEG) o SDL_mixer (unica soluzione di cui hai bisogno per leggere e riprodurre audio di base - OGG, WAV, ...).

Quindi non cercare oltre SDL. Anche il supporto per la grafica 2D è buono una volta che inizi a usare SDL_gfx. All'inizio SDL può sembrare di base, ma una volta contati in tutte le librerie extra costruite attorno ad esso, e una volta che hai codificato alcuni wrapper, vedrai che SDL è il perfetto equilibrio tra necessità indispensabili e facilità d'uso avanzato.

Sarò felice di aiutarti in ogni modo con SDL poiché lo trovo fantastico.

Potrei fraintendere quello che stai vedendo qui, ma guardando il codice chiave restituito comporterà differenze hardware, di sistema operativo, di configurazione e della piattaforma, quindi dovresti guardare codice chiave virtuale restituito da un evento chiave .

EDIT: forse wxWidgets non lo gestisce bene (dubbia) . Il problema del tasto numerico è "forzare". per ovviare a questo (male) utilizzando il codice di scansione non elaborato.

In tal caso non è necessario eliminare ciò che hai fatto, ma se aggiungi SDL solo per l'input, troverai chiamate che restituiscono il SDL_keysym don restituisci semplicemente lo scancode hardware (di cui non puoi fare nulla per "riparare") ma anche mapparlo su un carattere unicode e un simbolo virtuale, che credo sia quello che stai cercando. Speriamo che le loro chiamate non abbiano questo problema con il modificatore di numlock.

Se non vuoi usare SDL, ti consiglio SFML - Libreria multimediale semplice e veloce . È multipiattaforma e davvero semplice da usare. Ad esempio, dalla sezione tutorial :

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

dove si trova l'input

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

Ci sono alcune indicazioni che SFML è più veloce di SDL, tuttavia tendo a usarlo per estrarre codice veloce e portatile poiché mi piace il suo utilizzo più di SDL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top