2016年03月29日

SDL2で日本語入力

かれこれ1ヵ月ほど日本語関連のコードばかり書いてるので、そろそろ絵的なコードが書きたくなっている今日この頃。

前回はFreeType2で日本語入力を実装しましたが、今回は日本語入力をやっつけました。
SDL2に日本語の文字入力をサポートしてくれる機能があるので、それを使えば簡単に実装できます。

まずはチュートリアルをご紹介。
https://wiki.libsdl.org/Tutorials/TextInput

日本語訳もあったよ。
http://sdl2referencejp.osdn.jp/TextInput.html

このチュートリアルのコードを使えばIMEと直接的なやり取りをせず日本語入力ができます。
SDLなのでマルチプラットフォームな日本語入力にも対応できるはずです。
ちなみに私はWindowsのVS2013で動作確認しましたが、変換候補リストが表示されなかったこと以外は、特に問題なく入力や変換することができました。
変換候補リストについては、個人的には無くても全く問題ない機能なので無理に実装するつもりはありません。
原因と対処方法が分かればもちろん実装しますけど。
(SDL_Rendererを使ってないことが原因じゃないかと睨んでいますが、SDL_Rendererを使うつもりはないです・・テストもしたくない;)


チュートリアルで行っている処理の流れを簡単に説明します。
日本語の文字を入力すると、まずグローバル変数のcompositionに編集中の文字列(UTF-8)が渡ります。
そして入力を確定させたら、compositionの文字列はグローバル変数のtext(UTF-8)の末尾に追加されます。

基本的にはたったのこれだけです。
あとはバッファの開け閉めをしてるくらい。
とっても簡単ですね。

・・と見せかけて、実はチュートリアルの実装だけだと文字の入力や漢字カナ変換といった編集はできても、その様子を視覚的に確認することができません。
なので、text、compositionの中身を、SDL_ttfなどを使って自分で描画してやる必要があります。

描画を実装すればそれでほぼ完成です。
あとはEditBox的なGUIを実装して、文字入力してるっぽい演出を足してやれば良い感じになるかと思います。
入力した文字を再編集する機能なども自作になりますが、グローバル変数のtextに対する文字操作と視覚効果を連動させれば良いだけなので、それほど長いコードにはならないはずです。
まあ私はもうお腹いっぱいなので、その辺の実装はパスしてここでひと段落としますが。。
(でもBSキーの削除機能くらいはないと不便とは思う・・)

ということで、日本語関連の処理はこれでおしまいです。
次は絵的なコードを書いていこうと思います。
とりあえずライティング処理を全く書いてないので、その辺の実装から手を付ける予定です。
それから、マテリアルがただのシェーダーIDになっているので、この辺もローダーレベルでしっかりと書き直したいですね。
昔、BGEで書いたGLSLのコードが活躍しそう。
posted by gency at 21:48| Comment(0) | 3DProgramming

2016年03月15日

Bulletとその他

一気にいろいろやりましたので、動画でまとめてご紹介。



更新は下記の通りです。

・FreeTypeを使ったフォント描画機能を自作
・SFMLからSDLに引っ越し
・Bullet実装

何か上の2つが地味に大変ですが。
時間がかかったのは完全にこいつらせいですね、はい。
Bulletは既存のものを移植しただけです。
機能は少ないですけど。
衝突判定と簡単な物理演算しかできないので、今後はもっと機能を拡充していきたい所存。
当面の目標としては、下の動画くらいのことができるようにしたいですね。



これはGodotEngineで作ったデモです。
このデモに実装されている物理演算は下のとおり。

・レイキャストを使ったカメラコリジョン
・ボーンに接合されたセンサーによる衝突判定(尻尾の先のCubeがそれ)
・floor velocityによる移動(リフトに乗って移動できる)

カメラコリジョンは暫時実装したいところです。

なお、このデモは今はもう開発はしてないですが、コードスニペットとして現役で活躍しています。
操作性が良くて動かすだけでも楽しいので、たまに起動して遊んだりもしてます。
あと、昔作ったテトさんのゲームのコードもスニペット的に重宝してます。
テトさんのゲームでは、いわゆる「パルクール」というアクションを実装しているので、パルクールを実装するために必要となる物理演算機能を実装するときに、参考になるコードになろうかと思います。
まあ、まだだいぶ先の話ですけども。

posted by gency at 07:24| Comment(0) | 3DProgramming