2009-09-10 72 views
3

我有一款遊戲需要我允許玩家通過網絡與對方聊天。一切都很好,除了玩家可以輸入Unicode輸入的部分。遊戲中的Unicode輸入處理

所以,這個問題可以分成兩個部分:

  • 當玩家類型,我該如何捕獲輸入?我之前通過遊戲輸入處理(輪詢)完成了此操作,但是,它不像Windows窗體那樣具有響應性。

  • 將輸入捕獲到字符串後,如何使用TrueType字體輸出它?我問這個問題的原因是因爲通常我會在遊戲開始時使用遊戲中使用的所有文本創建位圖字體。但是對於unicode輸入,需要近10k個字符,這在遊戲開始時是不可能建立的。

P.S.我的目標輸入語言對中文,韓文和日文更具體。

回答

8

輸入

  1. 使用SDL_EnableUNICODE啓用Unicode輸入處理
  2. 接收的SDL_keysymSDL_KeyboardEvent像往常一樣
  3. 使用unicode成員得到的unicode

對於渲染

如果需要的字體大小相當小,比如說16px,那麼您實際上可以將其全部渲染爲單個紋理,您可以在這種尺寸下在1024x1024紋理上適合最少4096個字形,他們緊緊地(見示例代碼fontgen)。這對普通聊天應該足夠了,但不足以適應TTF文件的所有字形。

如果您不想使用較大的紋理大小,則必須按需生成字體,只需像往常一樣創建紋理,然後使用glTexSubImage2D將新字形上載到紋理。

另一種選擇是不使用紋理的字形,而是使用文字本身。這樣你就可以繞開所有的字形生成問題。但它對於非靜態可編輯文本可能不是一個好主意。

+0

謝謝sooo多!我一直在思考這個問題。乾杯! – Roy 2009-09-10 17:46:26

0

當玩家打字時,我該如何捕捉 輸入?

這取決於你使用我猜。我不熟悉SDL。在Linux上,你可以使用標準的X函數和事件循環,它運行良好(例如在Quake中使用;因此它應該足夠反應)。

將輸入捕獲到字符串後,如何使用TrueType字體輸出它?

你應該看看FreeType2庫。它可讓您加載TrueType字體,並檢索任何字符的字形(圖像)。

但是使用unicode輸入,需要將近10k個字符,這在遊戲開始時是不可能建立的。

我有同樣的問題。我猜想一個擁有MRU(最近使用的)字符的緩存管理器可以做到這一點。雖然我比簡單的靜態位圖更復雜一點。

0

以下是一些代碼,顯示如何使用SDL捕獲鍵盤輸入。

首先,您需要通過調用EventPoll來查詢來自SDL的鍵輸入。 無論何時您準備好處理輸入,或者定期以 的固定間隔將鍵和鍵盤狀態存儲在內部表格中,您都可以做到這一點。

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/

你可能想要做的就是捕捉鍵盤輸入,並使其使用正確的字體飛(S )你已經預裝了。

0

我所做的沒有遊戲開發我自己,所以我有東西在那裏工作只是一個模糊的概念,但這裏是我的2美分:

不緩存在程序的開始所有的字形。相反,當您必須顯示聊天字符串時,請將整個字符串即時渲染爲一些新紋理。將此紋理保留在內存中,直到不再需要它爲止(例如,在聊天窗口關閉後)。也許你可以在更新時重新渲染整個聊天窗口 - 那麼你只會有一個紋理擔心。

0

就顯示效果而言,我對this tutorial中描述的緩存系統有很好的運氣,音譯爲C++。

對於字體,GNU Unifont有完整的BMP字形覆蓋範圍,以方便的TTF形式提供。