忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

自機と敵弾の当たり判定を追加しました。
s-WS000344.jpg
先日上手く出来なかったと言っていたのですが、もう一度作り直したら上手く動きました^^
ただ、一つ問題が出てきて、敵弾の画像を回転させて表示させているのですが、そうすると
当たり判定を行う位置が変わってくるんです。
例えば、座標10,10に画像を表示させる事を考えてみると、こんな感じになります↓
s-4_123.jpg
回転させずに表示した場合は、画像の左上が表示座標になるので、当たり判定の中心は
「座標+画像の半分の大きさ」になります。
ところが、回転させて表示させた場合は、画像の中心が表示座標になるので、当たり判定の
中心は、座標そのままとなります。

その辺を踏まえて当たり判定を追加してみました。プロジェクトファイルはコチラです↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239517956

敵弾の当たり判定処理は、敵との判定処理を流用したので、「判定位置-画像の半分の多きさ」
としたのですが、非常に見にくいプログラムなので作り直そうかと思っています。
変数の名前に付け方に問題があるような気もしますが、自分にわかる言葉にしておかないと
後で見た時に、何の変数なのかがわからなくなってしまうので、ENEMY_TAMA_ATARIHANTEIなんて
書き方をしています^^;
PR
メガドライブやマスターシステム(マークIII)等に搭載されていた音源チップのSN76489を
エミュレートしたSN-EMUと言うVSTがある事を知り、早速使ってみました。
ダウンロードはコチラから出来ます↓
http://benanderson89.blogspot.com/2009/04/sn-emu-available-now-megadrive-vst.html

ダウンロードしたSN-EMU.dllをVSTプラグインフォルダに入れれば起動出来るようになります。
s-sn-emu.jpg
操作画面はこんな感じ。はっきり言って、全く使い方がわかりませんでした(汗)
まず、各パラメータの変更方法がわからなかったのですが、これは変更したいパラメータの上に
マウスを持っていって、左クリックしながら上下にドラックすれば変更出来ます。
(デフォルトの状態では全て0になっているので音が出ない)

使えるようになるまで結構苦労したので、簡単に使い方の説明を書いておきます。
s-4_122.jpg
まず、このVSTは矩形波とノイズの2種類の音色が出せるのですが、画面左側が矩形波の設定用で
画面右側がノイズの設定用となります。
ADSRでエンベローブ等の設定です。どう変わるかは実際に色々いじって見て下さい。
Vがボリュームです。
Mがミックス、Rがレート、Dがディレイ。この辺も実際にいじった方が判りやすいと思います。
M/Pは同じチャンネルの音を重ねるかどうかの設定。

ノイズ側はC5とD5とE5(ドレミ)のみ音がなり、C5がL、D5がM、E5がHで設定出来ます。
それぞれLOW MID HIGHって事ですね。

矩形波はMIDIチャンネル1でのみ鳴りますので、DAWの設定でチャンネル1に合わせます。
MIDIチャンネルを2にするとノイズを鳴らす事が出来ます。
と言った感じ。

このVSTを使ってアレスタの5面をコピー?してみました↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239467941
色々と適当ですが(汗)
音はいかにもPSG!って音がして良い感じです^^
コレとVOPMを使えば、FM音源+PSGの曲なども再現出来てしまいそうですね。

自機と敵の当たり判定を追加しました。
s-WS000339.jpg
判りやすいように、当たり判定を緑色で囲ってみました。
個数対複数の判定方法は敵の数だけ自機との判定を行えば良いので簡単です。
関数はこんな感じ↓
////////////////////////////自機と敵の当たり判定////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void hantei_jiki_teki(){
 int i;
 int atari=0;
 int Cr;
 Cr = GetColor(   0 , 255 , 0 ) ; // 緑色の値を取得

for(i=0;i<ENEMY;i++){//自機対敵での当たり判定
if(enemy[i].ef==1) {
 if( ch.x+JIKI_ATARIHANTEI<(enemy[i].ex+enemy[i].e_sizex)-ENEMY_ATARIHANTEI && enemy[i].ex+ENEMY_ATARIHANTEI<(ch.x+ch.t_sizex)-JIKI_ATARIHANTEI && ch.y+JIKI_ATARIHANTEI<(enemy[i].ey+enemy[i].e_sizey)-ENEMY_ATARIHANTEI && enemy[i].ey+ENEMY_ATARIHANTEI<(ch.y+ch.t_sizey)-ENEMY_ATARIHANTEI) atari=1;else atari=0;
 /*当たり判定表示*/
 SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 );
 DrawBox( enemy[i].ex+ENEMY_ATARIHANTEI , enemy[i].ey+ENEMY_ATARIHANTEI , enemy[i].ex+enemy[i].e_sizex-ENEMY_ATARIHANTEI , enemy[i].ey+enemy[i].e_sizey-ENEMY_ATARIHANTEI , Cr , TRUE ) ;//当たり判定表示内部
 SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;

 if( atari==1 ) DrawString(300,100,"Hit!",Cr);//当たったときはHit!を表示
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

調子に乗って、敵弾と自機の当たり判定も作ってみたのですが、実装方法は同じはずなのに
上手く動いてくれません・・・
s-WS000338.jpg
なぜか、敵の奇跡を辿って敵弾の当たり判定が表示されてしまってます。
しょうもない間違いだと思うのですが、何度見直しても判らないんですよね・・・
ただ、C言語の場合は変数の打ち間違いは発生しないので、その辺は何か不具合があった時に
見直しやすいなぁと感じました。まぁ、ちゃんと動いてくれるのがイチバン良いのですが^^;

当たり判定ですが、普通はキャラの大きさよりも小さい事が多いです。
こんな感じ↓
s-hantei.jpg
弾幕STGとかだと、もっと小さい範囲になったりしますね。
この範囲を計算するためには下図のような計算をすれば算出できます。
s-wariai.jpg*クリックで拡大します。
つまり、左上の座標X,Yと画像サイズX,Yと当たり判定の割合の5つの要素があれば
当たり判定の計算が可能だと言う事になります。

それを踏まえて、昨日作ったプログラムの当たり判定の大きさを自在に変更出来るように
してみました↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239364262

動かすとこんな感じです↓
s-WS000337.jpg
↑↓←→で自機移動
Z⇔Aで敵X軸拡大縮小
X⇔Sで敵Y軸拡大縮小
C⇔Dで敵当たり範囲拡大縮小
自機と敵当たり範囲が当たると”Hit!”と表示します。

上記のプログラムの当たり判定処理はこんな感じになってます↓
if(px<ex+exs-wariai && ex+wariai<px+pxs && py<ey+eys-wariai && ey+wariai<py+pys)
atari=1; else atari=0;
これを踏まえて、作成中のゲームプログラムに組み込んでみようと思ってます。
当たり判定を実装しようと思ったのですが、以前書いた方法だと正方形の場合は良いのですが
長方形の場合は、上手く判定してくれませんでした。
ちなみにこんな感じの判定方法です↓
ddx=(ex+16)-(px+16)
ddy=(ey+16)-(py+16)
if (abs(ddx)<10)&(abs(ddy)<10)
中心座標を求めて絶対値を使って判定しています。

で、どうしようかと思っていたのですが以前購入したシューティングゲームプログラミング
良い方法が書いてありました。判り易いように図に纏めてみた↓
s-atari.jpg*クリックで拡大します。
4点の座標を計算して判定しているので、判定の対象が長方形になっても対応出来ます。
4点の座標の計算方法はGetGraphSizeを使って画像の大きさを調べて、左上の座標に
足して計算すれば、残りの3点も計算できますね。

上記を踏まえて、簡単な当たり判定プログラムを作ってみました↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239286528
このプログラムを実行させるとこんな感じ↓
s-WS000335.jpg
↑↓←→で自機移動
Z⇔Aで敵X軸拡大縮小
X⇔Sで敵Y軸拡大縮小
自機と敵が当たると”Hit!”と表示します。
この判定方法だと、長方形でも判定出来るので良い感じです。
ただ、回転する長方形には使用出来ないので、何か良い方法はないかと思って調べてみると
色々と解説されているサイトは見つかったのですが、書いている事が難しくて
理解出来ませんでした(汗)
Twitter
カレンダー
07 2026/08 09
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]