• 検索結果がありません。

#include <stdio.h> 2 #include <stdlib.h> 3 #include <GL/glut.h> 4 Program 1 (OpenGL GameSample001) 5 // 6 static bool KeyUpON = false; // 7 sta

N/A
N/A
Protected

Academic year: 2021

シェア "#include <stdio.h> 2 #include <stdlib.h> 3 #include <GL/glut.h> 4 Program 1 (OpenGL GameSample001) 5 // 6 static bool KeyUpON = false; // 7 sta"

Copied!
17
0
0

読み込み中.... (全文を見る)

全文

(1)

1

サンプルプログラム

今回は,以下のプログラムの動作を確認します.

1. 簡単なシューティングゲームの例

Program 1 簡単なシューティングゲームの例 (OpenGL GameSample001)

1 # include < stdio .h > 2 # include < stdlib .h > 3 # include <GL / glut .h > 4

5 // グ ロ ー バ ル 変 数

6 static bool KeyUpON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 7 static bool KeyDownON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 8 static bool KeyLeftON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 9 static bool KeyRightON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 10

11 static int MouseX = 0; // マ ウ ス X 座 標 12 static int MouseY = 0; // マ ウ ス Y 座 標 13 static float SpinX = 0; // X 軸 周 り の 回 転 量 14 static float SpinY = 0; // Y 軸 周 り の 回 転 量 15

16 static float MoveX = 0; // X 軸 方 向 の 移 動 量 17 static float MoveZ = 0; // Y 軸 方 向 の 移 動 量 18 static float Scale = 1.0; // 拡 大 量 19

20 // 自 機 の 弾 の 情 報 を 格 納 す る 構 造 体

21 # define MAX_SHOT 10 // 同 時 に 撃 て る 弾 の 最 大 数 22 typedef struct _MyShot {

23 int isAlive ; // 自 機 の 弾 が 生 き て る か ? 24 float x; // 弾 の x 座 標 25 float z; // 弾 の z 座 標 26 float vx ; // 弾 の x 軸 方 向 速 度 27 float vz ; // 弾 の z 軸 方 向 速 度 28 } MyShot ; 29 // 自 機 の 情 報 を 格 納 す る 構 造 体 30 typedef struct _MyShip {

31 int isAlive ; // 自 機 が 生 き て る か ? 32 float x; // 自 機 の x 座 標

33 float z; // 自 機 の z 座 標

34 MyShot myShot [ MAX_SHOT ];// 弾 を 管 理 す る 構 造 体 配 列 35 } MyShip ;

36 MyShip myShip ; // 自 機 の 構 造 体 を 作 成 37

38 // 敵 の 情 報 を 格 納 す る 構 造 体

39 # define MAX_ENEMY 10 // 同 時 に 出 現 す る 敵 の 最 大 数 40 typedef struct _Enemy {

41 int isAlive ; // 敵 が 生 き て る か ? 42 float x; // 敵 の x 座 標 43 float z; // 敵 の z 座 標 44 float vx ; // 敵 の x 軸 方 向 速 度 45 float vz ; // 敵 の z 軸 方 向 速 度 46 } Enemy ;

47 Enemy enemy [ MAX_ENEMY ]; // 敵 の 構 造 体 配 列 を 作 成 48

49 // キ ー ボ ー ド 入 力 ( ス ペ ー ス キ ー で 弾 を 発 射 ) 50 void keyboard ( unsigned char key , int x , int y) 51 {

52 switch ( key ) { 53 case ’ ’:

54 // printf ("(%3 d ,%3 d) で ス ペ ー ス が 押 さ れ ま し た \ n", x , y ); 55 for ( int i =0;i < MAX_SHOT ; i ++){

56 if ( myShip . myShot [i ]. isAlive == 0){ 57 myShip . myShot [i ]. isAlive = 1; 58 myShip . myShot [i ]. x = myShip .x; 59 myShip . myShot [i ]. z = myShip .z; 60 break ; 61 } 62 } 63 break ; 64 } 65 } 66 67 // キ ー ボ ー ド 入 力 ( 矢 印 キ ー を 押 し 続 け て い る 間 は 自 機 を 移 動 ) 68 void specialKey ( int key , int x , int y)

69 { 70 switch ( key ) { 71 case GLUT_KEY_UP : 72 // printf ("(%3 d ,%3 d) で [ ↑ ] が 押 さ れ ま し た \ n", x , y ); 73 KeyUpON = true ; 74 break ; 75 case GLUT_KEY_DOWN : 76 // printf ("(%3 d ,%3 d) で [ ↓ ] が 押 さ れ ま し た \ n", x , y ); 77 KeyDownON = true ; 78 break ;

(2)

79 case GLUT_KEY_LEFT : 80 // printf ("(%3 d ,%3 d) で [ ← ] が 押 さ れ ま し た \ n", x , y ); 81 KeyLeftON = true ; 82 break ; 83 case GLUT_KEY_RIGHT : 84 // printf ("(%3 d ,%3 d) で [ → ] が 押 さ れ ま し た \ n", x , y ); 85 KeyRightON = true ; 86 break ; 87 } 88 } 89

90 void specialKeyUp ( int key , int x , int y) 91 { 92 switch ( key ) { 93 case GLUT_KEY_UP : 94 // printf ("(%3 d ,%3 d) で [ ↑ ] が 離 さ れ ま し た \ n", x , y ); 95 KeyUpON = false ; 96 break ; 97 case GLUT_KEY_DOWN : 98 // printf ("(%3 d ,%3 d) で [ ↓ ] が 離 さ れ ま し た \ n", x , y ); 99 KeyDownON = false ; 100 break ; 101 case GLUT_KEY_LEFT : 102 // printf ("(%3 d ,%3 d) で [ ← ] が 離 さ れ ま し た \ n", x , y ); 103 KeyLeftON = false ; 104 break ; 105 case GLUT_KEY_RIGHT : 106 // printf ("(%3 d ,%3 d) で [ → ] が 離 さ れ ま し た \ n", x , y ); 107 KeyRightON = false ; 108 break ; 109 } 110 } 111

112 void timer ( int t) // 指 定 時 間 後 に 呼 び 出 さ れ る 関 数 ( T i m e r コ ー ル バ ッ ク 関 数 ) 113 { 114 // 矢 印 キ ー を 押 し 続 け て い る 間 は 自 機 を 移 動 115 if ( KeyUpON == 1) myShip .z -= 0.1; 116 if ( KeyDownON == 1) myShip .z += 0.1; 117 if ( KeyLeftON == 1) myShip .x -= 0.1; 118 if ( KeyRightON == 1) myShip .x += 0.1; 119 120 // 速 度 を 足 し て 弾 を 移 動 さ せ る 121 for ( int i =0;i < MAX_SHOT ; i ++){ 122 if ( myShip . myShot [i ]. isAlive == 1){

123 myShip . myShot [i ]. z += myShip . myShot [i ]. vx ; // x 軸 方 向 の 速 度 を 加 算 124 myShip . myShot [i ]. z += myShip . myShot [i ]. vz ; // z 軸 方 向 の 速 度 を 加 算 125 }

126 if ( myShip . myShot [i ]. z < -100) //画面外( 領 域 外 ) 判 定

127 myShip . myShot [i ]. isAlive = 0; //画面外( 領 域 外 ) に 出 た ら 弾 を 消 す 128 }

129

130 // 速 度 を 足 し て 敵 を 移 動 さ せ る

131 int NofEnemys = 0; // 出 現 し て い る 敵 の 数 を 数 え る 変 数 132 for ( int i =0;i < MAX_ENEMY ; i ++){

133 if ( enemy [i ]. isAlive == 1){ // i 番 目 の 敵 は 生 き て い る か ? 134 // 生 き て い た ら 敵 の 位 置 を 乱 数 ( ノ イ ズ ) で 移 動

135 enemy [i ]. x += enemy [i ]. vx +(( float ) rand ()/ RAND_MAX - 0.5); // x 軸 方 向 の 速 度 ( と 乱 数 ) を 加 算 136 enemy [i ]. z += enemy [i ]. vz + (( float ) rand ()/ RAND_MAX ); // z 軸 方 向 の 速 度 ( と 乱 数 ) を 加 算 137 NofEnemys ++; // 出 現 し て い る 敵 の 数 を 数 え る

138 }

139 if ( enemy [i ]. z > 10 || enemy [i ]. x < -10 || enemy [i ]. x > 10) //画面外( 領 域 外 ) 判 定 140 enemy [i ]. isAlive = 0; //画面外( 領 域 外 ) に 出 た ら 敵 を 消 す

141 } 142

143 // 弾 と 敵 の 当 た り 判 定

144 for ( int i =0;i < MAX_ENEMY ;i ++){ 145 for ( int j =0;j < MAX_SHOT ;j ++){

146 // 弾 と 敵 の 距 離 が 一 定 値 以 内 の 場 合 に 当 た り と 判 定

147 if ((( enemy [i ]. x - myShip . myShot [j ]. x )*( enemy [i ]. x - myShip . myShot [j ]. x )+ 148 ( enemy [i ]. z - myShip . myShot [j ]. z )*( enemy [i ]. z - myShip . myShot [j ]. z )) < 2.0 ){ 149 enemy [i ]. isAlive = 0; //敵を消す

150 myShip . myShot [j ]. isAlive = 0; //弾を消す( こ こ で 弾 を 消 さ な い と 貫 通 弾 に な る ) 151 } 152 } 153 } 154 155 // 敵 の 出 現 156 // 現 存 す る 敵 が M A X _ E N E M Y よ り も 少 な か っ た ら 1 つ 新 た に 出 現 さ せ る 157 if ( NofEnemys < MAX_ENEMY ){

158 for ( int i =0;i < MAX_ENEMY ; i ++){

159 // i s A l i v e が 0 の 構 造 体 を 見 つ け て i s A l i v e を 1 に す る 160 // 出 現 位 置 は ラ ン ダ ム に 変 化 さ せ る

161 if ( enemy [i ]. isAlive == 0){

162 enemy [i ]. x = (( float ) rand ()/ RAND_MAX - 0.5) * 10; 163 enemy [i ]. z = -100 + (( float ) rand ()/ RAND_MAX - 0.5) * 100; 164 enemy [i ]. isAlive = 1;

165 break ; 166 }

(3)

167 } 168 } 169

170 // 敵 と 自 機 の 当 た り 判 定 171 for ( int i =0;i < MAX_ENEMY ; i ++){

172 // 敵 と 自 機 の 距 離 が 一 定 値 以 内 の 場 合 に 当 た り と 判 定 173 if ((( enemy [i ]. x - myShip .x )*( enemy [i ]. x - myShip .x)

174 +( enemy [i ]. z - myShip .z )*( enemy [i ]. z - myShip .z )) < 2.0 ){ 175 myShip . isAlive = 0; // 自 機 を 消 す 176 } 177 } 178 179 glutPostRedisplay (); // 画 面 の 再 描 画 180 glutTimerFunc (20 , timer , 20); // 次 回 の タ イ マ ー 関 数 の 呼 び 出 し を セ ッ ト 181 } 182

183 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 184 { 185 glViewport (0 , 0, w , h ); 186 187 glMatrixMode ( GL_PROJECTION ); 188 glLoadIdentity (); 189 gluPerspective (50.0 , ( double )w/h , 1.0 , 1000.0); 190 191 glMatrixMode ( GL_MODELVIEW ); 192 glLoadIdentity (); 193 gluLookAt (0.0 , 5.0 , 10.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0); 194 } 195 196 // 自 機 と 弾 の 描 画 197 void DrawMyShip ( void ) 198 {

199 glPushMatrix ();

200 GLfloat mat0ambi [] = {0.329412 , 0.223529 , 0.027451 , 1.0};//真鍮

201 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , mat0ambi ); //環境光の反射率を設定 202 GLfloat mat0diff [] = {0.780392 , 0.568627 , 0.113725 , 1.0};//真鍮

203 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , mat0diff ); //拡散光の反射率を設定 204 GLfloat mat0spec [] = {0.992157 , 0.941176 , 0.807843 , 1.0};//真鍮

205 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , mat0spec ); //鏡面光の反射率を設定 206 GLfloat mat0shine [] ={ 27.89743616};//真鍮

207 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , mat0shine ); 208 //自機の描画

209 glTranslatef ( myShip .x , 0.0 , myShip .z ); // X 軸 方 向 に M o v e X , Y 軸 方 向 に M o v e Y だ け 移 動 210 glRotatef (90.0 , 0.0 , 1.0 , 0.0); // Y 軸 周 り に 9 0 度 回 転

211 glutSolidTeapot (1.0); //自機はティーポット( 笑 ) 212 glPopMatrix ();

213

214 //自機の弾の描画

215 for ( int i =0;i < MAX_SHOT ;i ++){ 216 if ( myShip . myShot [i ]. isAlive ){ 217 glPushMatrix ();

218 glTranslatef ( myShip . myShot [i ].x , 0.0 , myShip . myShot [i ]. z ); //現在の弾の位置 219 glutSolidSphere (0.1 ,10 ,10); //弾は球体 220 glPopMatrix (); 221 } 222 } 223 } 224 225 // 敵 の 描 画

226 void DrawEnemy ( void ) 227 {

228 GLfloat mat0ambi [] = {0.329412 , 0.223529 , 0.027451 , 1.0};//真鍮

229 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , mat0ambi ); //環境光の反射率を設定 230 GLfloat mat0diff [] = {0.780392 , 0.568627 , 0.113725 , 1.0};//真鍮

231 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , mat0diff ); //拡散光の反射率を設定 232 GLfloat mat0spec [] = {0.992157 , 0.941176 , 0.807843 , 1.0};//真鍮

233 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , mat0spec ); //鏡面光の反射率を設定 234 GLfloat mat0shine [] ={ 27.89743616};//真鍮

235 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , mat0shine ); 236

237 //物体の描画

238 for ( int i =0;i < MAX_ENEMY ;i ++){ 239 if ( enemy [i ]. isAlive == 1){ 240 glPushMatrix ();

241 glTranslatef ( enemy [i ].x , 0.0 , enemy [i ]. z ); //現在の敵の位置 242 glutSolidCube (1.0); //敵は立方体 243 glPopMatrix (); 244 } 245 } 246 } 247

248 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 249 {

250 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア

251 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 252 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効

253

(4)

255 if ( myShip . isAlive ==0){ 256 // 文 字 列 の 描 画 257 glPushMatrix ();

258 GLfloat matString [] = { 0.8 , 0.0 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 259 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , matString );

260 glRasterPos3f ( -1.0f , 0.0f , 0.0 f ); 261 char * str = " Game Over ";

262 while (* str ){ 263 glutBitmapCharacter ( GLUT_BITMAP_HELVETICA_18 , * str ); 264 ++ str ; 265 } 266 glPopMatrix (); 267 } else { 268 // 自 機 が 生 き て い た ら 自 機 と 敵 を 描 画 す る 269 DrawMyShip (); // 自 機 の 描 画 270 DrawEnemy (); // 敵 の 描 画 271 } 272 273 // 座 標 軸 の 描 画 274 glPushMatrix (); // X 軸 275 GLfloat mat1diff [] = { 0.6 , 0.2 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 276 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat1diff );

277 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 278 glBegin ( GL_LINES ); 279 glVertex3f (0.0 f , 0.0f , 0.0 f ); 280 glVertex3f (2.0 f , 0.0f , 0.0 f ); 281 glEnd (); 282 glPopMatrix (); 283 glPushMatrix (); // Y 軸 284 GLfloat mat2diff [] = { 0.2 , 0.6 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 285 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat2diff );

286 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 287 glBegin ( GL_LINES ); 288 glVertex3f (0.0 f , 0.0f , 0.0 f ); 289 glVertex3f (0.0 f , 2.0f , 0.0 f ); 290 glEnd (); 291 glPopMatrix (); 292 glPushMatrix (); // Z 軸 293 GLfloat mat3diff [] = { 0.2 , 0.2 , 0.6 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 294 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat3diff );

295 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 296 glBegin ( GL_LINES ); 297 glVertex3f (0.0 f , 0.0f , 0.0 f ); 298 glVertex3f (0.0 f , 0.0f , 2.0 f ); 299 glEnd (); 300 glPopMatrix (); 301 302 glutSwapBuffers (); // 描 画 実 行 303 } 304

305 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 306 { 307 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 308 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 309 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 310 311 GLfloat light0pos [] = { 0.0 , 10.0 , 0.0 , 1.0 };

312 glLightfv ( GL_LIGHT0 , GL_POSITION , light0pos ); //光源0 の 位 置 を 設 定 313

314 GLfloat light0ambi [] = { 0.2 , 0.2 , 0.2 , 1.0 };

315 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0ambi ); //光源0 の 環 境 光 の 色 を 設 定 316 GLfloat light0diff [] = { 0.8 , 0.8 , 0.8 , 1.0 };

317 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0diff ); //光源0 の 拡 散 光 の 色 を 設 定 318 GLfloat light0spec [] = { 0.5 , 0.5 , 0.5 , 1.0 };

319 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0spec ); //光源0 の 鏡 面 光 の 色 を 設 定 320

321 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 322 }

323

324 int main ( int argc , char * argv []) 325 {

326 glutInit (& argc , argv ); // G L U T 初 期 化

327 glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); 328 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 329 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成 330 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 331 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 332 333 glutKeyboardFunc ( keyboard ); // 通 常 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 334 glutSpecialFunc ( specialKey ); // 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 335 glutSpecialUpFunc ( specialKeyUp );// 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 離 し た と き ) 336 337 glutTimerFunc (20 , timer , 20); // 定 期 的 に 呼 び 出 さ れ る 関 数 の 指 定 338 339 // 自 機 の 構 造 体 デ ー タ を 初 期 化 340 myShip .x = 0; // 自 機 の 初 期 位 置 ( X 座 標 ) 341 myShip .z = 0; // 自 機 の 初 期 位 置 ( Z 座 標 ) 342 myShip . isAlive = 1; // 自 機 は 生 き て い る

(5)

343 // 弾 の 構 造 体 デ ー タ を 初 期 化 ( 弾 は Z 軸 方 向 に 毎 フ レ ー ム -1.0 移 動 す る ) 344 for ( int i =0; i < MAX_SHOT ; i ++){

345 myShip . myShot [i ]. isAlive = 0; // 弾 は 発 射 さ れ て い な い 346 myShip . myShot [i ]. x = 0; // 弾 の 初 期 位 置 ( X 座 標 ) 347 myShip . myShot [i ]. z = 0; // 弾 の 初 期 位 置 ( X 座 標 ) 348 myShip . myShot [i ]. vx = 0; // 弾 の 基 本 速 度 ( X 座 標 ) 349 myShip . myShot [i ]. vz = -1.0; // 弾 の 基 本 速 度 ( X 座 標 ) 350 351 } 352 // 敵 の 構 造 体 デ ー タ を 初 期 化 ( 敵 は Z 軸 方 向 に 毎 フ レ ー ム 0 .1 移 動 す る ) 353 for ( int i =0; i < MAX_ENEMY ; i ++){

354 enemy [i ]. isAlive = 0; // 敵 は 出 現 し て い な い 355 enemy [i ]. x = 0; // 敵 の 初 期 位 置 ( X 座 標 ) 356 enemy [i ]. z = -100; // 敵 の 初 期 位 置 ( Z 座 標 ) 357 enemy [i ]. vx = 0; // 敵 の 基 本 速 度 ( X 座 標 ) 358 enemy [i ]. vz = 0.1; // 敵 の 基 本 速 度 ( Z 座 標 ) 359 } 360 361 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 362 glutMainLoop (); // メ イ ン ル ー プ へ 363 364 return 0; 365 }

(6)

2. 迷路を移動するプログラムの例

Program 2 迷路を移動するプログラムの例 (OpenGL GameSample002)

1 # include < stdio .h > 2 # include < stdlib .h > 3 # include < string .h > 4 # define _USE_MATH_DEFINES 5 # include < math .h > 6 7 # include < GL / glut .h > 8 9 # define FALSE 0 10 # define TRUE 1 11 12 typedef struct { 13 unsigned char c; 14 int x ,y; 15 } Key ; 16 Key _key ; 17 18 //迷路 19 # define MAZE_WIDTH 10 //描画の都合上正方形にしている 20 # define MAZE_HEIGHT 10 21 //迷路の情報 0: 空 き 1: 壁 2: 自 機 の 初 期 位 置 左 上 原 点 , → x 正 ↓ y 正 22 //端は1 で 埋 め て お か な い と 盤 外 に 出 て し ま う 可 能 性 が 出 て く る の で 注 意 23 static const int maze [ MAZE_HEIGHT ][ MAZE_WIDTH ]={

24 {1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1} , 25 {1 ,2 ,1 ,0 ,1 ,0 ,1 ,0 ,0 ,1} , 26 {1 ,0 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} , 27 {1 ,0 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,1} , 28 {1 ,0 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,1} , 29 {1 ,0 ,1 ,0 ,1 ,0 ,0 ,0 ,0 ,1} , 30 {1 ,0 ,1 ,0 ,1 ,0 ,1 ,1 ,0 ,1} , 31 {1 ,0 ,1 ,0 ,1 ,0 ,1 ,0 ,0 ,1} , 32 {1 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,1} , 33 {1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1} 34 };

35 static const double HEX_SIZE =1.0/ MAZE_WIDTH ; //マスのサイズ 36

37 enum DIR {UP , RIGHT , BOTTOM , LEFT , DIR_NUM }; //向き

38 static const int DX [ DIR_NUM ]={0 , -1 ,0 ,1}; //向きに対応した x y の 増 分 の 表 39 static const int DY [ DIR_NUM ]={1 ,0 , -1 ,0};

40 static const double DT [ DIR_NUM ]={ M_PI /2.0 , M_PI ,- M_PI /2 ,0.0}; //向きに対応したradian 41 enum MODE { MODE_STOP , MODE_GO , MODE_TURN }; //移動モード

42 typedef struct {

43 unsigned char alive ; //生きてる? 44 unsigned int fcnt ; //フレームカウント 45 int ix , iy ; //迷路位置 46 unsigned int d; //向き 47 double cx , cy ; //今の描画位置 48 double dx , dy ; //次の描画位置 49 double bx , by ; //前の描画位置 50 double cct ; //今のカメラ向き 51 double bct ; //前のカメラ向き 52 double dct ; //次のカメラ向き 53 unsigned int mode ; //移動モード 54 unsigned int fdul ; //アニメーション時間 55 } MyBody ; //自機の構造体

56 MyBody mb ; //自機オブジェクト 57

58 //迷路描画

59 void draw_maze ( void ) 60 {

61 //図形の色 ( 白 )

62 static const GLfloat white [] = { 0.9 , 0.9 , 0.9 , 1.0 };

63 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , white ); 64

65 for ( int r =0;r < MAZE_HEIGHT ;++ r ){ 66 for ( int c =0;c < MAZE_WIDTH ;++ c ){ 67 glPushMatrix ();{

68 //床

69 glTranslatef (( c +0.5)* HEX_SIZE ,- HEX_SIZE ,( r +0.5)* HEX_SIZE ); 70 glutSolidCube ( HEX_SIZE ); 71 if ( maze [r ][ c ]==1){ 72 //壁 73 glPushMatrix ();{ 74 glTranslatef (0 , HEX_SIZE ,0); //上に移動 75 glutSolidCube ( HEX_SIZE ); 76 } glPopMatrix (); 77 } 78 } glPopMatrix (); 79 }} 80 } 81 82 //自機描画(デバッグ用?) 83 void draw_mb ( void ) 84 {

(7)

85 glPushMatrix ();{ 86 //図形の色 ( 赤 )

87 static const GLfloat red [] = { 0.8 , 0.2 , 0.2 , 1.0 };

88 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , red ); 89 glTranslatef ( mb .cx ,0.0 , mb . cy );

90 glutSolidSphere ( HEX_SIZE *0.25 ,50 ,50); 91 } glPopMatrix ();

92 } 93

94 void timerFunc ( int t) // 指 定 時 間 後 に 呼 び 出 さ れ る 関 数 ( T i m e r コ ー ル バ ッ ク 関 数 ) 95 { 96 //キー入力ハンドル 97 switch ( _key .c ){ 98 case ’s ’:{ // up 99 if ( mb . mode == MODE_STOP ){ //移動中は受け付けない 100 int tx = mb . ix + DX [ mb .d ]; int ty = mb . iy + DY [ mb .d ]; //前進位置を計算 101 if ( maze [ ty ][ tx ]!=1){ //壁じゃなければ 102 //前に進む 103 mb . ix = tx ; mb . iy = ty ; 104 //アニメーションを登録 105 mb . bx = mb . cx ; mb . by = mb . cy ; //元 106 mb . dx =( mb . ix +0.5)* HEX_SIZE ; mb . dy =( mb . iy +0.5)* HEX_SIZE ; //先 107 mb . fcnt =0; 108 mb . mode = MODE_GO ; 109 } 110 } 111 break ; 112 } case ’c ’:{ // right 113 if ( mb . mode == MODE_STOP ){ //移動中は受け付けない 114 //右向く 115 //アニメーションを登録 116 mb . bct = DT [ mb .d ]; 117 mb .d =( mb .d +1)% DIR_NUM ; 118 mb . dct = mb . bct + M_PI /2.0; //右向け右 119 mb . fcnt =0; 120 mb . mode = MODE_TURN ; 121 } 122 break ; 123 } case ’x ’:{ // bottom 124 if ( mb . mode == MODE_STOP ){ //移動中は受け付けない 125 //後ろ向く 126 //アニメーションを登録 127 mb . bct = DT [ mb .d ]; 128 mb .d =( mb .d +2)% DIR_NUM ; 129 mb . dct = mb . bct + M_PI ; //回れ右 130 mb . fcnt =0; 131 mb . mode = MODE_TURN ; 132 } 133 break ; 134 } case ’z ’:{ // left 135 if ( mb . mode == MODE_STOP ){ //移動中は受け付けない 136 //左向く 137 //アニメーションを登録 138 mb . bct = DT [ mb .d ]; 139 mb .d =( mb .d -1+ DIR_NUM )% DIR_NUM ; 140 mb . dct = mb .bct - M_PI /2.0; //左向け左 141 mb . fcnt =0; 142 mb . mode = MODE_TURN ; 143 } 144 break ; 145 } default : 146 break ; 147 } 148 _key .c =0; //キー入力を初期化 149 150 //アニメーション 151 if ( mb . mode == MODE_GO ){ //前進 152 //等速度で移動 153 mb . cx =( mb .dx - mb . bx )* mb . fcnt / mb . fdul + mb . bx ; 154 mb . cy =( mb .dy - mb . by )* mb . fcnt / mb . fdul + mb . by ; 155 mb . fcnt +=1; 156 if ( mb . fcnt == mb . fdul ){ //終端 157 mb . cx =( mb . ix +0.5)* HEX_SIZE ; 158 mb . cy =( mb . iy +0.5)* HEX_SIZE ; 159 mb . mode = MODE_STOP ; 160 }

161 } else if ( mb . mode == MODE_TURN ){ //回転 162 //等速度で移動 163 mb . cct =( mb .dct - mb . bct )* mb . fcnt / mb . fdul + mb . bct ; 164 mb . fcnt +=1; 165 if ( mb . fcnt == mb . fdul ){ //終端 166 mb . cct = DT [ mb .d ]; 167 mb . mode = MODE_STOP ; 168 } 169 } 170 171 //描画依頼 172 glutPostRedisplay ();

(8)

173 //次タイマー登録

174 glutTimerFunc (30 , timerFunc ,0); 175 }

176

177 void specialKey ( int key , int x , int y) 178 { 179 //キー入力は構造体に一時保存しておく 180 _key .x=x; 181 _key .y=y; 182 183 switch ( key ) { 184 case GLUT_KEY_UP : 185 // printf ("(%3 d ,%3 d) で [ ↑ ] が 押 さ れ ま し た \ n", x , y ); 186 _key .c= ’s ’; 187 break ; 188 case GLUT_KEY_DOWN : 189 // printf ("(%3 d ,%3 d) で [ ↓ ] が 押 さ れ ま し た \ n", x , y ); 190 _key .c= ’x ’; 191 break ; 192 case GLUT_KEY_LEFT : 193 // printf ("(%3 d ,%3 d) で [ ← ] が 押 さ れ ま し た \ n", x , y ); 194 _key .c= ’z ’; 195 break ; 196 case GLUT_KEY_RIGHT : 197 // printf ("(%3 d ,%3 d) で [ → ] が 押 さ れ ま し た \ n", x , y ); 198 _key .c= ’c ’; 199 break ; 200 } 201 } 202

203 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 204 {

205 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア

206 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 207 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効 208 209 glMatrixMode ( GL_MODELVIEW ); 210 glLoadIdentity (); 211 212 //視点をアニメーションする

213 gluLookAt ( mb .cx ,0.03 , mb .cy , mb . cx + cos ( mb . cct ) ,0.03 , mb . cy + sin ( mb . cct ), 0 ,1 ,0); 214

215 //光源の設定 216 //自機位置に光源

217 GLfloat light_pos [] = { mb .cx , HEX_SIZE *0.5 , mb .cy , 1.0 }; 218 glLightfv ( GL_LIGHT0 , GL_POSITION , light_pos );

219 GLfloat light_ambient [] = {0.1 , 0.1 , 0.1 , 1.0}; 220 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light_ambient ); 221 GLfloat light_diffuse [] = {0.5 , 0.5 , 0.5 , 1.0}; 222 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light_diffuse ); 223 GLfloat light_specular [] = {0.1 , 0.1 , 0.1 , 1.0}; 224 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light_specular ); 225 //スポットライトの設定(一つ前のブロックを照らす)

226 GLfloat spot_dir [] = { HEX_SIZE * cos ( mb . cct ),- HEX_SIZE *0.5 , HEX_SIZE * sin ( mb . cct )}; 227 glLightfv ( GL_LIGHT0 , GL_SPOT_DIRECTION , spot_dir );

228 glLightf ( GL_LIGHT0 , GL_SPOT_CUTOFF , 45.0); 229 glLightf ( GL_LIGHT0 , GL_SPOT_EXPONENT , 25.0); 230 //光の減衰の設定(遠くまで光が届かないようにする)

231 glLightf ( GL_LIGHT0 , GL_CONSTANT_ATTENUATION , 0.5); 232 glLightf ( GL_LIGHT0 , GL_LINEAR_ATTENUATION , 0.2); 233 glLightf ( GL_LIGHT0 , GL_QUADRATIC_ATTENUATION , 0.2); 234 glEnable ( GL_LIGHT0 ); 235 236 //迷路の描画 237 draw_maze (); 238 239 //自分の描画( デ バ ッ ク 用 ? ) 240 draw_mb (); 241 242 //バッファの切り替え 243 glutSwapBuffers (); 244 } 245

246 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 247 { 248 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 249 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 250 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 251 252 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 253 } 254

255 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 256 {

257 glViewport (0 , 0, w , h ); 258

259 glMatrixMode ( GL_PROJECTION ); 260 glLoadIdentity ();

(9)

261 gluPerspective (100.0 , ( double )w/h , 0.01 , 10.0); // 透 視 投 影 262 }

263

264 int main ( int argc , char ** argv ) 265 {

266 glutInit (& argc , argv ); // G L U T 初 期 化

267 glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH ); 268 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 269 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成 270 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 271 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 272 273 glutSpecialFunc ( specialKey ); // 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 274 glutTimerFunc (30 , timerFunc ,0); // 定 期 的 に 呼 び 出 さ れ る 関 数 の 指 定 275 276 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 277 278 //初期化処理 279 //迷路から自機の初期位置を探す 280 for ( int r =0;r < MAZE_HEIGHT ;++ r ){ 281 for ( int c =0;c < MAZE_WIDTH ;++ c ){ 282 if ( maze [r ][ c ]==2){ 283 mb . ix =c; 284 mb . iy =r; 285 goto loop_end ; 286 } 287 }} 288 loop_end : 289 290 //自機位置から描画位置を計算 291 mb . cx =( mb . ix +0.5)* HEX_SIZE ; 292 mb . cy =( mb . iy +0.5)* HEX_SIZE ; 293 294 //その他設定 295 mb . alive = TRUE ; mb . fcnt =0; 296 mb .d= UP ; //初期向き 297 mb . cct = DT [ mb .d ]; //カメラ向き 298 mb . mode = MODE_STOP ; //移動モード 299 mb . fdul =10; //アニメーション時間 ( = 移 動 ス ピ ー ド の 逆 数 . 浮 動 小 数 の 累 加 誤 差 を 懸 念 ) 300 301 glutMainLoop (); // メ イ ン ル ー プ へ 302 303 return 0; 304 }

(10)

3. 簡単な格闘ゲームの例

Program 3 簡単な格闘ゲームの例 (OpenGL GameSample003)

1 # include < stdio .h > 2 # include < stdlib .h > 3 # include <GL / glut .h > 4

5 // グ ロ ー バ ル 変 数

6 static bool KeyUpON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 7 static bool KeyDownON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 8 static bool KeyLeftON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 9 static bool KeyRightON = false ; // 矢 印 キ ー の 状 態 フ ラ グ 10

11 static int MouseX = 0; // マ ウ ス X 座 標 12 static int MouseY = 0; // マ ウ ス Y 座 標 13 static float SpinX = 0; // X 軸 周 り の 回 転 量 14 static float SpinY = 0; // Y 軸 周 り の 回 転 量 15

16 static float MoveX = 0; // X 軸 方 向 の 移 動 量 17 static float MoveZ = 0; // Y 軸 方 向 の 移 動 量 18 static float Scale = 1.0; // 拡 大 量 19

20 // キ ャ ラ ク タ の 情 報 を 格 納 す る 構 造 体 21 typedef struct _MyCharactor {

22 int isAlive ; // キ ャ ラ ク タ が 生 き て る か ? 23 float x; // キ ャ ラ ク タ の x 座 標 24 int moveX_flg ; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 25 int moveX_timer ; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 26 float z; // キ ャ ラ ク タ の z 座 標 27 int moveZ_flg ; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 28 int moveZ_timer ; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 29 30 int leftArm_shoulder ; // キ ャ ラ ク タ の 左 肩 の 角 度 31 int leftArm_elbow ; // キ ャ ラ ク タ の 左 肘 の 角 度 32 int leftArm_animationFlg ; // 左 腕 ア ニ メ ー シ ョ ン フ ラ グ 33 int leftArm_timer ; // 左 腕 ア ニ メ ー シ ョ ン タ イ マ ー 34 35 int rightArm_shoulder ; // キ ャ ラ ク タ の 右 肩 の 角 度 36 int rightArm_elbow ; // キ ャ ラ ク タ の 右 肘 の 角 度 37 int rightArm_animationFlg ; // 左 腕 ア ニ メ ー シ ョ ン フ ラ グ 38 int rightArm_timer ; // 左 腕 ア ニ メ ー シ ョ ン タ イ マ ー 39 } MyCharactor ; 40 // 自 分 の キ ャ ラ ク タ 41 MyCharactor myCharactor ; 42 // 相 手 の キ ャ ラ ク タ 43 MyCharactor yourCharactor ; 44 45 // キ ー ボ ー ド 入 力 ( ス ペ ー ス キ ー で 剣 を 振 る ) 46 void keyboard ( unsigned char key , int x , int y) 47 { 48 switch ( key ) { 49 case ’g ’: 50 // printf ("(%3 d ,%3 d) で ’ o ’ が 押 さ れ ま し た \ n", x , y ); 51 myCharactor . leftArm_animationFlg = 1; 52 break ; 53 case ’ ’: 54 // printf ("(%3 d ,%3 d) で ス ペ ー ス が 押 さ れ ま し た \ n", x , y ); 55 myCharactor . rightArm_animationFlg = 1; 56 break ; 57 } 58 } 59 60 // キ ー ボ ー ド 入 力 ( 矢 印 キ ー を 押 し 続 け て い る 間 は 自 機 を 移 動 ) 61 void specialKey ( int key , int x , int y)

62 { 63 switch ( key ) { 64 case GLUT_KEY_UP : 65 // printf ("(%3 d ,%3 d) で [ ↑ ] が 押 さ れ ま し た \ n", x , y ); 66 KeyUpON = true ; 67 break ; 68 case GLUT_KEY_DOWN : 69 // printf ("(%3 d ,%3 d) で [ ↓ ] が 押 さ れ ま し た \ n", x , y ); 70 KeyDownON = true ; 71 break ; 72 case GLUT_KEY_LEFT : 73 // printf ("(%3 d ,%3 d) で [ ← ] が 押 さ れ ま し た \ n", x , y ); 74 KeyLeftON = true ; 75 break ; 76 case GLUT_KEY_RIGHT : 77 // printf ("(%3 d ,%3 d) で [ → ] が 押 さ れ ま し た \ n", x , y ); 78 KeyRightON = true ; 79 break ; 80 } 81 } 82

83 void specialKeyUp ( int key , int x , int y) 84 {

(11)

85 switch ( key ) { 86 case GLUT_KEY_UP : 87 // printf ("(%3 d ,%3 d) で [ ↑ ] が 離 さ れ ま し た \ n", x , y ); 88 KeyUpON = false ; 89 break ; 90 case GLUT_KEY_DOWN : 91 // printf ("(%3 d ,%3 d) で [ ↓ ] が 離 さ れ ま し た \ n", x , y ); 92 KeyDownON = false ; 93 break ; 94 case GLUT_KEY_LEFT : 95 // printf ("(%3 d ,%3 d) で [ ← ] が 離 さ れ ま し た \ n", x , y ); 96 KeyLeftON = false ; 97 break ; 98 case GLUT_KEY_RIGHT : 99 // printf ("(%3 d ,%3 d) で [ → ] が 離 さ れ ま し た \ n", x , y ); 100 KeyRightON = false ; 101 break ; 102 } 103 } 104

105 static int MouseLB_ON =0; //左マウスボタン押下フラグ 106 static int MouseRB_ON =0; //右マウスボタン押下フラグ 107

108 void mouse ( int button , int state , int x , int y) 109 {

110 if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ){

111 MouseLB_ON = 1; printf (" (%3d ,%3 d) で 左 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 112 } else if ( button == GLUT_LEFT_BUTTON && state == GLUT_UP ){

113 MouseLB_ON = 0; printf (" (%3d ,%3 d) で 左 ボ タ ン を 離 し ま し た \ n" , x , y ); 114 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ){

115 MouseRB_ON = 1; printf (" (%3d ,%3 d) で 右 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 116 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_UP ){

117 MouseRB_ON = 0; printf (" (%3d ,%3 d) で 右 ボ タ ン を 離 し ま し た \ n" , x , y ); 118 }

119 } 120

121 void dragMotion ( int x , int y) 122 { 123 if ( MouseLB_ON == 1){ 124 printf (" (%3d ,%3 d) で 左 ド ラ ッ グ 中 . . . \ n" , x , y ); 125 // マ ウ ス の 移 動 量 か ら 回 転 量 を 作 る 126 SpinX += x - MouseX ; 127 SpinY += y - MouseY ; 128 // マ ウ ス 座 標 の 更 新 129 MouseX = x; 130 MouseY = y; 131 glutPostRedisplay (); 132 } 133 else if ( MouseRB_ON == 1){ 134 printf (" (%3d ,%3 d) で 右 ド ラ ッ グ 中 . . . \ n" , x , y ); 135 // マ ウ ス の 移 動 量 か ら 拡 大 量 を 作 る

136 Scale += ( float )( y - MouseY )/100; 137 // マ ウ ス 座 標 の 更 新 138 MouseX = x; 139 MouseY = y; 140 glutPostRedisplay (); 141 } 142 } 143

144 void timer ( int t) // 指 定 時 間 後 に 呼 び 出 さ れ る 関 数 ( T i m e r コ ー ル バ ッ ク 関 数 ) 145 { 146 // ---147 // 自 分 の キ ャ ラ ク タ の ア ニ メ ー シ ョ ン 148 // ---149 // 矢 印 キ ー を 押 し 続 け て い る 間 は 自 機 を 移 動 150 if ( KeyUpON == 1) myCharactor .z -= 0.1; 151 if ( KeyDownON == 1) myCharactor .z += 0.1; 152 if ( KeyLeftON == 1) myCharactor .x -= 0.1; 153 if ( KeyRightON == 1) myCharactor .x += 0.1; 154 155 // 右 腕 の ア ニ メ ー シ ョ ン ( 関 節 角 度 を 変 更 )

156 if ( myCharactor . rightArm_animationFlg == 1 || myCharactor . rightArm_timer > 0 ){ 157 myCharactor . rightArm_timer ++;

158 if ( myCharactor . rightArm_timer <= 30){

159 myCharactor . rightArm_elbow = -30 + myCharactor . rightArm_timer ; 160 myCharactor . rightArm_shoulder = -30 + myCharactor . rightArm_timer *6; 161 }

162 if ( myCharactor . rightArm_timer > 30 && myCharactor . rightArm_timer < 45 ){ 163 myCharactor . rightArm_elbow = 0 - ( myCharactor . rightArm_timer -30)*2; 164 myCharactor . rightArm_shoulder = 150 - ( myCharactor . rightArm_timer -30)*12; 165 } 166 if ( myCharactor . rightArm_timer >= 45){ 167 myCharactor . rightArm_elbow = -30; 168 myCharactor . rightArm_shoulder = -30; 169 myCharactor . rightArm_animationFlg = 0; 170 myCharactor . rightArm_timer = 0; 171 }

(12)

173 }

174 // 左 腕 の ア ニ メ ー シ ョ ン ( 関 節 角 度 を 変 更 ) : 盾 で 防 御 と 思 っ た け ど 未 実 装 175 if ( myCharactor . leftArm_animationFlg == 1 || myCharactor . leftArm_timer > 0 ){ 176 myCharactor . leftArm_timer ++;

177 if ( myCharactor . leftArm_timer <= 30){

178 myCharactor . leftArm_elbow = 0 - myCharactor . leftArm_timer *2; 179 myCharactor . leftArm_shoulder = 180 - myCharactor . leftArm_timer *1; 180 }

181 else if ( myCharactor . leftArm_timer > 30 && myCharactor . leftArm_timer < 45 ){ 182 myCharactor . leftArm_elbow = -60 + ( myCharactor . leftArm_timer -30)*4; 183 myCharactor . leftArm_shoulder = 150 + ( myCharactor . leftArm_timer -30)*2; 184 }

185 else if ( myCharactor . leftArm_timer >= 45){ 186 myCharactor . leftArm_elbow = 0; 187 myCharactor . leftArm_shoulder = 180; 188 myCharactor . leftArm_animationFlg = 0; 189 myCharactor . leftArm_timer = 0; 190 } 191 } 192 // ---193 194 // ---195 // 相 手 の キ ャ ラ ク タ の ア ニ メ ー シ ョ ン 196 // ---197 // 乱 数 を 使 っ て 相 手 の 位 置 を ラ ン ダ ム に 移 動 198 199 if ( yourCharactor . moveX_flg == 0){ // X 軸 方 向 の 移 動 を ラ ン ダ ム に 決 定 ( キ ャ ラ ク タ の 前 後 ) 200 if ( (( float ) rand ()/ RAND_MAX ) > 0.5 ) yourCharactor . moveX_flg = 1;

201 else yourCharactor . moveX_flg = -1; 202 }

203 if ( yourCharactor . moveZ_flg == 0){ // Z 軸 方 向 の 移 動 を ラ ン ダ ム に 決 定 ( キ ャ ラ ク タ の 左 右 ) 204 if ( (( float ) rand ()/ RAND_MAX ) > 0.5 ) yourCharactor . moveZ_flg = 1;

205 else yourCharactor . moveZ_flg = -1; 206 } 207 208 // 決 定 し た 方 向 に 1 0 フ レ ー ム の 間 ア ニ メ ー シ ョ ン 209 if ( yourCharactor . moveX_flg > 0){ 210 yourCharactor .x += 0.1; 211 if ( yourCharactor . moveX_timer ++ > 10){ 212 yourCharactor . moveX_timer = 0; 213 yourCharactor . moveX_flg = 0; 214 } 215 } 216 if ( yourCharactor . moveX_flg < 0){ 217 yourCharactor .x -= 0.1; 218 if ( yourCharactor . moveX_timer ++ > 10){ 219 yourCharactor . moveX_timer = 0; 220 yourCharactor . moveX_flg = 0; 221 } 222 } 223 if ( yourCharactor . moveZ_flg > 0){ 224 yourCharactor .z += 0.1; 225 if ( yourCharactor . moveZ_timer ++ > 10){ 226 yourCharactor . moveZ_timer = 0; 227 yourCharactor . moveZ_flg = 0; 228 } 229 } 230 if ( yourCharactor . moveZ_flg < 0){ 231 yourCharactor .z -= 0.1; 232 if ( yourCharactor . moveZ_timer ++ > 10){ 233 yourCharactor . moveZ_timer = 0; 234 yourCharactor . moveZ_flg = 0; 235 } 236 } 237 238 // 乱 数 を 使 っ て 適 当 な タ イ ミ ン グ で 剣 を 振 る

239 if ( (( float ) rand ()/ RAND_MAX ) > 0.99 ) yourCharactor . rightArm_animationFlg = 1; 240

241 // 右 腕 の ア ニ メ ー シ ョ ン ( 関 節 角 度 を 変 更 )

242 if ( yourCharactor . rightArm_animationFlg == 1 || yourCharactor . rightArm_timer > 0 ){ 243 yourCharactor . rightArm_timer ++;

244 if ( yourCharactor . rightArm_timer <= 30){

245 yourCharactor . rightArm_elbow = -30 + yourCharactor . rightArm_timer ; 246 yourCharactor . rightArm_shoulder = -30 + yourCharactor . rightArm_timer *6; 247 }

248 if ( yourCharactor . rightArm_timer > 30 && yourCharactor . rightArm_timer < 45 ){ 249 yourCharactor . rightArm_elbow = 0 - ( yourCharactor . rightArm_timer -30)*2; 250 yourCharactor . rightArm_shoulder = 150 - ( yourCharactor . rightArm_timer -30)*12; 251 } 252 if ( yourCharactor . rightArm_timer >= 45){ 253 yourCharactor . rightArm_elbow = -30; 254 yourCharactor . rightArm_shoulder = -30; 255 yourCharactor . rightArm_animationFlg = 0; 256 yourCharactor . rightArm_timer = 0; 257 }

258 // printf (" elbow :%5d , shoulder :%5 d\n", yourCharactor . rightArm_elbow , yourCharactor . rightArm_shoulder ); 259 }

(13)

261 if ( yourCharactor . leftArm_animationFlg == 1 || yourCharactor . leftArm_timer > 0 ){ 262 yourCharactor . leftArm_timer ++;

263 if ( yourCharactor . leftArm_timer <= 30){

264 yourCharactor . leftArm_elbow = 0 - yourCharactor . leftArm_timer *2; 265 yourCharactor . leftArm_shoulder = 180 - yourCharactor . leftArm_timer *1; 266 }

267 else if ( yourCharactor . leftArm_timer > 30 && yourCharactor . leftArm_timer < 45 ){ 268 yourCharactor . leftArm_elbow = -60 + ( yourCharactor . leftArm_timer -30)*4; 269 yourCharactor . leftArm_shoulder = 150 + ( yourCharactor . leftArm_timer -30)*2; 270 }

271 else if ( yourCharactor . leftArm_timer >= 45){ 272 yourCharactor . leftArm_elbow = 0; 273 yourCharactor . leftArm_shoulder = 180; 274 yourCharactor . leftArm_animationFlg = 0; 275 yourCharactor . leftArm_timer = 0; 276 } 277 } 278 // ---279 280 // 超 単 純 な 当 た り 判 定 ( 近 い 距 離 で 剣 を 振 り 切 ら れ た ら や ら れ る )

281 double dist = ( myCharactor .x - yourCharactor .x )*( myCharactor .x - yourCharactor .x) 282 + ( myCharactor .z - yourCharactor .z )*( myCharactor .z - yourCharactor .z );

283 if ( dist < 5.0){

284 if ( myCharactor . rightArm_timer > 30) yourCharactor . isAlive = 0; 285 if ( yourCharactor . rightArm_timer > 30) myCharactor . isAlive = 0; 286 } 287 288 glutPostRedisplay (); // 画 面 の 再 描 画 289 glutTimerFunc (20 , timer , 20); // 次 回 の タ イ マ ー 関 数 の 呼 び 出 し を セ ッ ト 290 } 291

292 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 293 { 294 glViewport (0 , 0, w , h ); 295 296 glMatrixMode ( GL_PROJECTION ); 297 glLoadIdentity (); 298 gluPerspective (50.0 , ( double )w/h , 1.0 , 1000.0); 299 300 glMatrixMode ( GL_MODELVIEW ); 301 glLoadIdentity (); 302 gluLookAt (0.0 , 5.0 , 10.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0); 303 } 304 305 // 自 分 の キ ャ ラ ク タ の 描 画 306 void DrawMyCharactor ( void ) 307 {

308 glPushMatrix ();

309 GLfloat mat0ambi [] = {0.329412 , 0.223529 , 0.027451 , 1.0};//真鍮

310 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , mat0ambi ); //環境光の反射率を設定 311 GLfloat mat0diff [] = {0.780392 , 0.568627 , 0.113725 , 1.0};//真鍮

312 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , mat0diff ); //拡散光の反射率を設定 313 GLfloat mat0spec [] = {0.992157 , 0.941176 , 0.807843 , 1.0};//真鍮

314 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , mat0spec ); //鏡面光の反射率を設定 315 GLfloat mat0shine [] ={ 27.89743616};//真鍮

316 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , mat0shine ); 317

318 glTranslatef ( myCharactor .x , 0.0 , myCharactor .z ); //矢印キーでの X 軸 方 向 , Z 軸 方 向 の 移 動 319 glRotatef ( -90 , 0.0 , 1.0 , 0.0);

320

321 //右腕の描画 322 glPushMatrix ();

323 glTranslatef ( -0.6 , 0.0 , 0.0);

324 glRotatef ( myCharactor . rightArm_shoulder /3 , 0.0 , 1.0 , 0.0); 325

326 //右上腕の描画

327 glRotatef ( myCharactor . rightArm_shoulder , 1.0 , 0.0 , 0.0); 328 glTranslatef (0.0 , 0.5 , 0.0); 329 glPushMatrix (); 330 glScalef (0.25 ,1.0 ,0.25); 331 glutSolidCube (1.0); 332 glPopMatrix (); 333 334 glTranslatef (0.0 , 0.5 , 0.0); 335 336 //右前腕の描画

337 glRotatef ( myCharactor . rightArm_elbow , 1.0 , 0.0 , 0.0); 338 glTranslatef (0.0 , 0.5 , 0.0); 339 glPushMatrix (); 340 glScalef (0.2 ,1.0 ,0.2); 341 glutSolidCube (1.0); 342 glPopMatrix (); 343 //剣の描画 344 glPushMatrix (); 345 glTranslatef (0.0 , 0.5 , -0.75); 346 glScalef (0.05 ,0.05 ,1.5); 347 glutSolidCube (1.0); 348 glPopMatrix ();

(14)

349 350 glPopMatrix (); 351 352 //左腕の描画 353 glPushMatrix (); 354 glTranslatef (0.6 , 0.0 , 0.0); 355 glRotatef (10 , 0.0 , 0.0 , 1.0); 356 357 //左上腕の描画

358 glRotatef ( myCharactor . leftArm_shoulder , 1.0 , 0.0 , 0.0); 359 glTranslatef (0.0 , 0.5 , 0.0); 360 glPushMatrix (); 361 glScalef (0.25 ,1.0 ,0.25); 362 glutSolidCube (1.0); 363 glPopMatrix (); 364 365 glTranslatef (0.0 , 0.5 , 0.0); 366 367 //左前腕の描画

368 glRotatef ( myCharactor . leftArm_elbow , 1.0 , 0.0 , 0.0); 369 glTranslatef (0.0 , 0.5 , 0.0); 370 glPushMatrix (); 371 glScalef (0.2 ,1.0 ,0.2); 372 glutSolidCube (1.0); 373 glPopMatrix (); 374 375 glPopMatrix (); 376 377 //頭の描画 378 glTranslatef (0.0 , 0.5 , 0.0); 379 glutSolidSphere (0.5 ,12 ,12); 380 381 //身体の描画 382 glTranslatef (0.0 , -1.0 , 0.0); 383 glScalef (1.0 ,1.0 ,0.2); 384 glutSolidCube (1.0); 385 386 glPopMatrix (); 387 } 388 389 // 相 手 の キ ャ ラ ク タ の 描 画 390 void DrawYourCharactor ( void ) 391 {

392 glPushMatrix ();

393 GLfloat mat0ambi [] = {0.1 , 0.18725 , 0.1745 , 1.0};//トルコ石

394 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , mat0ambi ); //環境光の反射率を設定 395 GLfloat mat0diff [] = {0.396 , 0.74151 , 0.69102 , 1.0};//トルコ石

396 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , mat0diff ); //拡散光の反射率を設定 397 GLfloat mat0spec [] = {0.297254 , 0.30829 , 0.306678 , 1.0};//トルコ石

398 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , mat0spec ); //鏡面光の反射率を設定 399 GLfloat mat0shine [] ={ 12.8 };//トルコ石

400 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , mat0shine ); 401

402 glTranslatef ( yourCharactor .x , 0.0 , yourCharactor .z ); //ランダムに X 軸 方 向 , Z 軸 方 向 に 移 動 403 glRotatef (90 , 0.0 , 1.0 , 0.0);

404

405 //右腕の描画 406 glPushMatrix ();

407 glTranslatef ( -0.6 , 0.0 , 0.0);

408 glRotatef ( yourCharactor . rightArm_shoulder /3 , 0.0 , 1.0 , 0.0); 409

410 //右上腕の描画

411 glRotatef ( yourCharactor . rightArm_shoulder , 1.0 , 0.0 , 0.0); 412 glTranslatef (0.0 , 0.5 , 0.0); 413 glPushMatrix (); 414 glScalef (0.25 ,1.0 ,0.25); 415 glutSolidCube (1.0); 416 glPopMatrix (); 417 418 glTranslatef (0.0 , 0.5 , 0.0); 419 420 //右前腕の描画

421 glRotatef ( yourCharactor . rightArm_elbow , 1.0 , 0.0 , 0.0); 422 glTranslatef (0.0 , 0.5 , 0.0); 423 glPushMatrix (); 424 glScalef (0.2 ,1.0 ,0.2); 425 glutSolidCube (1.0); 426 glPopMatrix (); 427 //剣の描画 428 glPushMatrix (); 429 glTranslatef (0.0 , 0.5 , -0.75); 430 glScalef (0.05 ,0.05 ,1.5); 431 glutSolidCube (1.0); 432 glPopMatrix (); 433 434 glPopMatrix (); 435 436 //左腕の描画

(15)

437 glPushMatrix ();

438 glTranslatef (0.6 , 0.0 , 0.0); 439 glRotatef (10 , 0.0 , 0.0 , 1.0); 440

441 //左上腕の描画

442 glRotatef ( yourCharactor . leftArm_shoulder , 1.0 , 0.0 , 0.0); 443 glTranslatef (0.0 , 0.5 , 0.0); 444 glPushMatrix (); 445 glScalef (0.25 ,1.0 ,0.25); 446 glutSolidCube (1.0); 447 glPopMatrix (); 448 449 glTranslatef (0.0 , 0.5 , 0.0); 450 451 //左前腕の描画

452 glRotatef ( yourCharactor . leftArm_elbow , 1.0 , 0.0 , 0.0); 453 glTranslatef (0.0 , 0.5 , 0.0); 454 glPushMatrix (); 455 glScalef (0.2 ,1.0 ,0.2); 456 glutSolidCube (1.0); 457 glPopMatrix (); 458 459 glPopMatrix (); 460 461 //頭の描画 462 glTranslatef (0.0 , 0.5 , 0.0); 463 glutSolidSphere (0.5 ,12 ,12); 464 465 //身体の描画 466 glTranslatef (0.0 , -1.0 , 0.0); 467 glScalef (1.0 ,1.0 ,0.2); 468 glutSolidCube (1.0); 469 470 glPopMatrix (); 471 472 } 473

474 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 475 {

476 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア

477 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 478 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効 479 480 // 自 分 が 死 ん で い た ら You Lose ! を 表 示 す る 481 if ( myCharactor . isAlive ==0){ 482 // 文 字 列 の 描 画 483 glPushMatrix (); 484 GLfloat matString [] = { 0.8 , 0.0 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 485 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , matString );

486 glRasterPos3f ( -1.0f , 0.0f , 0.0 f ); 487 char * str = " You Lose !";

488 while (* str ){ 489 glutBitmapCharacter ( GLUT_BITMAP_HELVETICA_18 , * str ); 490 ++ str ; 491 } 492 glPopMatrix (); 493 } 494 // 相 手 が 死 ん で い た ら You Win ! を 表 示 す る 495 else if ( yourCharactor . isAlive ==0){ 496 // 文 字 列 の 描 画

497 glPushMatrix ();

498 GLfloat matString [] = { 0.8 , 0.0 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 499 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , matString );

500 glRasterPos3f ( -1.0f , 0.0f , 0.0 f ); 501 char * str = " You Win !";

502 while (* str ){ 503 glutBitmapCharacter ( GLUT_BITMAP_HELVETICA_18 , * str ); 504 ++ str ; 505 } 506 glPopMatrix (); 507 } 508 // 自 分 と 相 手 を 描 画 す る 509 else { 510 glPushMatrix (); 511 512 //マウスでの視点移動 513 glRotatef ( SpinX , 1.0 , 0.0 , 0.0); // X 軸 周 り に S p i n X だ け 回 転 514 glRotatef ( SpinY , 0.0 , 1.0 , 0.0); // Y 軸 周 り に S p i n Y だ け 回 転 515 glScalef ( Scale , Scale , Scale ); // S c a l e だ け 拡 大 縮 小 516 517 // 自 分 と 相 手 を 描 画 す る 518 DrawMyCharactor (); // 自 分 の キ ャ ラ ク タ の 描 画 519 DrawYourCharactor (); // 相 手 の キ ャ ラ ク タ の 描 画 520 521 // 座 標 軸 の 描 画 522 glPushMatrix (); // X 軸 523 GLfloat mat1diff [] = { 0.6 , 0.2 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 524 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat1diff );

(16)

525 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 526 glBegin ( GL_LINES ); 527 glVertex3f (0.0 f , 0.0f , 0.0 f ); 528 glVertex3f (2.0 f , 0.0f , 0.0 f ); 529 glEnd (); 530 glPopMatrix (); 531 glPushMatrix (); // Y 軸 532 GLfloat mat2diff [] = { 0.2 , 0.6 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 533 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat2diff );

534 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 535 glBegin ( GL_LINES ); 536 glVertex3f (0.0 f , 0.0f , 0.0 f ); 537 glVertex3f (0.0 f , 2.0f , 0.0 f ); 538 glEnd (); 539 glPopMatrix (); 540 glPushMatrix (); // Z 軸 541 GLfloat mat3diff [] = { 0.2 , 0.2 , 0.6 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 542 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat3diff );

543 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 544 glBegin ( GL_LINES ); 545 glVertex3f (0.0 f , 0.0f , 0.0 f ); 546 glVertex3f (0.0 f , 0.0f , 2.0 f ); 547 glEnd (); 548 glPopMatrix (); 549 550 glPopMatrix (); 551 } 552 553 glutSwapBuffers (); // 描 画 実 行 554 } 555

556 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 557 { 558 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 559 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 560 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 561 562 GLfloat light0pos [] = { 0.0 , 10.0 , 0.0 , 1.0 };

563 glLightfv ( GL_LIGHT0 , GL_POSITION , light0pos ); //光源0 の 位 置 を 設 定 564

565 GLfloat light0ambi [] = { 0.2 , 0.2 , 0.2 , 1.0 };

566 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0ambi ); //光源0 の 環 境 光 の 色 を 設 定 567 GLfloat light0diff [] = { 0.8 , 0.8 , 0.8 , 1.0 };

568 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0diff ); //光源0 の 拡 散 光 の 色 を 設 定 569 GLfloat light0spec [] = { 0.5 , 0.5 , 0.5 , 1.0 };

570 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0spec ); //光源0 の 鏡 面 光 の 色 を 設 定 571

572 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 573 }

574

575 int main ( int argc , char * argv []) 576 {

577 glutInit (& argc , argv ); // G L U T 初 期 化

578 glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); 579 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 580 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成 581 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 582 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 583 584 glutMouseFunc ( mouse ); // マ ウ ス ク リ ッ ク コ ー ル バ ッ ク 関 数 の 指 定 585 glutMotionFunc ( dragMotion ); // マ ウ ス ド ラ ッ グ コ ー ル バ ッ ク 関 数 の 指 定 586 587 glutKeyboardFunc ( keyboard ); // 通 常 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 588 glutSpecialFunc ( specialKey ); // 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 589 glutSpecialUpFunc ( specialKeyUp );// 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 離 し た と き ) 590 591 glutTimerFunc (20 , timer , 20); // 定 期 的 に 呼 び 出 さ れ る 関 数 の 指 定 592 593 // 自 分 の キ ャ ラ ク タ ー の 構 造 体 デ ー タ を 初 期 化 594 myCharactor . isAlive = 1; // 生 き て い る 595 myCharactor .x = 2; // キ ャ ラ ク タ の 初 期 位 置 ( X 座 標 ) 596 myCharactor . moveX_flg = 0; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 597 myCharactor . moveX_timer = 0; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 598 myCharactor .z = 0; // キ ャ ラ ク タ の 初 期 位 置 ( Z 座 標 ) 599 myCharactor . moveZ_flg = 0; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 600 myCharactor . moveZ_timer = 0; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 601 602 myCharactor . rightArm_shoulder = -30; // キ ャ ラ ク タ の 右 肩 の 角 度 603 myCharactor . rightArm_elbow = -30; // キ ャ ラ ク タ の 右 肘 の 角 度 604 myCharactor . rightArm_timer = 0; // 右 腕 ア ニ メ ー シ ョ ン フ ラ グ 605 myCharactor . rightArm_animationFlg = 0; // 右 腕 ア ニ メ ー シ ョ ン タ イ マ ー 606 myCharactor . leftArm_shoulder = 180; // キ ャ ラ ク タ の 左 肩 の 角 度 607 myCharactor . leftArm_elbow = 0; // キ ャ ラ ク タ の 左 肘 の 角 度 608 myCharactor . leftArm_timer = 0; // 左 腕 ア ニ メ ー シ ョ ン フ ラ グ 609 myCharactor . leftArm_animationFlg = 0; // 左 腕 ア ニ メ ー シ ョ ン タ イ マ ー 610 611 // 相 手 の キ ャ ラ ク タ ー の 構 造 体 デ ー タ を 初 期 化 612 yourCharactor . isAlive = 1; // 生 き て い る

(17)

613 yourCharactor .x = -2; // キ ャ ラ ク タ の 初 期 位 置 ( X 座 標 ) 614 yourCharactor . moveX_flg = 0; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 615 yourCharactor . moveX_timer = 0; // X 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 616 yourCharactor .z = 0; // キ ャ ラ ク タ の 初 期 位 置 ( Z 座 標 ) 617 yourCharactor . moveZ_flg = 0; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン フ ラ グ 618 yourCharactor . moveZ_timer = 0; // Z 軸 方 向 移 動 ア ニ メ ー シ ョ ン タ イ マ ー 619 620 yourCharactor . rightArm_shoulder = -30; // キ ャ ラ ク タ の 右 肩 の 角 度 621 yourCharactor . rightArm_elbow = -30; // キ ャ ラ ク タ の 右 肘 の 角 度 622 yourCharactor . rightArm_timer = 0; // 右 腕 ア ニ メ ー シ ョ ン フ ラ グ 623 yourCharactor . rightArm_animationFlg = 0; // 右 腕 ア ニ メ ー シ ョ ン タ イ マ ー 624 yourCharactor . leftArm_shoulder = 180; // キ ャ ラ ク タ の 左 肩 の 角 度 625 yourCharactor . leftArm_elbow = 0; // キ ャ ラ ク タ の 左 肘 の 角 度 626 yourCharactor . leftArm_timer = 0; // 左 腕 ア ニ メ ー シ ョ ン フ ラ グ 627 yourCharactor . leftArm_animationFlg = 0; // 左 腕 ア ニ メ ー シ ョ ン タ イ マ ー 628 629 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 630 631 glutMainLoop (); // メ イ ン ル ー プ へ 632 633 return 0; 634 }

参照

関連したドキュメント

[r]

A H¨ older regularity result for signed solutions was obtained first by DiBenedetto in [3] for degenerate (p &gt; 2) p-laplacian type equations and then by Chen and DiBenedetto in

&lt; &gt;内は、30cm角 角穴1ヶ所に必要量 セメント:2.5(5)&lt;9&gt;kg以上 砂 :4.5(9)&lt;16&gt;l以上 砂利 :6 (12)&lt;21&gt; l

1号機 2号機 3号機 4号機 5号機

6 時台 48.7km/h 7 時台 21.7km/h 8 時台 17.1km/h 9 時台 17.1km/h 10 時台 20.6km/h 11 時台 15.9km/h 12 時台 21.5km/h 13 時台 21.2km/h 平均 21.0km/h. エ

[r]

6/18 7/23 10/15 11/19 1/21 2/18 3/24.

Title of Change: D2PAK single reel packing box change(include dry packing)&amp;remove sponge pad fill for dry packing for D2PAK/DPAK &amp; SPM5 &amp; Remove 1ea bubble bag