#include <gl/glut.h>
float X = 0;
float Y = 0;
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex2d(X-0.1,Y-0.1);
glVertex2d(X-0.1,Y+0.1);
glVertex2d(X+0.1,Y+0.1);
glVertex2d(X+0.1,Y-0.1);
if (X == 1.0 || X == -1.0) {//虚像
glVertex2d(-X - 0.1, Y - 0.1);
glVertex2d(-X - 0.1, Y + 0.1);
glVertex2d(-X + 0.1, Y + 0.1);
glVertex2d(-X + 0.1, Y - 0.1);
}
if (Y == 1.0 || Y == -1.0) {//虚像
glVertex2d(X - 0.1,-Y - 0.1);
glVertex2d(X - 0.1,-Y + 0.1);
glVertex2d(X + 0.1,-Y + 0.1);
glVertex2d(X + 0.1,-Y - 0.1);
}
glEnd();
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'a':
case 127:
X -= 0.2;
break;
case 'w':
case 27:
Y += 0.2;
break;
case 's':
case' ':
X += 0.2;
break;
case 'z':
case 'E':
Y -= 0.2;
break;
default:
break;
}
//入力補正
if (X > 1.0) X = -1;
if (X < -1.0) X = 1;
if (Y > 1.0) Y = -1;
if (Y < -1.0) Y = 1;
//強制再描画
glutPostRedisplay();
}
//サイズ変更
void Resize(int w, int h)
{
//ビューポート設定
glViewport(0, 0, w, h);
//変換行列の初期化
glLoadIdentity();
gluPerspective(60.0, w / static_cast<GLdouble>(h), 1.0, -1.0);
gluLookAt(0, 0, 1.75, 0, 0, 0, 0, 1, 0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(480, 480);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutReshapeFunc(Resize);
glClearColor(1.0, 0.0, 1.0, 0.0);
glutMainLoop();
return 0;
}
I2luY2x1ZGUgPGdsL2dsdXQuaD4KCmZsb2F0IFggPSAwOwpmbG9hdCBZID0gMDsKCnZvaWQgZGlzcGxheSh2b2lkKSB7CgoJZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKCglnbEJlZ2luKEdMX1FVQURTKTsKCWdsVmVydGV4MmQoWC0wLjEsWS0wLjEpOwoJZ2xWZXJ0ZXgyZChYLTAuMSxZKzAuMSk7CglnbFZlcnRleDJkKFgrMC4xLFkrMC4xKTsKCWdsVmVydGV4MmQoWCswLjEsWS0wLjEpOwoJaWYgKFggPT0gMS4wIHx8IFggPT0gLTEuMCkgey8v6Jma5YOPCgkJZ2xWZXJ0ZXgyZCgtWCAtIDAuMSwgWSAtIDAuMSk7CgkJZ2xWZXJ0ZXgyZCgtWCAtIDAuMSwgWSArIDAuMSk7CgkJZ2xWZXJ0ZXgyZCgtWCArIDAuMSwgWSArIDAuMSk7CgkJZ2xWZXJ0ZXgyZCgtWCArIDAuMSwgWSAtIDAuMSk7Cgl9CglpZiAoWSA9PSAxLjAgfHwgWSA9PSAtMS4wKSB7Ly/omZrlg48KCQlnbFZlcnRleDJkKFggLSAwLjEsLVkgLSAwLjEpOwoJCWdsVmVydGV4MmQoWCAtIDAuMSwtWSArIDAuMSk7CgkJZ2xWZXJ0ZXgyZChYICsgMC4xLC1ZICsgMC4xKTsKCQlnbFZlcnRleDJkKFggKyAwLjEsLVkgLSAwLjEpOwoJfQoJZ2xFbmQoKTsKCglnbEZsdXNoKCk7Cgp9CnZvaWQga2V5Ym9hcmQodW5zaWduZWQgY2hhciBrZXksIGludCB4LCBpbnQgeSkKewoJc3dpdGNoIChrZXkpIHsKCWNhc2UgJ2EnOgoJY2FzZSAxMjc6CgkJWCAtPSAwLjI7CgkJYnJlYWs7CgljYXNlICd3JzoKCWNhc2UgMjc6CgkJWSArPSAwLjI7CgkJYnJlYWs7CgljYXNlICdzJzoKCWNhc2UnICc6CgkJWCArPSAwLjI7CgkJYnJlYWs7CgljYXNlICd6JzoKCWNhc2UgJ0UnOgoJCVkgLT0gMC4yOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgkvL+WFpeWKm+ijnOatowoJaWYgKFggPiAgMS4wKSAgWCA9IC0xOwoJaWYgKFggPCAtMS4wKSBYID0gMTsKCWlmIChZID4gIDEuMCkgIFkgPSAtMTsKCWlmIChZIDwgLTEuMCkgWSA9IDE7CgkvL+W8t+WItuWGjeaPj+eUuwoJZ2x1dFBvc3RSZWRpc3BsYXkoKTsKfQoKLy/jgrXjgqTjgrrlpInmm7QKdm9pZCBSZXNpemUoaW50IHcsIGludCBoKQp7CgkvL+ODk+ODpeODvOODneODvOODiOioreWumgoJZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKCgkvL+WkieaPm+ihjOWIl+OBruWIneacn+WMlgoJZ2xMb2FkSWRlbnRpdHkoKTsKCglnbHVQZXJzcGVjdGl2ZSg2MC4wLCB3IC8gc3RhdGljX2Nhc3Q8R0xkb3VibGU+KGgpLCAxLjAsIC0xLjApOwoJZ2x1TG9va0F0KDAsIDAsIDEuNzUsIDAsIDAsIDAsIDAsIDEsIDApOwoKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOwoKCWdsdXRJbml0RGlzcGxheU1vZGUoR0xVVF9SR0JBKTsKCWdsdXRJbml0V2luZG93U2l6ZSg0ODAsIDQ4MCk7CglnbHV0Q3JlYXRlV2luZG93KGFyZ3ZbMF0pOwoJCglnbHV0RGlzcGxheUZ1bmMoZGlzcGxheSk7CglnbHV0S2V5Ym9hcmRGdW5jKGtleWJvYXJkKTsKCWdsdXRSZXNoYXBlRnVuYyhSZXNpemUpOwoKCWdsQ2xlYXJDb2xvcigxLjAsIDAuMCwgMS4wLCAwLjApOwoKCWdsdXRNYWluTG9vcCgpOwoKCXJldHVybiAwOwp9