まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
リプレイ機能を実装しようと思って、まずは簡単なリプレイ保存&再生プログラムを作ってみました。
プロジェクトファイルはコチラ↓
http://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241814869
このプログラムを動かすと、まず録画か再生かを聞いてきます。

Zキーもしくはジョイスティックの1ボタンを押すと録画
Xキーもしくはジョイスティックの2ボタンを押すと再生
↑↓←→キーで自機移動です。

g_gtimeが500になると、リプレイ選択画面に戻ります。
リプレイファイルはreplay_data.datファイルとしてルートフォルダに保存されます。
で、まずリプレイを保存する方法をどうしようかと思ったのですが、以前ジョイパッドに対応させようと
した時にGetJoypadInputState関数でキーの状態を数字で表示出来る事がわかりました。
例えば↑キーを押していたら8
Zキー(ボタン1)を押していたら16
と言う感じ。
更に、↑キーとZキーを押していた場合は8+16の24が返ってきます。
なので、こんな感じで↓
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
と記述すれば、変数keyにキーの状態が入力されるわけです。
この変数keyをゲームカウンタ毎に保存出来れば、リプレイが実装出来るのでは?
と思い作ってみました。
方法としては、配列変数を使って保存する方法で、例えば
int g_replay[1000];
として変数g_replayを1000個作ります。
で、key = GetJoypadInputState(DX_INPUT_KEY_PAD1);として
ゲームカウンタ用の変数g_gtimeを宣言して、g_gtimeは1ループに1回プラスしていきます。
で、録画時はg_replay[g_gtime] = key;とすれば、1ループするごとにg_replayにキー情報が
保存されますし、再生時はkey= g_replay[g_gtime];とすれば、1ループごとにキー情報を
読み込む事が出来ます。
とりあえず、コレで録画と再生は出来たのですが、このままだとゲームが終了する度にリプレイ記録
も消えてしまうので、データの保存を行う必要があります。
コレはfopen関数とfclose関数を使って、ファイルに保存出来るようにしました。
ファイルの保存方法は以前書いたデータの保存方法と同じなのですが、配列変数の保存方法が
最初わからずに苦労しました^^;
で、本やネットを調べてみたら、 fwrite( g_replay, sizeof(int), 1000, rp ) ;と言う感じで書けば
上手く動いてくれました。
sizeof(int)がデータのサイズで1000がデータの最大数って事みたいです。
例えばdouble g_replay[5000];だったら
fwrite( g_replay, sizeof(double), 5000, rp ) ;と書けば良いみたい。
読み出しも保存と同じでfread( g_replay, sizeof(int), 1000, rp ) ;と書けばOKでした。
とりあえず、コレで基本的なプログラムは出来た(と思いたい)ので、コレを元に作成中のゲームに
リプレイを組み込もうと思っているのですが、ちゃんと動いてくれるのか凄く不安です(汗)
プロジェクトファイルはコチラ↓
http://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241814869
このプログラムを動かすと、まず録画か再生かを聞いてきます。
Zキーもしくはジョイスティックの1ボタンを押すと録画
Xキーもしくはジョイスティックの2ボタンを押すと再生
↑↓←→キーで自機移動です。
g_gtimeが500になると、リプレイ選択画面に戻ります。
リプレイファイルはreplay_data.datファイルとしてルートフォルダに保存されます。
で、まずリプレイを保存する方法をどうしようかと思ったのですが、以前ジョイパッドに対応させようと
した時にGetJoypadInputState関数でキーの状態を数字で表示出来る事がわかりました。
例えば↑キーを押していたら8
Zキー(ボタン1)を押していたら16
と言う感じ。
更に、↑キーとZキーを押していた場合は8+16の24が返ってきます。
なので、こんな感じで↓
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
と記述すれば、変数keyにキーの状態が入力されるわけです。
この変数keyをゲームカウンタ毎に保存出来れば、リプレイが実装出来るのでは?
と思い作ってみました。
方法としては、配列変数を使って保存する方法で、例えば
int g_replay[1000];
として変数g_replayを1000個作ります。
で、key = GetJoypadInputState(DX_INPUT_KEY_PAD1);として
ゲームカウンタ用の変数g_gtimeを宣言して、g_gtimeは1ループに1回プラスしていきます。
で、録画時はg_replay[g_gtime] = key;とすれば、1ループするごとにg_replayにキー情報が
保存されますし、再生時はkey= g_replay[g_gtime];とすれば、1ループごとにキー情報を
読み込む事が出来ます。
とりあえず、コレで録画と再生は出来たのですが、このままだとゲームが終了する度にリプレイ記録
も消えてしまうので、データの保存を行う必要があります。
コレはfopen関数とfclose関数を使って、ファイルに保存出来るようにしました。
ファイルの保存方法は以前書いたデータの保存方法と同じなのですが、配列変数の保存方法が
最初わからずに苦労しました^^;
で、本やネットを調べてみたら、 fwrite( g_replay, sizeof(int), 1000, rp ) ;と言う感じで書けば
上手く動いてくれました。
sizeof(int)がデータのサイズで1000がデータの最大数って事みたいです。
例えばdouble g_replay[5000];だったら
fwrite( g_replay, sizeof(double), 5000, rp ) ;と書けば良いみたい。
読み出しも保存と同じでfread( g_replay, sizeof(int), 1000, rp ) ;と書けばOKでした。
とりあえず、コレで基本的なプログラムは出来た(と思いたい)ので、コレを元に作成中のゲームに
リプレイを組み込もうと思っているのですが、ちゃんと動いてくれるのか凄く不安です(汗)
PR
カレンダー
03 | 2025/04 | 05 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
リンク
カテゴリー
最新記事
(04/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事