シューティングゲームの原型。 敵機、自機の移動まで!
shooting.cpp
# include <GLUT/glut.h>
# include <cmath>
# include <iostream>
# include <cstdlib>
using namespace std;
# define WIDTH 640
# define HEIGHT 480
# define PI 3.141592
class Enemy{
private:
float xr; // x軸の半径
float yr; // y軸の半径
float x; // x座標
float y; // y座標
public:
void genel(int Num); // 円生成
Enemy(); // 初期化コストラクタ
};
static float movex = 0.0; // 自機のx軸移動値
float mx = (30.0 / 640.0); // 自機のx軸
float my = (30.0/480.0); // 自機のy軸
float mh = -1 + (30 * sqrt(3)) / 480 + my; // 自機の三角の頂点
static float Emovex = 0.0; // 敵機のx軸移動値
int l = 1; // 円を動かす変数の符号を判断する
Enemy::Enemy(){ // 円の半径
xr = 60.0/640.0;
yr = 60.0/480.0;
}
void Enemy::genel(int Num){ // 円生成
glColor3d(1.0, 1.0, 0.0);
glBegin(GL_POLYGON);
for(int i = 0; i < 1000; ++i){
x = -(520.0/640.0) + xr * cos(i);
y = (360.0/480.0) + yr * sin(i);
glVertex2f((x + (240.0/640.0) * Num ) + Emovex ,y);
// クラス配列で生成した時に軸をズラす
}
}
e.jo
void display(){
Enemy e[5];
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < 5; ++i){
e[i].genel(i); // 円作成
glEnd(); // 5つループで生成するため、中にglEndを入れる
}
glBegin(GL_POLYGON); // 三角(自機)の生成
glVertex2f(-mx + movex, -1 + my);
glVertex2f(mx + movex, -1 + my);
glVertex2f(0 + movex, mh);
glEnd();
glutSwapBuffers(); // ダブルバッファリングの関数
}
void shoot(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
float shootx = (5/640)
}
void keyboard(unsigned char key, int x, int y){
switch(key){
case 'a': // a を入力すると左に動く
case 'A':
if(-mx * 2 + movex > -1){
movex -= 0.05;
glutPostRedisplay();
}
break;
case 'd': // d を入力すると右に動く
case 'D':
if(mx * 2 + movex < 1){
movex += 0.05;
glutPostRedisplay();
}
break;
case 'q': // q Q ESC を入力するとプログラム終了
case 'Q':
case '\033':
exit(0);
default: break;
}
}
void timer(int value){ // 毎秒ごとに再描画して、アニメーションさせる
if(0.0 < Emovex && Emovex < 0.2){ // 範囲内の時に動かす
Emovex += l * 0.01;
}else{
l = -1 * l; // 範囲外にきたら符号を逆転させる
Emovex += l * 0.01;
}
glutPostRedisplay(); // 再描画
glutTimerFunc(40, timer, 0); // 第一引数毎秒で繰り返す
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0); // 背景色 黒
}
int main(int argc, char *argv[]){
glutInitWindowPosition(100, 200);
glutInitWindowSize(WIDTH, HEIGHT);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutTimerFunc(100, timer, 0);
init();
glutMainLoop();
return 0;
}