福野泰介の一日一創 - create every day

OpenGLとC言語で始めるパソコン用ゲームづくり

2016/12/02
#OpenGL #KidsIT 

長野高専の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 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像