#include 2 #include 3 #include 4 #include 5 #include 6 7 #define H_WIN 400 // ウィンドウの幅 8 #define W_WIN 300 // ウィンドウの高さ 9 10 #define W2_HODAI 10 // 砲台の横幅の半分 11 #define H_HODAI 15 // 砲台の上面のy座標 12 #define L_HODAI 5 // 砲台の下面のy座標 13 #define L_E_BEAM 20 // 防衛軍のビームの長さ 14 #define V_E_BEAM 1.5 // 防衛軍のビームの速度 15 #define N_E_BEAM 1 // 防衛軍のビームの画面上の最大数 16 17 #define L_I_BEAM 10 // インベーダー軍のビームの長さ 18 #define V_I_BEAM 0.8 // インベーダー軍のビームの速度 19 #define P_I_BEAM 500 // インベーダー軍のビームの初期発射確率 20 21 #define N_I_BEAM 20 // インベーダー軍のビームの画面上の最大数 22 #define NXIV 9 // インベーダー軍の列の数 23 #define NYIV 4 // インベーダー軍の行の数 24 #define V_INVADER 0.1 // インベーダー軍の速度 25 26 #define NOT_DECIDE 0 27 #define INVADER 1 28 #define HUMAN 2 29 30 //---- プロトタイプ宣言 ----- 31 void initialize(void); // 初期化 32 33 void draw(void); // 図を描く 34 void draw_result(void); // 結果表示 35 void draw_hodai(void); // 防衛軍の砲台の描画 36 void draw_e_beam(void); // 防衛軍のビームの描画 37 void draw_i_beam(void); // インベーダー軍のビームの描画 38 void draw_invader(void); // インベーダー軍の描画 39 40 void change_state(void); // 状態変化に関する処理 41 void state_e_beam(void); // 防衛軍のビームの状態変化 42 void state_invader(void); // インベーダー軍の状態変化 43 void state_i_beam(void); // インベーダー軍のビーム状態変化 44 45 void mouse_xy(int x, int y); 46 void shoot(unsigned char key, int x, int y); // 防衛軍ビーム発射 47 48 void resize(int w, int h); // サイズの調整 49 void set_color(void); // 塗りつぶし色の設定 50 51 //---- グローバル変数 ------- 52 double xc = 100.0; // マウスのx座標 53 54 typedef struct{ 55 unsigned char status; // 0:dead 1:alive 56 double x, y; // 中心座標 57 }invader; 58 59 invader invd[NXIV][NYIV]; // インベーダー 60 int alive_inv=NXIV*NYIV; // 生きているインベーダーの数 61 double inv_vx=V_INVADER; // インベーダーの横方向の速度 62 63 64 typedef struct{ 65 char status; // 0:格納庫 1:砲台の上 2:移動中 66 double x; // ビームのx座標 67 double y0, y1; // ビームのy座標 y0:先頭 y1:最後尾 68 double vy; // ビームの速度 69 }beam; 70 71 beam e_beam[N_E_BEAM]; // 地球防衛軍のビーム 72 beam *p_e_beam1; // 地球防衛軍の次に発射可能なビーム 73 beam i_beam[N_I_BEAM]; // インベーダー軍のビーム 74 75 int winner = NOT_DECIDE; 76 char *win="You won a game."; 77 char *lost="You lost a game."; 78 //==================================================================== 79 // main関数 80 //==================================================================== 81 int main(int argc, char *argv[]) 82 { 83 84 initialize(); 85 glutInitWindowPosition(100,200); // 初期位置(x,y)指定 86 glutInitWindowSize(W_WIN,H_WIN); // 初期サイズ(幅,高さ)指定 87 glutInit(&argc, argv); // GLUT 初期化 88 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // 表示モードの指定 89 glutCreateWindow("space invader modoki"); // windowをタイトルを付けてを開く 90 glutDisplayFunc(draw); // イベントにより呼び出し 91 glutReshapeFunc(resize); // サイズ変更のときに呼び出す関数指定 92 glutIdleFunc(change_state); // 暇なときに実行(状態の変化) 93 glutPassiveMotionFunc(mouse_xy); // マウスイベント(砲台の移動) 94 glutKeyboardFunc(shoot); // キーボードイベント(ビームを発射) 95 set_color(); // 塗りつぶす色指定 96 glutMainLoop(); // GLUTの無限ループ 97 98 return 0; 99 } 100 101 //==================================================================== 102 // 初期化 103 //==================================================================== 104 void initialize(void) 105 { 106 int i, j; 107 108 srand((unsigned int)time(NULL)); // 乱数を発生させるため 109 110 for(i=0; i ivmax_x) ivmax_x=invd[i][j].x; // 右端 429 if(invd[i][j].y < ivmin_y) ivmin_y=invd[i][j].y; // 下の端 430 if(invd[i][j].y > ivmax_y) ivmax_y=invd[i][j].y; // 上の端 431 can_attack=0; 432 } 433 } 434 } 435 436 437 if(ivmin_x < 10) inv_vx = V_INVADER; // 左端に達したとき 438 if(ivmax_x > W_WIN-10) inv_vx = -V_INVADER; // 右端に達したとき 439 440 if((ivmin_x < 10) || (ivmax_x > W_WIN-10)){ // 左右の端に達しとき 441 for(i=0; istatus = 2; // ビームを発射の状態にする 493 p_e_beam1->vy = V_E_BEAM; // ビームの速度を設定 494 p_e_beam1 = NULL; // 発射可能なビームが無い 495 } 496 } 497 498 499 //==================================================================== 500 // 色の指定 501 //==================================================================== 502 void set_color(void) 503 { 504 glClearColor(0.0, 0.0, 0.0, 1.0); //赤緑青と透明度 505 }