Comments
Description
Transcript
ゲームプログラミング(STG)
}enemy_order_t; ゲームプログラミング(STG) まず、一番左は敵が出現する時刻です。 森分 祐希 60fps なので、60=1 秒です。つまり1つ 目の敵は、ゲームが始まってから 1 秒位 1.まえがき たって出現する事を意味しています。エ 私は、STG(シューティングゲーム)の作成を行 クセルでは同じような変化を持つ値は いました。最初から作るのは難しいので、今回は、 簡単に作れるのでとても便利です。 「ゲームプログラミングの館」というサイトを参 考にしました。 2.研究内容 Visual studio C++を用いて STG を作成しまし た。以下にゲームの処理について説明します。 ○敵の表示 //敵に関する構造体 typedef struct{ int flag,cnt,pattern,muki,knd; int hp,hp_max,item_n[6],img; double x,y,vx,vy,sp,ang; 図 1 敵出現データ(一部) int bltime,blknd,blknd2; int col,state,wtime,wait; ○当たり判定 }enemy_t; //当たり判定の処理 int out_judge_cshot(int i,int s){ flag はフラグ、cnt はカウンタ、pattern は double x=cshot[i].x-enemy[s].x; 敵の移動パターンと、そのままの意味を示す名 double y=cshot[i].y-enemy[s].y; 前で用意しました。敵データ処理の大きな流れ if(x*x+y*y<r*r) として、ゲームカウンタがあるポイントに達し return 1; た時、敵データを登録するようにしました。登 return 0; 録された敵データがあれば、登録された移動パ } ターンにそった敵の移動制御を行う関数に処 当たり判定には、ピタゴラスの定理を使 理を渡す。敵が画面から外れると、登録フラグ いました。x の二乗と y の二乗の和が、 (自 を落としました。 機範囲 + 敵範囲)の二乗より小さいとき、 接触している事がわかります。 ○敵の出現データ //敵の出現情報に関する構造体 typedef struct{ int cnt,pattern,knd; double x,y,sp; 図 2 三平方の定理 int bltime,blknd,col,hp; int blknd2,wait,item_n[6]; ○アイテムの表示 1 //アイテムの表示最大数 保つ処理です。だいたいゲームは 60fps で動作 #define ITEM_MAX 100 しています。fps というのは frame per second //アイテムゲットボーダーライン の略で、1 秒間に何フレームかという意味です。 #define ITEM_GET_BORDER_LINE 100 //アイテムの吸収範囲 ○スコアの表示 #define ITEM_INDRAW_RANGE 70 //スコアボード表示 typedef struct{ void graph_board_states(){ int flag,cnt,knd,state; int i; double v,x,y,r; int score=ch.score; }item_t; for(i=0;i<9;i++){//スコア表示 DrawRotaGraph(625-15*i,30,1.0f, 構造体を用意し、変数を宣言し、 「登録・計算・ 0.0f,img_num[0][score%10],TRUE); 描画」を作りました。しかし、アイテム関連の DrawRotaGraph(625-15*i,50,1.0f, 実装にはこれに加えて自機との当たり判定の計 0.0f,img_num[0][score%10],TRUE); 算とアイテムと接触した時のステータス変化の score/=10; 処理が必要になってきます。ステータスを変化 } させ、値を増加させる時の上限値を決めておき ました。 今回ポイントとなるのは、複数の桁がある数 字の表示を画像で行う事です。普通数字の表示 ○FPS制御 は%d で表示させれば桁など気にせずに表示で //FPS きていましたが、今回は 0-9 までの 10 種類の画 #define FLAME 60 像を組み合わせて複数の桁を表示します。 //FPS 制御 void fps_wait(){ 3.まとめ int term,i,gnt; 今回の課題研究を通して、いろいろな処理の static int t=0; 方法を知りました。ゲームだけでなく、様々な //60 フレームの最初なら プログラミングに使えることばかりなので、今 if(fps_count==0){ 後に活かすこたができればいいなと思いました。 if(t==0)//ゲーム開始時 term=0; 4.参考サイト else//前回の記録を元に計算 ・「ゲームプログラミングの館」 term=count0t+1000-GetNowCount; http://dixq.net/g/ } ・「猫でもわかるプログラミング」 //待つべき時間 http://www.kumei.ne.jp/c_lang/ else ・「DX ライブラリ置き場」 term=(int)(count0t+fps_count*(100 http://homepage2.nifty.com/natupaji 0.0/FLAME))-GetNowCount(); /DxLib/ } シューティングゲームには特に重要な FPS を 2