« 初音ミク冒険記で多重スクロールを実装!(テスト動画付き) | トップページ | 初音ミク冒険記のソースでリファクタリング祭り »

2013.02.08

初音ミク冒険記の「多重スクロールのバグ」対応

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

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

昨日投稿した記事につけた動画で
ウータウの森のマップで最初の方で
変なマップ画像のスクロールがあった件を調べてみた。

調査前の予想では、2つの原因が考えられる。

1.多重スクロール用に作った変数を初期化していない
 (まだ、初期化処理を作っていなかった)

2.セーブデータに多重スクロール用に作った変数を追加していない

先に2を考えてみる。
多重スクロール用の変数をセーブデータに入れれば問題ない気がする。

が、ここでポイントは「多重スクロール用の3つの変数」の値は
セーブデータにも残しているスクロール用変数を
元ネタにして計算で求めている点だ。

つーことは、
セーブデータに「多重スクロール用の3つの変数」を持たなくても
後から計算で算出できるってことである。

ふむ、2の問題は解決できるのでOKだ!
セーブデータのバージョンを3にしないとダメかなと思ってしまった。

じゃあ、問題は1なわけだ。

初期化といっても、計算で求めれば良い事が分かっている。
となると
セーブデータにも残しているスクロール用変数の初期化後じゃないとダメだ。

スクロール用変数の初期化タイミングは2パターン存在する。
1.セーブデータをロードした時
2.各マップの初期化処理が実行された時

この2つのパターンで共通で動く箇所に計算処理を入れればOKだ。

実は、各マップの初期化処理の中では
両方のパターンによる分岐処理が存在する。
となると各マップの初期化処理の最後に行えば良いことになる。

各マップの共通初期処理は、initMapXX_YYという名前の関数だ。
えーと、今のマップの数は
・プロローグで2
・試練の洞窟で9
・ボカロタウンで7
・ウータウの森で2
計20ソースを直すってことね。

┐(´д`)┌ヤレヤレ



って、そんなアホなことをするのはイヤだ!

なので、1箇所だけ直して乗り切ることにする。
ポイントは、main.cppのWinMain関数にある以下の場所だ。

■修正前


case GAME_MODE_GAME_INIT:
//********************************************
// ゲーム初期処理
//********************************************
initGame();
break;

initGame()は、各マップの共通初期処理関数initMapXX_YYの関数ポインタだ。
ということで、各マップの共通初期処理関数実行後というのは
initGame()実行後とイコールであるため
この後に計算を書けば良いってことになる。

■修正後


//********************************************
// ゲーム初期処理
//********************************************
initGame();
// 多重スクロール対応で左右の移動のみレイヤ毎にスクロールスピードを調整する
// レイヤ3のスクロールスピードを1.0とした時に
// 奥のレイヤほどスクロールが遅く(レイヤ1とレイヤ2)、
// 手前のレイヤはスクロールが速くする(レイヤ4)
g_current_field_pos_Layer1.x = g_current_field_pos.x * 0.5f;
g_current_field_pos_Layer2.x = g_current_field_pos.x * 0.75f;
g_current_field_pos_Layer4.x = g_current_field_pos.x * 1.5f;
break;

これで昨日の記事の動画の処理と同じ操作をしてみると
問題なく期待通りに多重スクロールしてくれた。

しかし、


// 多重スクロール対応で左右の移動のみレイヤ毎にスクロールスピードを調整する
// レイヤ3のスクロールスピードを1.0とした時に
// 奥のレイヤほどスクロールが遅く(レイヤ1とレイヤ2)、
// 手前のレイヤはスクロールが速くする(レイヤ4)
g_current_field_pos_Layer1.x = g_current_field_pos.x * 0.5f;
g_current_field_pos_Layer2.x = g_current_field_pos.x * 0.75f;
g_current_field_pos_Layer4.x = g_current_field_pos.x * 1.5f;

この部分だが、scrollToLeft関数とscrollToRight関数でも使っている。
3箇所目なので共通で使うに関数しておいた方が良いだろう。
そうすれば、レイヤごとのスクロールスピードの倍率を
その関数だけで管理することができる。

さて、次はどこを作ろうかな?
候補としては、
・ウータウの森入口のマップ画像描画を作る。
・ミクの攻撃スキルを作る。(今考えているのは2つの攻撃スキル)
・ブレイクオブジェクトの処理を作る
・ドロップアイテムの処理を作る
・ボカロタウンのマップ画像を作る(こいつは一気にはできないと思う)
・第1章のボスの画像をそろそろ作る
・未解決のバグを直す

といっても未解決バグの中には何度も調べているんだが
原因や解決策が分からないものがあるんだよなぁ・・・
特に初期の頃からあって分からないのが以下の4つだ。

・プロローグ最初のマップの下の坂から歩いて上ってきたときに、
 いきなり画面外に落下することがある

・足場に向かってジャンプすると勝手に更にジャンプすることがある
 特に坂に向かってジャンプする時に発生する
 どうやら坂にぶつかる時に
 左右への移動キーを押していると起きるみたい
 平らな足場でも似たようなので着地と同時に
 垂直ジャンプするってのもたまにあるな・・・

・ミクが動けなくなる不具合がいくつかあります。
 プロローグ最初のマップの最初の坂の上からスタート地点に
 戻ろうとした時にたまに、
 プロローグ2マップ目の中央の壁、
 第1章Xエレメンタルのいるマップの入り口付近など
 →原因は分かっているんだけど対処方法が分からない・・・

・坂に着地した後にミクがじわじわ上に上がっていく
 この時、OnTheGroundとnow_jumpingはともに1
 →この状態が一番面倒臭い気がする・・・

どうしたもんだろう?


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

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

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

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

トラックバック

この記事へのトラックバックの一覧です: 初音ミク冒険記の「多重スクロールのバグ」対応:

コメント

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




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

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