« Windowsゲーム「初音ミク冒険記」、ボカロタウンのシナリオが少しずつ進展中 | トップページ | 初音ミクの消失 小説版を読んでみた »

2012.09.16

Windowsゲーム「初音ミク冒険記」、ミクが自動的に移動するときの移動速度

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

イベントシーンなどでミクが自動的に移動する時、
ミクの移動速度がなんかおかしいなぁと思っていたのだが、
ようやく原因が判明した。

これまで公開してた分では、
ボカロタウンの入口でデフォ子と別れた後に
ミクの移動速度が異様に早かった。

しかし、1秒間に移動するベクトルは、120ドットで
プレイヤーベクトルも同じく120。

これは予定通りの数値で問題ない。

だから原因がイマイチ分からなかったのだが
今日、別のイベントでミクが移動するシーンを作っていて
今度は、異様に移動が遅かったため
調べてみることに。

キャラの移動速度に関わるベクトルの値は正しいので
それ以外に移動速度に関係するところというと
addVectorInFrameTime関数だ。

//*******************************************************
// 座標に速度ベクトルを足す関数
// g_frametimeを考慮する
//*******************************************************
VECTOR addVectorInFrameTime(VECTOR pos, VECTOR speed){
VECTOR result;
// 等加速度運動の法則
// 距離=速度×時間
// 1秒分のベクトル(speed)×1ループの経過秒数(g_frametime)
result.x = pos.x + speed.x * g_frametime;
result.y = pos.y + speed.y * g_frametime;
result.z = 0;
return result;
}

1フレームの移動距離を計算している関数である。
ここでポイントとなるのは、g_frametimeだ。
g_frametimeは、
ゲームのメインループ1回(1フレーム)にかかる時間である。

試しに、g_frametimeの値を確認する。
すると、0.050000と表示された。

え?
それっておかしくないか?

通常、1秒間に60FPS(1秒間に60フレーム表示)の場合
g_frametimeの値は0.012~0.017の間である。

1秒÷60フレームが1フレームの表示秒数だから
0.017秒を超えると1秒間に60フレーム表示できない。

つまり0.017秒を超えると描画処理が遅くなるのだ。
0.05ってことは1フレームの表示時間が0.016秒台の時と比べて
移動速度が3倍近く遅くなるってことだ。

g_frametimeの値を設定している箇所は、以下の3箇所だ

  1. main.cppのメインループのScreenFlip直前
  2. myGame.cppのplayGame関数の操作禁止の場合の処理中
  3. ポーズボタンが押された時

3.のポーズは、今回は関係ない。

2.付近はこんなロジックだ。

// イベントでの移動のフラグがある時は、止めちゃダメ!
if(eventMoveFlg == FALSE){
// これが画面を止める鍵
g_frametime = 0;
}

今回の問題はイベントでのミクの移動なので
ここも関係ない。

最後の1は、こんなロジックだ。

//******************************************************
// 操作禁止でない場合、1ループにかかった時間を計測
//******************************************************
if(noOperationFlg == FALSE){
//1ループにかかった時間を計測
curtime = GetNowCount() & MAX_INT;
g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
g_lasttime = curtime;
if (g_frametime > 0.03f) g_frametime = 0.03f;
}

イベントでミクが勝手に移動するのは、操作禁止中である。
つまりnoOperationFlg=TRUEの時だ。

えーと、1にも2にも該当しない時が問題となってるのね。
期待通りに動かすためには1のロジックを以下のようにする必要がある。

  • 誤:if(noOperationFlg == FALSE){
  • 正:if((noOperationFlg == FALSE) || (eventMoveFlg == TRUE)){

1のロジックのコメントも合わせて変更しないとダメだね。

そして実行してみたところ、作っていたシーンがうまくいった!
しかも適当にこのくらいかなと指定した
止まるべき座標とバルーンの表示タイミングもバッチリである!

デフォ子とのファースト・コンタクトも確認してみる。



おお! コッチもうまく動いた!

うん、ちょっとのことだけど、満足した感じ!

ここまではOKだ


 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

このエントリーへのリンク

このエントリーのリンクを入れるHTML:

トラックバック

この記事へのトラックバックの一覧です: Windowsゲーム「初音ミク冒険記」、ミクが自動的に移動するときの移動速度:

コメント

このブログの新着コメントをRSSリーダに登録する為のxml




←名前とメールアドレスは必須です。
URLも記入すれば、URLのみが公開されます。
メールアドレスのみですと、メールアドレスが公開されてしまいますので、御注意ください。

↓コメント本文では、「a href」「b」「i」「br/」「p」「strong」「em」「ul」「ol」「li」「blockquote」「pre」のタグが使えます。絵文字をクリックすると、本文にタグを挿入できます。