2016-12-02
長野高専のC言語プログラミングの授業で使われているOpenGL
WindowsやMacやLinuxなど、環境問わずにグラフィクスや入力を扱えて、ハードウェアアクセラレーションも効かせてくれる便利なツール。

IchigoJamでやっているような基本、2次元モノクログラフィクスとキー入力を試してみました。これでシンプルなゲームは作れそうですねっ。
(参考、GLUTによる「手抜き」OpenGL入門

ランダムドット、スペースキーで画面再描画。sでアニメーションスタート、eで停止。qかescキーで終了。

プログラムも比較的簡単なので、IchigoJam BASICでプログラミングの基本と、タイピングに抵抗がなくなったら、大学・高専で学ぶプログラミング言語のデファクトスタンダード、C言語に触れてみるのもいいですね。マシン語にコンパイルされるのでパフォーマンスは最強クラス!

OpenGLとC言語のいいところは、プログラムがシンプルなので、コンパイル時間がほとんどかからず、BASICインタプリタ並に試行錯誤が超高速にできるのもうれしいポイント!

#include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #define SCR_W 32 #define SCR_H 24 #define RATIO 2 #define OFFSET 8 #define SCREEN_W (SCR_W * 8 * RATIO) #define SCREEN_H (SCR_H * 8 * RATIO) #define SCREEN_W2 (SCREEN_W + OFFSET * 2) #define SCREEN_H2 (SCREEN_H + OFFSET * 2) void setPixel(int x, int y, int white) { if (white) { glColor3d(1.0, 1.0, 1.0); } else { glColor3d(0.0, 0.0, 0.0); } double dx = (double)(x * RATIO + OFFSET) / SCREEN_W2 * 2.0 - 1.0; double dy = -(double)(y * RATIO + OFFSET) / SCREEN_H2 * 2.0 + 1.0; double dx2 = (double)((x + 1) * RATIO + OFFSET) / SCREEN_W2 * 2.0 - 1.0; double dy2 = -(double)((y + 1) * RATIO + OFFSET) / SCREEN_H2 * 2.0 + 1.0; glBegin(GL_POLYGON); glVertex2d(dx, dy); glVertex2d(dx2, dy); glVertex2d(dx2, dy2); glVertex2d(dx, dy2); glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); setPixel(0, 0, 1); setPixel(32 * 8 - 1, 0, 1); setPixel(32 * 8 - 1, 24 * 8 - 1, 1); setPixel(0, 24 * 8 - 1, 1); for (int i = 0; i < 100; i++) { int x = rand() % SCREEN_W; int y = rand() % SCREEN_H; setPixel(x, y, 1); } glFlush(); } void init(void) { glClearColor(0.0, 0.0, 0.0, 1.0); } void keyboard(unsigned char key, int x, int y) { printf("key: %d\n", (int)key); switch (key) { case 'q': case 'Q': case '\033': // esc exit(0); break; case ' ': glutPostRedisplay(); break; case 's': glutIdleFunc(glutPostRedisplay); break; case 'e': glutIdleFunc(0); break; default: break; } } int main(int argc, char** argv) { glutInitWindowSize(SCREEN_W2, SCREEN_H2); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("test"); glutDisplayFunc(display); glutKeyboardFunc(keyboard); init(); glutMainLoop(); return 0; }

Macでのコンパイルと実行は、下記のようにします

cc -I/usr/X11R6/include main.c -L/usr/X11R6/lib -lglut -lGLU -lGL ./a.out

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS