LoginSignup
1
3

More than 5 years have passed since last update.

shooting OpenGL 01 move

Posted at

シューティングゲームの原型。 敵機、自機の移動まで!

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;
}

スクリーンショット 2015-07-13 14.37.06.png

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3