近く、グラフィックを使ったプログラムを書くつもりなので、それに先立ってサンプルを書いてみる。後ほどHaskellで再挑戦予定。
実は。カテゴリはOpenGLでなくて、GLUTが正しそうだけど、大目に見てください。
わたしが使っている環境はMac OS Xなので、LinuxやMS-Windowsではファイルパスとかが違うかも。
以下、コード。
#include <cstdlib> #include <GLUT/glut.h> struct Point { int x; int y; int vx; int vy; }; static const int Interval = 200; static Point p1 = { 10, 10, 8, -2 }; static Point p2 = { 310, 230, -6, 4 }; static int width = 320; static int height = 240; void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); glVertex2i(p1.x, p1.y); glVertex2i(p2.x, p2.y); glEnd(); glFlush(); } void resize(int w, int h) { glViewport(0, 0, w, h); width = w; height = h; glLoadIdentity(); glOrtho(-0.5, w - 0.5, h - 0.5, -0.5, -1.0, 1.0); } void keyboard(unsigned char key, int, int) { switch(key) { case 'q': case 'Q': case '?033': std::exit(0); break; default: break; } } void timer(int) { p1.x += p1.vx; if((p1.x < 0) || (width < p1.x)) { p1.vx = -p1.vx; } p1.y += p1.vy; if((p1.y < 0) || (height < p1.y)) { p1.vy = -p1.vy; } p2.x += p2.vx; if((p2.x < 0) || (width < p2.x)) { p2.vx = -p2.vx; } p2.y += p2.vy; if((p2.y < 0) || (height < p2.y)) { p2.vy = -p2.vy; } glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); glVertex2i(p1.x, p1.y); glVertex2i(p2.x, p2.y); glEnd(); glFlush(); glutTimerFunc(Interval, timer, 0); } int main(int argc, char* argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(width, height); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); glutKeyboardFunc(keyboard); glutTimerFunc(Interval, timer, 0); glClearColor(1.0, 1.0, 1.0, 1.0); glutMainLoop(); return 0; }
コンパイルはこんな感じ。
g++ -framework OpenGL -framework GLUT -framework Foundation program.cpp