龍神録を改造してリプレイを実装しようと思いました。
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()を呼び出して記録します。
(長すぎると怒られたので次に続きます)