投稿者 るきお  (社会人) 投稿日時 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のような存在がない)