リプレイなう!

アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

リプレイなう!

投稿記事 by SAI » 14年前

今回は長いです。

[nico]http://www.nicovideo.jp/watch/sm15660411[/nico]
今までやりたくなかったですが、とうとうリプレイに取り掛かる時がきました。
リプレイって大変そうじゃないですか。あくまでイメージなんですが。
プレイ時と同じ状況を再現しなきゃいけないとか、リプレイの状態が引き継がれないように注意しなきゃいけないとか。
そういうのがめんどそうと思いFifthCannonではやらなかったのですが、弾幕STGにはやはり必須ですね。
そしてもう一つ、まだ作ってすらいないマップ部分もリプレイに対応したいと思っています。
非戦闘時はメトロイドっぽく隠し通路や隠しアイテム満載のゲームにしたいので、どうしてもリプレイがあったほうがいいかなーと思っちゃうのです。
ただしこれは挫折するかもしれまん・・・。
第一にリプレイをどこで切るかという問題です。
セーブした後、そのまま続けた場合とロードした場合で状況が変わります。
敵が近くにいるとかそういうのです。
なのでそこも再現する必要があるわけです。ここはおいおい考えます。
また、いきなりソフトを強制終了させられたときの対処も考えないといけませんね。

そしてリプレイと共に避けてきたビット演算についても勉強してます。
このゲーム、パッド入力(意味のあるキー入力)の数が13あるので2バイト必要なんですよね。
ちょっと多すぎじゃね?とお思いのアナタ!
ちゃんとキーボードでもできるように考えています。(というか自分がキーボード派)
まず絶対必要な上下左右。
STGではおなじみショット、ボム(このゲームでは魔法のこと)、低速、ポーズ。
そしてたまにしか押さないキー(アイテム、ボム(このゲームにおける)、チェンジ)という構成になっています。
あと二つは、決定とキャンセルです。ショットは押しっぱでいいので、プレステコントローラーでいう○ボタンに割り振られていると指が疲れるんですよね。
だからといってL1やR1にすると、決定する際に結構もどかしくなります。慣れればいいのですが、やはり決定は○がいいなあと思うのです。
ただし○にボムも振られていた場合、決定を押して戦闘突入した直後にボムが誤爆する可能性も・・・。

そこは勘弁してください。


で、肝心のリプレイの仕組みですが、ISLeさんに教えていただいたビット演算によるキー入力の保存をそのまま使わせていただき、MoNoQLoREATORさんのファイルにちまちまとキー入力を保存するやり方でメモリをなるべく消費せずに記録しています。
お二方情報提供ありがとうございます m(_ _)m
ただし記録する場所は一時的な保存ファイルで、最後リプレイ記録が終了するときにリプレイに関する情報などと一緒に、まとめてリプレイファイルとして別のファイルに保存しています。
また、キー入力を見る関数を2つ用意しました。1つはリプレイ再生時にはリプレイの入力情報(別変数で保存)を、通常時は現在の入力情報を渡す関数で、もうひとつはリプレイ再生時も現在の入力情報を渡す関数です。
これにより、再生中もキー入力を受け付けて、龍神録のような倍速リプレイや途中キャンセルを実装しています。


そしてリプレイの実装中、こんなバグに遭遇しました。
リプレイ選択時にカーソルが下に行ったと思ったら上に戻ってしまうという謎のバグです。
一番下に行ったときに上に戻るのは正しいのですが、そうでないのに戻ってしまうのです。
しかも変数に代入するところにブレークポイントで見張ってたのですが、どこもヒットせず。
なんじゃこりゃあ!

変数の値が変更された瞬間にその場でブレークする機能さえあれば・・・。
とtwitterで呟いたら御津凪さんと沖さんに同時にあるよと教えていただきました。

(; ・`д・´) ナ、ナンダッテー!! (`・д´・ ;)

今まで散々探してなかったのに!ググったけど見つからなかったのに!

・・・もしかして日本語悪くてブレークポイントの設定の、変更されたときにブレークポイントでブレークすることを言ってると伝わってるんじゃ!
なんて思ったらそんなことはなかった。
二行前のことは忘れてー (/ω\)ヤメテー

なんでもデバッグ中に、デバッグ→ブレークポイントの作成→新しいデータ ブレークポイント
を選択するとできるそうです!
すげー!みんなも試してみよう!

え・・・?
常識・・・だと・・・?




(´;ω;`)ブワッ


お二人とも・・・真にお手数をおかけして申し訳ありません・・・・。 orz
そしてガンガン使っていきたいと思います! 本当に助かりました。
はいでは早速。

そして謎の行でブレーク。
なんだこりゃ。この行にはその変数は含まれておらんぞ。

・・・

・・・?


・・・・!!!




配列オーバーでした(号泣)

うーんそりゃいくら変数見張っててもわからんわけだ。



あと、ネックだった描画についての実験もちょっとしました。
結果は、描画のサイズがデカければデカイほど時間がかかるという当たり前のものでしたが。
だからどうしてもたくさん弾を出したいときは、小さい弾にするというのも手ですね。

そんなわけでリプレイのコードをのっけたのでよろしければ見てやってください。
宣言がなくて意味不明な変数や関数があると思うのでわからないときはどんどん聞いてやってください。
► スポイラーを表示
► スポイラーを表示
最後に編集したユーザー SAI on 2011年9月20日(火) 17:04 [ 編集 1 回目 ]

コメントはまだありません。