Domanda

Ho un gioco che mi richiede di consentire ai giocatori di chattare tra loro tramite la rete. Va tutto bene, tranne la parte in cui i giocatori possono digitare l'input Unicode.

Quindi, la domanda può essere divisa in due parti:

  • Quando i giocatori digitano, come posso catturare l'input? l'ho già fatto tramite la gestione dell'input di gioco (polling), tuttavia non è così reattivo come qualcosa come Windows Forms.

  • Dopo aver acquisito l'input in una stringa, come posso inviarlo usando TrueType Fonts? Il motivo per cui lo chiedo è perché di solito, costruivo font bitmap all'inizio del gioco da tutto il testo utilizzato nel gioco. Ma con l'input unicode, ci sono quasi 10k caratteri necessari, il che è abbastanza impossibile da costruire all'inizio del gioco.

P.S. Le mie lingue di input di destinazione sono più specifiche per cinese, coreano e giapponese.

È stato utile?

Soluzione

Per input

  1. Utilizza SDL_EnableUNICODE per abilitare la gestione dell'input unicode
  2. Ricevi SDL_KeyboardEvent come al solito
  3. Utilizza il membro unicode di SDL_keysym per ottieni l'unicode

Per il rendering

Se la dimensione del carattere richiesta è ragionevolmente piccola, diciamo 16px, in realtà potresti semplicemente renderlo tutto su una singola trama, puoi adattare un minimo di 4096 glifi su una trama 1024x1024 a quella dimensione, un po 'di più quando li impacchi strettamente (vedi fontgen per esempio codice). Questo dovrebbe essere sufficiente per la chat comune, ma non abbastanza per adattarsi a tutti i glifi di un file TTF.

Se non vuoi usare una trama più grande devi generare i caratteri su richiesta, per farlo basta creare le Texture come al solito e quindi usare glTexSubImage2D per caricare nuovi glifi nella trama.

Un'altra alternativa è non usare le trame per i glifi, ma per il testo stesso. In questo modo si evitano tutti i problemi che la generazione di glifi produce. Ma probabilmente non è una buona idea per il testo modificabile non statico.

Altri suggerimenti

  

Quando i giocatori digitano, come posso catturare   ingresso?

Dipende da cosa usi, suppongo. Non ho familiarità con SDL. Su Linux puoi usare le funzioni X standard e il loop degli eventi, funziona bene (usato ad esempio in Quake; quindi dovrebbe essere abbastanza reattivo).

  

Dopo aver acquisito l'input in una stringa, come posso inviarlo usando i font TrueType?

Dovresti dare un'occhiata alla libreria FreeType2. Ti consente di caricare i caratteri TrueType e di recuperare il glifo (l'immagine) di qualsiasi carattere.

  

Ma con l'input unicode, sono necessari quasi 10k caratteri, il che è abbastanza impossibile da costruire all'inizio del gioco.

Ho lo stesso problema. Immagino che un gestore di cache con caratteri MRU (usati più di recente) farebbe il trucco. Tuttavia, sono un po 'più complicato della semplice bitmap statica.

Ecco un codice che mostra come acquisire l'input da tastiera con SDL.

Prima di tutto devi interrogare l'input della chiave da SDL chiamando EventPoll. Puoi farlo ogni volta che sei pronto per elaborare l'input o regolarmente un intervallo fisso e memorizzare i tasti e lo stato della tastiera nelle tabelle interne.

void EventPoll (ulong mask)
{
SDL_Event event;
while (SDL_PollEvent (&event)) {
   switch(event.type) {
      case SDL_KEYDOWN:
         KeyHandler (reinterpret_cast<SDL_KeyboardEvent*> (&event));
         break;
      case SDL_KEYUP:
         KeyHandler (reinterpret_cast<SDL_KeyboardEvent*> (&event));
         break;
      // handle other events
      }
   }
}

void KeyHandler (SDL_KeyboardEvent *event)
{
   SDLKey      keySym = event->keysym.sym;
   wchar_t     unicode = event->keysym.unicode;
   int         keyState = (event->state == SDL_PRESSED);

// process key info, e.g. put key into a buffer and 
// store keyboard state 
}

Ecco un link a un documento che descrive i metodi per rendere il testo con OpenGL: http: / /www.opengl.org/resources/features/fontsurvey/

Quello che potresti voler fare è catturare l'input da tastiera e renderlo al volo usando i caratteri corretti che hai precaricato.

Non ho sviluppato personalmente alcun gioco, quindi ho solo una vaga idea di come funzionano le cose lì, ma ecco i miei 2 centesimi:

Non memorizzare nella cache tutti i glifi all'inizio del programma. Invece, quando devi mostrare una stringa di chat, rendi l'intera stringa al volo su una nuova trama. Mantieni questa trama in memoria fino a quando è improbabile che sia necessaria di nuovo (diciamo, dopo che la finestra di chat è chiusa). Forse puoi ri-renderizzare l'intera finestra della chat quando viene aggiornata, quindi avresti solo una trama di cui preoccuparti.

Per quanto riguarda la visualizzazione, ho avuto molta fortuna con il sistema di memorizzazione nella cache descritto in questo tutorial , traslitterato in C ++.

Per i caratteri, GNU Unifont ha BMP copertura del glifo, disponibile in comodo modulo TTF.

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