トピック
shoum shoum0403

ピンボールについて

ピンボールはどのように作ればいいですか?ボールの動きをどのようにプログラミングすればいいのか見当すらつきません。まぁ三角関数は絶対いるとはおもいますけど...
1そうだね
プレイ済み
返信[1]
親投稿
BlackSoft BlackSoft.mkII3g
必要な技術としては、お察しの通り三角関数は必要(使わなくても出来るけど超大変)です。 画像を検索なりして見てみればイメージはつくと思いますが、 ・円同士の衝突処理 ・円と斜面の衝突処理 は必要になってくることが分かると思います。 添付画像は私が過去に作ったブロック崩し&インベーダー&ピンボール を混ぜたようなゲームです。 ゲームの速度を優先し、正確な物理演算はせず、キャラクタが衝突した際の位置のみによって跳ね返りの角度を出しています。 ゲームなので、速度や操作性を優先して「それっぽく見えればよい」とするのもアリですよ。
2そうだね
プレイ済み
返信[2]
親投稿
shoum shoum0403
一つ質問なのですが、斜面はどのように判定すれば良いのですか? スプライトにすれば驚異の量になると思われます。 それと斜面に対しボールが斜面の方向に移動させるにはどうすれば良いですか?
0そうだね
プレイ済み
返信[3]
親投稿
BlackSoft BlackSoft.mkII3g
斜面に沿ったボールの移動は、正直難易度が高いと思います。 物理的に正確にボールとの接触位置の傾斜角を出したいのであれば、ボールの周囲をドット単位で調べて、最小二乗法(調べてね)なりで傾斜の近似値を求めるような感じでしょうか。 また、ただ斜面を転がるだけならまだしも、ピンボールのように跳ね返るような動きをさせたい場合は、計算は更に複雑化します。 数学や物理を勉強したいのであれば、色々と算出方法を調べながら、まずは最も簡単なパターンを再現してみる。 ゲームとして形にしたいのであれば、↑で書いたように「それっぽく」見せられるような騙しのテクニックを探ってみれば良いのではないでしょうか。それがプログラミングの醍醐味であり、皆さんも食い付いてくれるところです。 ※いずれにしろ、一から十までは誰も教えてはくれないと思いますので、ご自分で頑張って勉強してくださいね。
2そうだね
プレイ済み
返信[4]
親投稿
InDoor TheInDoor12
私はピンボールを作ったことはないのですが、参考までに。 斜面との衝突判定となると、もはや当たり判定はスプライトを使わず自作した方がよさそうな気がします。 とっさに思いつくのは、斜面を線分として管理して、それとボールが接触した時に「めりこみの深さに応じてその線分の法線方向に力を加える」方法ですかね フックの法則って知ってます?バネの縮みがxのときに、バネに接続された物体にはkx[kは適当な比例定数]の力が加わるって法則なんですが、斜面をバネとして、めり込んだ深さをバネの縮みと考えると、比較的簡単にそれっぽい動きが作れます。 「物体の速度の向きを変える」のではなく、「物体に力を加える」のがポイントです。
2そうだね
プレイ済み
返信[5]
親投稿
shoum shoum0403
black softさん>>やはり物理的な動きを画面上で再現するとなると、難しさが格段とあがるのですね。本当にそれっぽい形で良いのですが、それっぽい形さえも私の技術ではまだ出来なさそうなので、まだまだ物理学にに関しては修行がひつようだなー(^_^;)
0そうだね
プレイ済み
返信[6]
親投稿
shoum shoum0403
InDoorさん>> フックの法則ですか... 理科は苦手だったもんで、プログラミングにすると頭がこんがらかりそう... でも、だいたいイメージはつかめました。ありがとうございます。 それと、スプライトを使わずにGLINEなどの当たり判定はしたことがありません。 (え、まさかそこから学ばないといけないパターン) もしお願いできるのであれば、スプライトと文字の判定のしかたを教えてくれませか?
0そうだね
プレイ済み
返信[7]
親投稿
InDoor TheInDoor12
スプライトと文字の判定? ピンボールの枠をコンソールで作るということでしょうか? 本当に単純に接触を検出するだけなら、 スプライトが占有しているマス目を座標から計算して、 各マスについてCHKCHRでも使って判定すればいいと思いますが [例] このスプライトの左上座標は(x,y)で右下座標は(x+w-1,y+h-1) そこで、左上を含むマス目から右下を含むマス目までループを回す (CHKCHRを使わずに判定用のマップを保持する配列を作った方がいいかも) ボールを矩形ではなく円として扱ったり、斜面を斜面として扱ったりする場合 ちょっと複雑になりそうです…
0そうだね
プレイ済み
返信[8]
親投稿
shoum shoum0403
ツララさん>> 液晶ピンボール的なものは、誰かが作ってた気が... でも、液晶ピンボールなら私にもつくれそうですね。 クオリティーは落ちそうだけど
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
ピンボールだとボールの当たり判定や当たったあとのボールの挙動が初心者には難しいかもしれませんね。 しかし、ゲームならば必ずしも三角関数を使ったりリアルな物理演算が必要というわけではありません。 例えば壁等に当たった場合には入射角=反射角なのですが、これは三角関数を使わなくても左右方向の壁ならばX方向の移動量が反転(プラスとマイナスを逆にする)、上下方向の壁ならばY方向の移動量が反転するだけです。 斜めの壁だと難しいですが、45度の壁のみであればX方向とY方向の移動量を入れ替えたり反転させたりするだけで行えます。
0そうだね
プレイ済み
返信[10]
親投稿
shoum shoum0403
Indoorさん>>CHKCHRという命令を私は使ったことがないので、使ってみようと思います。indoorさんのおっしゃっていることは正直意味がわかりません。私の勉強不足なのですが... 勉強あるのみですね
0そうだね
プレイ済み
返信[11]
親投稿
shoum shoum0403
おちゃめさん>> 一回それで、ブロック崩しゲームを作ったことがあります。 でも、xとyの移動量を反転するだけなので、パターン化するというか、決まった動きにしかならずちょっと面白みがありませんでした。 乱数をちょっと加えたらいけるのかな...
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
適当に乱数を加えてやれば改善可能ですが、ブロック崩しでパドルとの衝突座標によってボールの角度が変わるのと同じくフリッパーとの衝突座標でボールの角度を変えてやればいい感じになると思いますよ。 角度を変えるとなると三角関数が必要になりそうですが、三平方の定理でもそれっぽい感じにすることは可能です。 結局何をどのようにやりたいかが重要なので角度の微妙なコントロールをしたいというのであれば結果的に三角関数を使った方が簡単になる場合もあります。
1そうだね
プレイ済み
返信[13]
親投稿
みなつ tksm372
私も、ずっとピンボールの壁判定について考えてたのですが、ラクに反射方向を計算するする方法として、全ての壁のピクセル毎に法線ベクトルを予め計算しておき、盤面と同じサイズの2次元配列2つにしまっておく、という方法がよさそうでした(≧∇≦)b 単位法線ベクトルNが分かっていれば、入射ベクトルをP、反射ベクトルをRとすると a=(-P)・N として、 R=P+2aN となります。(衝突点を基準にボールが壁の中へP進んだ後、法線ベクトルの方向に2倍戻る感じです) プチコンで計算できるようにX,Y成分になおすと、法線ベクトルNの成分を(Nx,Ny)、入射ベクトルPの成分を(Px,Py)、反射ベクトルRの成分を(Rx,Ry)とすると a = (-Px)*Nx + (-Py)*Ny (内積の公式) Rx = Px + 2*a*Nx Ry = Py + 2*a*Ny と計算できる、と思います(←弱気
2そうだね
プレイ済み
返信[14]
親投稿
みなつ tksm372
あと、反射せずに壁に沿って動く場合ですが、壁に垂直な入射速度の大きさ(前の書き込みのaです)が一定以下なら反射せず壁に沿って移動するとして、このときは壁に垂直な成分だけ打ち消せばいいので、PにaNを1回だけ足せばいいと思います。まとめると、 a=(-Px)*Nx + (-Py)*Ny IF a<(反射限界速度の大きさ) THEN b=1 '壁に沿う動き ELSE b=2 '反射する場合 ENDIF Rx = Px + b*a*Nx Ry = Py + b*a*Ny こんな感じかも!
2そうだね
プレイ済み