アクションゲームでジャンプ

タグの編集
投稿者 kk1  (中学生) 投稿日時 2010/4/29 23:26:45
http://www.teu.ac.jp/chiit/~jsuzuki/doc/pnc2007/n02/index.html#init
↑のサイトのシューティングゲームを参考にしながら、改造してアクションゲームを作ってます

しかし、ジャンプを再現しようと思って、コードを下のようにプログラミングしました

    Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        '画面を黒でクリアする 
        g.Clear(Color.FromArgb(0, 0, 0))
        '各種キー入力の受付(プレイヤーが生きているときのみ) 
        If zibunSonzai = True Then
            If keyUe = True Then
                zibunY = zibunY - 32 '「上」が押されたので,プレイヤーを上に移動 
                Timer2.Enabled = True
                If zibunY < 0 Then
                    zibunY = 0  'プレイヤーが画面の上からはみ出ないようにする 
                End If
                keyUe = False
            End If

           (以下中略)

    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer2.Tick
        zibunY = zibunY + 32
        Timer2.Enabled = False
    End Sub


しかし、デバックして実際にキーを入力すると、たまにジャンプしたキャラクターが飛びあがったまま降りてこない現象がたまにあります。(キー長押ししたりすると・・)

マリオブラザーズや、星のカービィなどのようなジャンプを再現するには、どのように直したらよいでしょうか?
投稿者 るきお  (社会人) 投稿日時 2010/4/30 13:15:08
こんにちは。

Timer1の間隔(Interval)とTimer2の間隔によっては、
1回Timer2が処理される間に複数回Timer1が作動して座標が思ったとおりにならないことがあるかもしれません。

また、KeyUeがTrueになるタイミングがわからないのですが、
矢印の上を押し続けて、連続してKeyUeがTrueになっているのだとすれば、
Timer1でY座標更新後、KeyUeをいったんFalseにしていますが、すぐこれがTrueになって、
再度Y座標が更新されるということがあるかもしれません。

つまり、kk1さんのプログラムでは1度ジャンプしたら、1度着地するという保障がない状態に見えます。

ちょっと難しいのですが私からの提案です。
キャラクターのジャンプ状態、つまりy座標は時間によって変化します。
上を押した直後の飛び上がったばかりのとき、ジャンプの最高点に到達したとき、などの変化です。

ですから、時間を引数にとってy座標を計算する関数が作成できます。
この関数を仮にMoveとします。
そうすると y = Move(t) 'tは時間 でy座標が決定するので、Timer2は必要なくなりTimer1だけでジャンプの処理が可能です。
(ちなみにMove関数の内部は係数がマイナスの2次関数になります。)

マリオやカービィの場合も、おそらく周期的な処理は1箇所に集約されていて、キャラクターのアクションごとに別の周期的な処理を開始するということはしていないと思います。
そのかわり、Moveのような関数をキャラクターごとに用意してキャラクターごとの位置の計算を楽にしていると思います。
各キャラクターが独自のMove関数を持ち、実際の画面表示のときはキャラクターごとにそのMove関数を呼び出すだけにすればプログラムもよく整理されます。

ここから余談です。
このような1つに集約された周期的な処理をメインループと呼び、マリオなどの場合は、このメインループがTimerではなく、VBで言うところのDo ~ Loopで実装されているものと思います。
が、VBのWindowsアプリケーションでゲームを作る場合はTimerで良いかもしれません。
(マリオには多分メインループの代わりに使えるTimerのような存在がない)
投稿者 るきお  (社会人) 投稿日時 2010/5/4 11:57:19
こんにちは。

ジャンプのサンプルを作ってみました。
トップページにも書きましたが「シムジャンプ」と命名してここからソースコードをダウンロードできます。
http://homepage1.nifty.com/rucio/main/DownLoad/Index_dl.htm#SimJump

最初は単純にジャンプするアクションだけのつもりが、作り始めたら面白くなって
敵を出したり、ダッシュをつけたり、大ジャンプをつけたりしてしまいました。
なので、ちょっとプログラム量が多くなってしまいましたが、代わりにアクションゲームの基本的な要素はいろいろ盛り込めたかなと思うので参考にしてください。

投稿者 kk1  (中学生) 投稿日時 2010/5/4 13:57:40
とても参考になりました
なかなか返事が返せずにすいませんでした・・

もう少し勉強したいと思います