30
今日もコード書いとる??

拙iPhoneアプリ『ういろう』の諸々が一段落したので新作アプリに取り掛かるぜー!!と思ってネットをウロウロしたとたん、libpng1.6.8がリリースされとるわ、Emacs24.3 hackers-only patch 4.6がリリースされとるわ、GLFW3.0.4がリリースされとるわで、新年早々新春ビルド祭り開催決定!!みたいな年始だった。きっと拙者は2014年もビルドに明け暮れる事になるとのお達しなのでございましょう。

さてそのGLFWの新しいバージョン「GLFW3」なのですがこれがたいへん素晴らしい。拙者はOSXやWindowsでのタッチ処理の実装を待っているつもりだったのだが、これはC++使いを自負してるプログラマならいち早く体験しないと損するね。プログラマ人生における重大な損失といっても過言ではなかろう(おおげさ)

という訳でさっそくサンプルを書いてGitHubに上げておきましたのでお暇な方はチェックしてみてちょーだい。

~~以下、ダラダラと解説が続く~~
 
WindowsでもOSXでも同じコードで動作するOpenGL環境が手軽に作れるGLFW。GLFW2の頃から抜群の手軽さだったのですが、ひとつだけC++的に困った事があった。
  • GLFWのコールバックにクラスのメンバ関数を指定するのが困難
自分もこれができなくて、泣く泣くアプリ本体のインスタンスはこんな感じにしていた。

class App {
public: void createCharaInfo(const int key, const int state) { // Do something.. } }; App* app; void GLFWCALL createCharaInfo(const int key, const int state) { // クラスのメンバ関数をGLFWのコールバックに設定できないための措置 app->createCharaInfo(key, state); } int main() { app = new App(); // GLFWにキー入力のコールバックを指定 glfwSetCharCallback(charaCallback); while(app->isActive()) { app->update(); } delete app; }

つらぽよ…

ところがGLFW3ではなんとポインタを一個、覚えてくれるようになった。ポインタさえあればもうコッチのもの。これでようやくクラスのメンバ関数を簡単に呼び出せるようになった。素晴らしい!!

追記:cpp_akiraさんが素晴らしいサンプルを提示してくれました!! 多謝。 

class App {
  GLFWWindow* window_;
int a_; public: App() { // Do something..

// GLFWのウインドウを生成
window_ = glfwCreateWindow(640, 480, "App Window", nullptr, nullptr);
// GLFWのハンドルに自分自身を登録 glfwSetWindowUserPointer(window_, this); // コールバックとして静的メンバ関数を登録 glfwSetCharCallback(window_, createCharaInfo); } static void createCharaInfo(GLFWwindow* window, const u_int chara) { // ポインタからクラスのインスタンスを取り出せる!! App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); // privateなメンバにもアクセス可 app->a_ = 0; } }; int main() { // アプリのインスタンスをローカル変数にできる App app; while(app.isActive()) { app.update(); } }

ついに念願の実装が我が手に。こう書きたかったのよ。こう。


スッキリ書けるという事は正義。もし今のコードを「なんかスッキリ書けないんだよなぁ…」と思いながら書いているとしたら、「じゃあスッキリ書けてるってどーゆ書き方だ??」って考えてみるといいかもしんない。

ではまた次回!!