2009-09-10 2 views
3

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

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

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

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

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

ответ

8

Для входа

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

для Рендеринг

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

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

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

+0

Спасибо, что так много! Я размышлял об этом целую вечность. Ура! – Roy

0

Когда типы игроков, как я могу захватить вход?

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

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

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

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

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

0

Вот какой код показывает, как захватить ввод с клавиатуры 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

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

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

0

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

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

Смежные вопросы