Pregunta

Tengo un juego que requiere que permita a los jugadores chatear entre ellos a través de la red. Todo está bien, excepto la parte donde los jugadores pueden escribir la entrada Unicode.

Entonces, la pregunta se puede dividir en dos partes:

  • Cuando los jugadores escriben, ¿cómo capturo la entrada? Lo he hecho antes a través del manejo de entrada del juego (sondeo), sin embargo, no responde tan bien como algo como Windows Forms.

  • Después de capturar la entrada en una cadena, ¿cómo la envío usando fuentes TrueType? La razón por la que pregunto esto es porque generalmente, construiría fuentes de mapa de bits al comienzo del juego de todo el texto utilizado en el juego. Pero con la entrada Unicode, se necesitan casi 10k caracteres, lo cual es bastante imposible de construir al comienzo del juego.

P.S. Mis idiomas de entrada de destino son más específicos para chino, coreano y japonés.

¿Fue útil?

Solución

Para entrada

  1. Use SDL_EnableUNICODE para habilitar el manejo de entrada unicode
  2. Reciba el SDL_KeyboardEvent como de costumbre
  3. Utilice el miembro unicode de SDL_keysym para obtener el unicode

Para renderizar

Si el tamaño de fuente necesario es razonablemente pequeño, digamos 16px, en realidad podría representarlo todo en una sola textura, puede ajustar un mínimo de 4096 glifos en una textura de 1024x1024 a ese tamaño, un poco más cuando los empaqueta firmemente (consulte fontgen para ver el código). Eso debería ser suficiente para el chat común, pero no suficiente para todos los glifos de un archivo TTF.

Si no desea usar un tamaño de textura más grande, debe generar las fuentes a pedido, para hacerlo, simplemente cree las texturas como de costumbre y luego use glTexSubImage2D para cargar nuevos glifos en la textura.

Otra alternativa es no usar texturas para glifos, sino para el texto en sí. De esa manera, evitas todos los problemas que genera la generación de glifos. Pero probablemente no sea una buena idea para texto editable no estático.

Otros consejos

  

Cuando los jugadores escriben, ¿cómo puedo capturar   entrada?

Eso depende de lo que uses, supongo. No estoy familiarizado con SDL. En Linux, puede usar funciones X estándar y bucle de eventos, funciona bien (se usa en Quake, por ejemplo, por lo que debería ser lo suficientemente reactivo).

  

Después de capturar la entrada en una cadena, ¿cómo lo hago con fuentes TrueType?

Deberías echar un vistazo a la biblioteca FreeType2. Te permite cargar fuentes TrueType y recuperar el glifo (la imagen) de cualquier carácter.

  

Pero con la entrada Unicode, se necesitan casi 10k caracteres, lo cual es bastante imposible de construir al comienzo del juego.

Tengo el mismo problema. Supongo que un administrador de caché con caracteres MRU (utilizado más recientemente) sería suficiente. Aunque soy un poco más complicado que un simple mapa de bits estático.

Aquí hay un código que muestra cómo capturar la entrada del teclado con SDL.

En primer lugar, debe consultar la entrada de claves de SDL llamando a EventPoll. Puede hacerlo cuando esté listo para procesar la entrada, o regularmente en un intervalo fijo y almacenar teclas y estado del teclado en tablas internas.

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 
}

Aquí hay un enlace a un documento que describe métodos para representar texto con OpenGL: http: / /www.opengl.org/resources/features/fontsurvey/

Lo que quizás quieras hacer es capturar la entrada del teclado y renderizarla sobre la marcha utilizando las fuentes adecuadas que hayas cargado previamente.

Yo mismo no he desarrollado juegos, así que tengo una vaga idea de cómo funcionan las cosas allí, pero aquí están mis 2 centavos:

No almacene en caché todos los glifos al inicio del programa. En cambio, cuando tiene que mostrar una cadena de chat, convierta toda la cadena sobre la marcha a una nueva textura. Mantenga esta textura en la memoria hasta un momento en que sea poco probable que se vuelva a necesitar (por ejemplo, después de cerrar la ventana de chat). Quizás pueda volver a renderizar toda la ventana de chat cuando se actualice, entonces solo tendría una textura de la que preocuparse.

En lo que respecta a la visualización, he tenido muy buena suerte con el sistema de almacenamiento en caché descrito en este tutorial , transcrito a C ++.

Para las fuentes, GNU Unifont tiene BMP cobertura de glifos, disponible en el conveniente formulario TTF.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top