技術解説とか大それたこと言ってますが、正直人に教えられるような技術は自分にはないと思ってます・・
(何つったって国語の能力がないわけだし・・
いろんなサイトで調べてきたプログラム技術をそのまま書いてるようなものです。
自分のために書いているものですので、お許しください。
今日と明日の2日間でゲーム「ババドン」の当たり判定の部分のプログラム解説をしたいと思います
最初は当たり判定の基本から説明していきたいと思います。
はじめてプログラミングでゲームを作る人にとって、当たり判定アルゴリズムは最初の難関です!
(アルゴリズムとは問題を解くための効率的手順を定式化した形で表現したものを意味するby wiki 例えばaとbの平均を求める式 c=(a+b)/2 これは平均値を求めるアルゴリズムです、と言う事ができる。)
しかし、アクションゲームでもシューティングでもよけゲーでも当たり判定ができないとゲームの形すら作れませんよね
ゲームを作れるようになるにはこれを理解しないと進めません。
当たり判定アルゴリズムは、考え方として最低4種類あります。(と思ってます
1つ目は
【上下右左の4方向から座標を限定する方法】
例えば敵Aのウィンドウ上の配置座標がa,bだとします
(※ウィンドウには左上を基準とした座標という概念があります)
画面中心(中心の座標は320,240)40ドット四方に敵が入ると死亡としたいなら、敵が
X軸座では300~340内に
Y軸座では220~260内に
いれば死亡と考えるのでプログラムは
if a>300:if a<340:if b>220:if b<260:; 敵死亡
と書けます。
これは自分or敵が四角い場合によく使います。一番簡単な部類の当たり判定です。
逆に自分が不定形のときや丸いときは使いません。
ちなみに(私も含め)よく初級者がひっかかるのは
if 300<a<340
とaの式をひとつにまとめてしまうことがあるのですが、この表記は数学や物理ではよくしますが
プログラムの世界ではバグと認識されてしまうので注意しましょう。
2つ目は
【3平方の定理を使った距離で判定する方法】
自分と敵までの距離を3平方の定理で算出して一定距離以内なら当たっているとする方法です。
例えば自分の座標がx,y 敵がa,b だとすると
kyori2=(x-a)*(x-a)+(y-b)*(y-b); 距離の2乗を算出
kyori=sqrt(kyori2) ;距離を算出
if kyori<50.0: ;距離が50ドット以内なら当たり
となります。三平方の定理を正直に使えば、2乗したもの同士を足して最後に平方根の中に入れて
距離を算出するという、少々面倒な方法になりますが、わざわざ平方根を求めなくても
3行目の50のところを2乗してあげれば計算過程がひとつ減ります。
だから
kyori2=(x-a)*(x-a)+(y-b)*(y-b); 距離の2乗を算出
if kyori2<50.0*50.0: ;距離が50ドット以内なら当たり
これで2行になります
最後に応用で
if (x-a)*(x-a)+(y-b)*(y-b)<2500.0 ;距離が50ドット以内なら当たり
このように変数をも省略し、1行にまとめてしまえばさらにすっきりします。
この方法は自分と敵がだいたい円形である場合に一番威力を発揮する方法です。
逆に極端に横長な場合には使わないほうがいいでしょう
3つ目は
【背景1ドットの色を識別する方法】
pget命令で背景のドット色を読み取り、色のRGBにより、当たっているか判定する方法です。
「ポンコツ自動車シュラーシュラー」はこの方法を使ってます!(図ではババドンのUFOがかかれてますが・・
例えば
図のように背景が黒と白で、黒に当たると死亡としたいなら
この4箇所の点(実際はもっと小さい点)でpgetし、読み取った背景の色がginfo_r ginfo_g ginfo_bに代入されるので、
if ginfo_r=0:if ginfo_g=0:if ginfo_b=0:;色コードが黒なら死亡
と、こう表せます。もちろん背景が2色だけということは稀なので、
条件式if ginfo_r=0のところを >= や <= や ! を使ってうまく式変形して、臨機応変にやってください。
注意すべきはpgetで色を読み取るとき、自機(この場合UFO)の描画命令をした後読み取ってしまうと
背景ではなく自機の色をpgetすることになってしまうので、必ず自機の描画命令の前にpgetしましょう。
ふぅ
疲れたので4つ目は明日に回します
次回:技術解説「ババドン」その2 当たり判定②