リプレイの実装について
Posted: 2009年10月02日(金) 20:46
いつもお世話になっております。
龍神録を改造してリプレイを実装しようと思いました。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=22359&page=&lognum=70&id=dixq&rln=22441
などを参考に下記のように組んでみたのですが、いまいちうまく動きません。
まず構造体など。
replay構造体に、録画時に選択した難易度・機体などといった情報を記録します。
replay_key[REPLAY_MAX_TIME]に毎フレームのキー情報を記録します。REPLAY_MAX_TIMEは適当な値を入れておきます。
これをメインループで呼び、reply.cntをインクリメントして毎フレーム毎にreplay_key[replay.cnt]に録画・再生します。
replay.modeが0で録画、1で再生になります。
各ボタンを押すとそれぞれのビットを立てて、それを記録すればよいのではないかと考えました。
続いてファイルへの書き込み・読み込みです。
ゲーム開始前に難易度や機体種類などの情報をreplay構造体にそれぞれ入れておき、ゲーム(STG部分)終了時にreplay_save()とreplaykey_save()を呼び出して記録します。
(長すぎると怒られたので次に続きます)
龍神録を改造してリプレイを実装しようと思いました。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=22359&page=&lognum=70&id=dixq&rln=22441
などを参考に下記のように組んでみたのですが、いまいちうまく動きません。
まず構造体など。
replay構造体に、録画時に選択した難易度・機体などといった情報を記録します。
replay_key[REPLAY_MAX_TIME]に毎フレームのキー情報を記録します。REPLAY_MAX_TIMEは適当な値を入れておきます。
//リプレイに関する構造体 typedef struct{ int key; //キー保存用 int mode; //リプレイモード int cnt; //カウント int difficulty;//難易度 int life,bom_number;//初期ライフ、初期ボム数 int bomknd,charflag,mshotknd; //ボム種類、キャラ種類、メインショット種類 int seed; //乱数の種 }replay_t; GLOBAL replay_t replay;//リプレイ構造体 GLOBAL unsigned char replay_key[REPLAY_MAX_TIME]; //リプレイキー情報次にリプレイの録画・再生の関数です。
これをメインループで呼び、reply.cntをインクリメントして毎フレーム毎にreplay_key[replay.cnt]に録画・再生します。
replay.modeが0で録画、1で再生になります。
void replay_main(int mode){ switch(mode){ case 0://録画時 replay_key[replay.cnt] = 0; if(CheckStatePad(configpad.left)>0) replay_key[replay.cnt] |= 0X01; if(CheckStatePad(configpad.up)>0) replay_key[replay.cnt] |= 0X02; if(CheckStatePad(configpad.right)>0) replay_key[replay.cnt] |= 0X04; if(CheckStatePad(configpad.down)>0) replay_key[replay.cnt] |= 0X08; if(CheckStatePad(configpad.shot)>0) replay_key[replay.cnt] |= 0X10; if(CheckStatePad(configpad.bom)>0) replay_key[replay.cnt] |= 0X20; if(CheckStatePad(configpad.slow)>0) replay_key[replay.cnt] |= 0X40; break; case 1://再生時 replay.key=replay_key[replay.cnt]; break; default: break; } }ゲーム中に使うボタンは上下左右+ショット+ボム+低速(あとスタートボタン)だけですので、replay_key配列をunsigned char型にし、
各ボタンを押すとそれぞれのビットを立てて、それを記録すればよいのではないかと考えました。
続いてファイルへの書き込み・読み込みです。
char *g_replay = "../dat/replay/replay_data.dat"; // replay_data.dat(リプレイファイル) FILE *rp; void replay_load(){ if( ( rp = fopen( g_replay, "rb" ) ) == NULL ) { printf("ファイルオープンエラー\n"); } else{ //ファイルからデータを読み込む fread( &replay, sizeof(replay_t), 1, rp ) ; fclose( rp );//解放 } } void replay_save(){ if((rp = fopen( g_replay, "wb" )) == NULL){ printf("ファイルオープンエラー\n"); } else{ fwrite( &replay, sizeof(replay_t), 1, rp ); fclose( rp ); } } char *k_replay = "../dat/replay/replay.dat"; // replay.dat(リプレイキーファイル) FILE *kp; void replaykey_load(){ if( ( kp = fopen( k_replay, "rb" ) ) == NULL ) { printf("ファイルオープンエラー\n"); } else{ //ファイルからデータを読み込む fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp ) ; fclose( kp );//解放 } } void replaykey_save(){ if((kp = fopen( k_replay, "wb" )) == NULL){ printf("ファイルオープンエラー\n"); } else{ fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp ); fclose( kp ); } }この方法だとファイルが二つ必要になりますが、他にうまい方法を見つけられませんでした。
ゲーム開始前に難易度や機体種類などの情報をreplay構造体にそれぞれ入れておき、ゲーム(STG部分)終了時にreplay_save()とreplaykey_save()を呼び出して記録します。
(長すぎると怒られたので次に続きます)