ゲームプログラミング(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