合計 昨日 今日

C言語でシューティングゲームを作りたいのですが

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: aolf
[URL]
Date: 2018年1月11日(木) 16:51
No: 1
(OFFLINE)

 C言語でシューティングゲームを作りたいのですが

C言語でシューティングゲームを作ろうとしているのですが、「画面の右端から敵が出てきてX座標700の所で3秒間停止し、その後また画面から消えていく」というプログラムがどうしても作れません。

60fpsでの稼働を目指しているのでSleepは使えず、またゲームの背景や自機の操作は可能な状態にしたいので、どちらにしろSleepが使えません。

Sleepを使わず、3秒間だけ敵のみを停止させるプログラムの作り方を教えて下さりませんでしょうか?

現在作っているプログラムは
------------------------------------------------------------------------------------------------------------------------------------------------------
void Fighter_Script(void)
{
double starttime, endtime;
double totaltime = 0.0, settime = 3.0;

starttime = clock(3000) / CLOCKS_PER_SEC;

for (e = 0; e < EMAX; e++) {
if (ex[e] < 700) { emcnt = 2; }
if (totaltime>settime) { emcnt = 4; }
endtime = clock(3000) / CLOCKS_PER_SEC;
totaltime = endtime - starttime;
if (eflag[e] == 1) {
if (ex[e] ==699) {
ey[e] = rand() % 550 + 50;
ex[e] = 1280;
}
dg_drawbmp3(bb, ex[e], ey[e], 100, 100, enemy_pbmp, 0, 0, RGB(255, 255, 255));
}
else if (eflag[e] == 2) {
dg_drawbmp3(bb, ex[e], ey[e] + 30, 50, 50, effect_pbmp, eanime[e] * 50, 0, RGB(255, 255, 255));
eanime[e]++;
if (eanime[e] == 7) {
eflag[e] = 1;
ex[e] = 1280;
ey[e] = rand() % 550 + 50;
}
}

switch (md[emcnt]) {
case 1:ex[e] -= 10; break;
case 2:ex[e] = ex[e]; break;
case 3:ex[e] += 10; break;
case 4:ex[e] -= 2; break;
case 6:ex[e] += 2; break;
case 7:ex[e] -= 2; ey[e] -= 2; break;
case 8: ey[e] -= 2; break;
case 9:ex[e] += 2; ey[e] -= 2; break;
}

//次のデータへ
emcnt++;
if (md[emcnt] == 997) { emcnt = 0; }
if (md[emcnt] == 998) { emcnt = 2; }
if (md[emcnt] == 999) { emcnt = 4; }
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------
になります。
地味な動きでも良いので、スクリプトとして、右端から敵が出てきて停止し、その後画面から消えていく流れを実現させたいです。
C言語歴は10ヶ月ほどですが、大きめのシューティングゲームを作るのは始めてです。

ご回答宜しくお願い致します。

Name: 参照魚
[URL]
ぴよぴよ(282 ポイント)
Date: 2018年1月13日(土) 20:42
No: 2
(OFFLINE)

 Re: C言語でシューティングゲームを作りたいのですが

C言語(C++も)は言語の仕様として関数の途中からプログラムを実行することができません。Figter_Scriptは60fps(16.6m秒)毎に最初から実行されるという前提でプログラムする必要があります。DXライブラリなら下記のようにwhileループの中に記述されると思います。
コード[C++]: 全て選択
1
2
3
while ( !ProcessMessage() ) {
    Fighter_Script();
}

記載のプログラムは変数の管理が混乱しているように見受けられます。このまま進めると破綻する可能性が大きいので、まずは構造体を使って、変数を整理することからお奨めします。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 敵全体で共通の変数
UINT totaltime = 0;    // ゲーム開始からの経過時間?
UINT settime = 3 * 60;    // 敵が出現する時間?
UINT md[9];  // 動作を切り替えるタイミングのデータ
 
// 敵毎に固有の変数
struct ENEMY {
    float ex; // X座標
    float ey; // Y座標
    UINT eflag;    // 0:表示OFF,1:表示ON+アニメOFF,2:表示ON+アニメON
    UINT eanime; // アニメ番号
    UINT emcnt; // 動きを切り替える変数?
    UINT starttime; // 発生してからの時間(寿命)?
    UINT endtime;   // ?
};

Name: Dixq (管理人)
(管理人)
[URL]
ウィザード(1,492,118 ポイント)
Date: 2018年1月13日(土) 23:47
No: 3
(OFFLINE)

 Re: C言語でシューティングゲームを作りたいのですが

ゲームプログラムの作り方はこちらで紹介しています。
http://dixq.net/g/
C++でシューティングならこちら
http://dixq.net/rp2/

で、質問への回答ですが、60fpsで動いていることを前提とするなら、常にメインループに処理を返しつつ、
カウンタを1フレームに1つ加算し、カウンタが60x3=180ほどになった時点で処理をすることで3秒待機することができます。
ゲームプログラミングの館の4章くらいまで読めば大体わかると思います。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]