嫁が 2 ヶ月ほど前にランジャタイのライブの DVD を購入したのだけど、中々見る元気が無くて置物と化していた。今日、ようやく見るに至った。笑えるけれど、エネルギーの消費量が多い。半分まで見て、残りはお預けにした。
Windows API + C 言語でミニゲーム作り。岩石同士の衝突判定周りの挙動が想定どおりになったのだが、コードが散らかっている。キレイにしたら、まとめて push しようと思ったが、いつまでも終わらなそうな気がしてきたので、強い心でゴミだらけのまま push した。
今日は理解を深めるために衝突判定のテストケースを書いていた。ゲームは 2 次元だけど、問題をより単純にするためにまずは 1 次元で起こりうるパターンを書き出してみた。それだけでお腹いっぱい。 下記はコード内にコメントを抜粋したもので、 1 次元上の a, b について
1. 重なる直前のフレーム
2. 重なった瞬間のフレーム
3. 2 の状態を、そのフレーム内でどう訂正するか
を書き出している。
// 静止してる a に b が突っ込むパターン. // 1. b が半分めり込む: // 対処: 両者が重なる直前の位置に巻き戻す + 移動ベクトルを反射する. // x: 01234567890123456789 // a1: [a1] // b1: [b1] // a2: [a2] // b2: [b2] // a3: [a3] // b3: [b3] // // 2. b が半径以上めり込む. // 対処: 両者が重なる直前の位置に巻き戻す + 移動ベクトルを反射する. // x: 01234567890123456789 // a1: [a1] // b1: [b1] // a2: [a2] // b2: [b2] // a3: [a3] // b3: [b3] // // 3. すでにめり込んでて、動きが無い // 対処: なにもしない // x: 01234567890123456789 // a1: [a1] // b1: [b1] // a2: [a2] // b2: [b2] // a3: [a3] // b3: [b3] // // 4. b がすでにめり込んでて、両者の中点側に進もうとしてる: // 対処案1: 反対側に位置補正、ベクトルも反射する // 対処案2: ベクトルを反射する // x: 01234567890123456789 // a1: [a1] // b1: [b1] // a2: [a2] // b2: [b2] // a3: [a3] // b3: [b3] // // 5. b がすでにめり込んでて、両者の中点の反対側に進もうとしてる: // 対処案1: 進もうとしてる方向に位置補正 // 対処案2: ベクトル補正しない // x: 01234567890123456789 // a1: [a1] // b1: [b1] // a2: [a2] // b2: [b2] // a3: [a3] // b3: [b3]