スポンサーリンク

GLFW3でタイマー(と同じ事)を使う

glfw3にはタイマー、つまり指定した時間が経ったら呼び出されるコールバック関数を指定するような機能が無い。従ってループ内でglfwGetTime()関数で現在時刻を秒単位で取得し、前回時刻取得時から目的の秒数だけ経ったら処理を実行することでタイマーと同じ効果を出す。

#include <cstdlib>
#include <iostream>

#include <Windows.h>
#include <gl/GL.h>
#include <GLFW/glfw3.h>

#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glfw3.lib")

int main()
{
  ////////////////////////////////////////////////////////////////////////////////
  // GLFW の初期化
  if (glfwInit() == GL_FALSE) {
    // 初期化に失敗したら終了
    return 1;
  }

  ////////////////////////////////////////////////////////////////////////////////
  // ウィンドウを作成
  GLFWwindow* window = glfwCreateWindow(
    400,       //width
    400,       //height
    "window title",//title 
    NULL,      //monitor
    NULL       //share
  );

  ////////////////////////////////////////////////////////////////////////////////
  // ウィンドウを作成できなければ終了
  if (window == nullptr) {
    glfwTerminate();
    return 1;
  }

  glfwMakeContextCurrent(window);
 
  double prev = glfwGetTime();
  const double TIME = 0.1;

int angle = 0; while (glfwWindowShouldClose(window) == GL_FALSE) { int width, height; glfwGetFramebufferSize(window, &width, &height); ///////////////////// // 描画 glViewport(0, 0, width, height); glOrtho(-1, 1, -1, 1, -1, 1); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glPushMatrix();
    // glfwGetTime()で現在時刻を秒で取得
    double now = glfwGetTime();

    // 現在時刻 - 前回更新時刻 が TIME秒より開いていたら
    // 定期的に行いたい処理を実行する
    if (now - prev > TIME) {
      prev = now; // 前回更新時刻更新

      // ここで関数呼び出しなど必要な処理を行う
      // 今回はangleを増加するのみ。
      printf("angle %d\n",angle);
      angle += 15;


    }
    glRotatef(angle, 1, 0, 0);


    glBegin(GL_QUADS);
    glColor3d(1, 0, 0);
    glVertex2d(-0.7, -0.7);
    glColor3d(0, 1, 0);
    glVertex2d(-0.7, 0.7);
    glColor3d(0, 0, 1);
    glVertex2d(0.7, 0.7);
    glColor3d(1, 1, 1);
    glVertex2d(0.7, -0.7);
    glEnd();

    glPopMatrix();

    glFlush();


    glfwSwapBuffers(window);

    // イベント取得
    //glfwWaitEvents();
    glfwPollEvents();

  }

  glfwTerminate();

}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: