KUNISAN.JPブログ - 6 / 1529 ページ

新規書き込み
ページ:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1529

BALL SHOOTING BALL - プチコン4でビリヤード風ゲーム

名前: 小川 邦久 リンク: https://kunisan.jp 日付: 2019年9月27日

BALL SHOOTING BALL - プチコン4でボール同士の衝突計算2年前に購入したKindle本「Pythonゲームプログラミング 知っておきたい数学と物理の基本」に、ボール同士の衝突処理(円と円の衝突処理)の理論とプログラムが掲載されていました。当時、理論を頭で吸収したつもりでPythonのプログラムを自分なりに書いたものの、なぜかうまく動いてくれませんでした。理由が分からないまま、このプログラムは結局お蔵入りとなってしまいました。

今月8日にリベンジを兼ねてプチコン4でボール同士の衝突計算プログラムを作ってみたところ、今回は比較的あっさりと自然な形で動いてくれました。そのプログラムをさらに発展させて、ゲームにしたのが「BALL SHOOTING BALL」です。スティックで白いボールを操作して、他のボールを黒い穴に全て落とせばクリアで、全15ラウンドあります。

「BALL SHOOTING BALL」
公開キー: 42E338E4V



ボール衝突計算プログラム(右画像)が完成した直後は、具体的なゲームのアイデアはありませんでした。ただ、当初から自分のボールをスティックで動かせる形にしていたので、これをそのまま利用することにしました(後にスティック入力に対しての加速と角度の計算に修正を加えています)。ゲームのアイデアを練っていく中で、頭の中にあったのがファミコンの「ルナーボール」です。ルナーボールはビリヤード風のゲームで、ショットの強度をタイミングよく決める所以外でアクション性はありませんでしたが、色々な画面のパターンがあり、時折ラウンドクリアにパズル的な要素があったりして、この点が面白いと思いました。今回作成するゲームの基本的なルールは「画面上の他のボールを全て穴に落とす」こととして、「色々な画面のラウンドを用意しておく」ということで、大よそのアイデアが固まりました。

ラウンドは全てグラフィック画面で描画していて、ここはファミコンとは大きく異なります。GLINE、GFILL、GBOX、GTRI、GCIRCLE、GPAINTの組み合わせで、プログラムを手書きしながらコツコツと画面を作っていきました。そういうこともあって、全体的にシンプルなデザインの画面になっています。ラウンド毎のボールの配置もデータ形式ではなく、プログラム中にどのように設置するかが記載されています。

ボールの表示はスプライトで、ボール同士の衝突処理は上記の「Pythonゲームプログラミング 知っておきたい数学と物理の基本」に掲載されている理論を参考にしています。具体的には「(ボールAとボールBの重さが同じ場合)ボールAとボールBの接線を基準(X軸)にして、ボールAとボールBの速度の縦方向(Y方向)のベクトルを交換、横方向(X方向)のベクトルはそのまま保持する」というものです。この部分を関数化して(右の画像をクリックすると拡大できます)、1フレーム(1/60秒)毎に全ボール x 全ボールの当たり判定と衝突の処理を行っています。試した限りではボール50個でも遅延なく動いたので、やはりプチコン4の処理の速さはさすがです。

各ボールの床や穴との当たり判定はボール中央1点、ブロックやバンパーとの当たり判定はボール円周60点で行っており、グラフィック面の「色」から判定しています(GPGET)。今考えると16x16の大きさのキャラクターに円周60点の当たり判定は明らかにオーバースペックですが、処理が遅くなるわけでもないのでそのまま残しておいています。これも1フレーム毎に全ボールでこの判定を行っていますが、プチコン4としては余裕の処理のようです。ちなみにボールの移動は1フレームあたり1ドットを大きく超えることもあり、ボールの円周数点で当たり判定が発生することもあります。その場合には、当たり判定のあった全点の平均の角度を算出した後、跳ね返りの角度を計算するようにしています。

今回、ボール同士の当たり判定、ブロックとの当たり判定(ボール円周)、ボールやブロックの配置など、色々なところで三角関数を使いました。ベクトルからATANで角度を算出して、その角度に変更を加えた上で新たなベクトルをCOSとSINの組み合わせで算出…、というのも多くの所で使っています。

また、今回初めてプチコンでドット絵を描いてみました。とはいうものの、ボールと1UPフラッグ位で大したものではありません。それでもこういったドット絵を描くのはX68000以来なので懐かしさを感じました。まあ、根本的に絵心がないので、他のゲームを作るにしても凝ったキャラクターを描くのは無理ではあるのですが…。

BALL SHOOTING BALLの製作期間は、ボール衝突計算プログラムを含めて2週間ちょっとでしたが、9月は3連休が2回あり、たっぷりと時間を使えたこともあって、プログラムは1500行を超えています(ただし、コメントも含みます)。ここまでのプログラムの長さになると画像を繋げていくのが面倒なので、動画にしてプログラムを公開することにします。興味のある方は以下を参照してみてください。

【2019/10/5追記】プログラムを修正したので動画も差し替えました。修正内容: ボール衝突処理調整、粘着ブロックの効果音追加、ボール右に粘着ブロックがある場合のボール震え防止、音符の音程変更、28面(2周目)のエラー回避(15面の音符座標のリセット)、タイトルの白ボール位置微調整、スコア6桁表示→7桁表示OK



高校1年の数学で三角関数を学んだ頃も、一部の自作ゲームで円周状に回転するキャラクターにSIN、COSを使用していました。ただ、30年後にも三角関数を多用してゲームを作ることになるとは、当時の自分にはさすがに想像がつきませんでした…。






ニンテンドー関連記事(リンク一覧): EXTREME EXTERMINATOR - プチコン4でミサイルコマンド風シューティングゲーム / プチコン4のお気に入りの公開作品(ゲーム) / BALL SHOOTING BALL - プチコン4でビリヤード風ゲーム / プチコン4用にSwitch本体周りを一新(スタンド、ワイヤレスキーボード&マウス) / しゅりけんゲーム - プチコン4で梱包材のプチプチ感覚(?)ミニゲーム / ...(記事連続表示)

SmileBASIC専用USBキーボード+マウスセット TKPS-001
SmileBASIC専用USBキーボード+マウスセット TKPS-001をAmazon.co.jpでチェック

ページ:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1529