質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

4494閲覧

C言語(DXライブラリ)でのあたり判定について

wilddown

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

2クリップ

投稿2016/05/07 22:29

C言語のDXライブラリを学んでいる者です。[if((ax1<bx2)&&(bx2<ax1)&&(ay1<by2)&&(by1<ay2))]というあたり判定の計算式は理解したのですが、このままでは、弾やモンスター1つ1つにあたり判定を作らなければい気なくなってしまいます。(ax1とかをモンスターの数分作らなければいけない)。モンスターや弾などのあたり判定を全部まとめて処理する方法はないのでしょうか?
ド初心者+わかりにくい質問ですみません。分かりにくいようであれば補足をいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

配列を使えばその心配はありません!
配列は、

int n[10];

のように宣言します。
これはint型のnが10個あるという意味です。
例えば、この10個全部に0を代入したい場合、

C

1n[0] = 0; 2n[1] = 0; 3n[2] = 0; 4n[3] = 0; 5n[4] = 0; 6n[5] = 0; 7n[6] = 0; 8n[7] = 0; 9n[8] = 0; 10n[9] = 0; // 10個の配列は0から始まり、9で終わるので注意が必要です!

↑のようにしてもいいのですが、

C

1for(int i = 0; i < 10; ++i) { // forループといいます 詳しくは調べてみてください^^; 2 n[i] = 0; 3}

↑のようにいっぺんに処理することもできるのです。
これを応用すると、

C

1int px1, py1, px2, py2; // プレイヤーの座標 2int tx1[10], ty1[10], tx2[10], ty2[10]; // 10人の敵の座標 3 4. 5. 6. 7(省略) 8. 9. 10. 11 12for(int i = 0; i < 10; ++i) { 13 if((px1<tx2[i])&&(tx1[i]<px2)&&(py1<ty2[i])&&(ty1[i]<py2)) { 14 // 当たった時の処理 15 } 16}

↑のようにいっぺんに当たり判定の処理ができます。
これはプレイヤーと10人の敵との当たり判定です。敵同士の当たり判定はありません。

頑張ってください。

投稿2016/05/07 23:05

編集2016/05/07 23:09
dkyukinaga

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wilddown

2016/05/07 23:42 編集

おお!配列変数を使ってこんなことができたとは!ありがとうございます! 感謝です! これについて質問なのですが、あたり判定をチェックするたびにforループを使っていると、ゲームが一々止まってしまわないのでしょうか?
majiponi

2016/05/08 06:05

ループに入力待ちを作らなければほとんど問題ないですよ。昔、あるSTGで出てくる「蓬莱の薬」っていう場面では、弾(敵)が2,000発以上ありましたけど、処理落ちはほとんどしませんよ。
dkyukinaga

2016/05/08 07:27 編集

当たり判定は記述量が多いので、ループなんかしちゃうと、かなり処理時間がかかるように思うかもしれませんが、当たり判定の計算式自体にはほとんど時間がかかりません。例えば上記のプログラムを、敵の数を10,000人にして時間を計測してみましたが、1ループあたりに当たり判定の計算自体にかかった時間は0.000016秒でした(ここまで短いとたぶん誤差ですが)。実際のゲームでは、当たった時の処理を書き込むわけですが、変数の代入やif文が十数行あるくらいなら、時間もほとんど関係ありません。ただし、当たり判定の中で画像の読み込み等をすると、かなり時間がかかってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問