Обработка ввода в Unicode в играх - PullRequest
3 голосов
/ 10 сентября 2009

У меня есть игра, которая требует от меня, чтобы игроки могли общаться друг с другом по сети. Все хорошо, кроме той части, где игроки могут вводить данные в Unicode.

Итак, вопрос можно разделить на две части:

  • Когда игроки набирают текст, как мне захватить ввод? Я делал это раньше с помощью обработки ввода (опроса) в игре, однако это не так отзывчиво, как в Windows Forms.

  • После того, как я записал ввод в строку, как мне вывести его с использованием шрифтов TrueType? Причина, по которой я спрашиваю это, заключается в том, что обычно я строю растровые шрифты в начале игры из весь текст, используемый в игре. Но при вводе Юникода требуется около 10 тыс. Символов, которые невозможно собрать в начале игры.

P.S. Мои целевые языки ввода более специфичны для китайского, корейского и японского языков.

Ответы [ 5 ]

8 голосов
/ 10 сентября 2009

для ввода

  1. Используйте SDL_EnableUNICODE , чтобы включить обработку ввода Unicode
  2. Получите SDL_KeyboardEvent как обычно
  3. Используйте unicode член SDL_keysym , чтобы получить Unicode

Для рендеринга

Если необходимый размер шрифта достаточно мал, скажем, 16px, вы на самом деле можете просто отобразить все это на одной текстуре, вы можете разместить как минимум 4096 глифов на текстуре 1024x1024 с таким размером, немного больше, если вы упакуете их плотно (см. fontgen , например, код). Этого должно быть достаточно для обычного чата, но недостаточно для размещения всех символов TTF-файла.

Если вы не хотите использовать текстуру большего размера, вам нужно сгенерировать шрифты по требованию, для этого просто создайте текстуры как обычно, а затем используйте glTexSubImage2D для загрузки новых глифов в текстуру. .

Другой альтернативой является не использование текстур для глифов, а для самого текста. Таким образом вы обойдете все проблемы, возникающие при создании глифов. Но, вероятно, не очень хорошая идея для нестатического редактируемого текста.

0 голосов
/ 10 сентября 2009

Что касается отображения, мне очень повезло с системой кэширования, описанной в этом руководстве , транслитерированной на C ++.

Для шрифтов GNU Unifont имеет полное BMP покрытие глифа, доступно в удобной форме TTF.

0 голосов
/ 10 сентября 2009

Вот некоторый код, показывающий, как захватить ввод с клавиатуры с помощью SDL.

Прежде всего вам нужно запросить ввод ключа из SDL, вызвав EventPoll. Вы можете делать это всякий раз, когда вы готовы обрабатывать ввод или регулярно фиксированный интервал и сохранение ключей и состояния клавиатуры во внутренних таблицах.

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 
}

Вот ссылка на документ, описывающий методы визуализации текста с помощью OpenGL: http://www.opengl.org/resources/features/fontsurvey/

То, что вы, возможно, захотите сделать, это захватить ввод с клавиатуры и отобразить его «на лету» с использованием того шрифта, который вы предварительно загрузили.

0 голосов
/ 10 сентября 2009

Я сам не занимался разработкой игр, поэтому у меня есть смутное представление о том, как там все работает, но вот мои 2 цента:

Не кэшируйте все глифы в начале программы. Вместо этого, когда вам нужно отобразить строку чата, визуализируйте всю строку на лету в какую-то новую текстуру. Храните эту текстуру в памяти до тех пор, пока маловероятно, что она понадобится снова (скажем, после закрытия окна чата). Возможно, вы сможете заново визуализировать все окно чата, когда оно будет обновлено - тогда у вас будет только одна текстура для беспокойства.

0 голосов
/ 10 сентября 2009

Когда игроки набирают, как мне захватить ввод

Это зависит от того, что вы используете, я думаю. Я не знаком с SDL. В Linux вы можете использовать стандартные функции X и цикл обработки событий, он хорошо работает (например, в Quake; поэтому он должен быть достаточно реактивным).

Как после ввода ввода в строку как вывести его с использованием шрифтов TrueType?

Вы должны взглянуть на библиотеку FreeType2. Он позволяет загружать шрифты TrueType и извлекать глиф (изображение) любого символа.

Но при вводе Юникода требуется почти 10 тыс. Символов, которые невозможно собрать в начале игры.

У меня та же проблема. Я думаю, что менеджер кеша с MRU (недавно использовавшимися) символами справился бы с задачей. Я немного сложнее, чем простой статический растр.

...