セーブデータの生成方法(構造体ポインターがあるやつ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Killery85

セーブデータの生成方法(構造体ポインターがあるやつ)

#1

投稿記事 by Killery85 » 8年前

構造体ポインターがあるセーブデータの構造体はどうすればいいんでしょうか?

また、一般に市販されているゲームはどのようなセーブデータ生成方法をとっているのでしょうか?

構造体ポインターがない方法はわかりました

コード:

#include <stdio.h>

typedef struct _SAVEDATA{
        char name[255];
        double HP;         
        double ATK;                      
}SAVEDATA;

int main(){
       procWrite();
       procRead();
}

void procWrite(){
        SAVEDATA Data = { "キリト", 100, 50};
        FILE *fp = fopen( "セーブデータ.dat", "wb" );
        if( fp == NULL ){
                return 0;
        }
        fwrite( &Data, sizeof(Data), 1, fp ); 
        fclose( fp );
        return 0;
}

void procRead(){
        SAVEDATA Data;
        FILE *fp = fopen( "セーブデータ.dat", "rb" );
        if( fp == NULL ){
                return 0;
        }
        fread( &Data, sizeof(Data), 1, fp );
        fclose( fp );

        printf("名前=%s\nHP=%g\nATK=%g\n",
                Data.name, Data.HP, Data.ATK);

        return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: セーブデータの生成方法(構造体ポインターがあるやつ)

#2

投稿記事 by みけCAT » 8年前

Killery85 さんが書きました:構造体ポインターがあるセーブデータの構造体はどうすればいいんでしょうか?
適当にシリアライズすればいいでしょう。
Killery85 さんが書きました:また、一般に市販されているゲームはどのようなセーブデータ生成方法をとっているのでしょうか?
何も考えずに書き込む、チェックサムを用いて改竄されにくくする、暗号化するなど、ゲームによって様々な方法があるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Killery85

Re: セーブデータの生成方法(構造体ポインターがあるやつ)

#3

投稿記事 by Killery85 » 8年前

みけCAT さんが書きました:
Killery85 さんが書きました:構造体ポインターがあるセーブデータの構造体はどうすればいいんでしょうか?
適当にシリアライズすればいいでしょう。
もうちょっと具体的にお願いできないでしょうか?
シリアライズとは、セーブデータをfprintfで、構造体のメンバーから間接的に徐々に書き出していく方法でしょうか?
それだと、自分の構造体は膨大な数なので途方に暮れてしまいそうなので困っています
例えば、構造体にリスト構造などを使っていますが、そういうのが羅列しています
下のが、構造体を丸ごとコピー出来ると知って、こいつは便利だと、
やってみたことです(後から知って実際は機能しませんあしからず)

コード:

typedef struct _SAVEDATADAT{
    
    NSString *name;
    
    NSImage *img;
    
    int MFselectedRow;
    int storyNumb;
    int scenarioNumb;
    
    NSString *mapfileName;
    NSString *levelName;
    NSString *scenarioName;
    
    struct _MAPSCRIPT *MS;
    
    struct _PLAYER P[10];
    struct _UNIT *UTop;
    struct _BUILD *BTop;
    
    int esSceneProc;
    
    bool endGameCondition;
    bool initMapFlag;
    bool TeamCountFlag;
    bool initStatusFlag;
    bool battleBegin;
    bool startES;
    
    bool cpuModeMOVEflag;
    bool cpuModeATTACKflag;
    
    bool cpuAImodeflag;
    bool cpuTurnEndFlag;
    bool waitSwtichFlag;
    bool battleReadyUpFlag;
    bool setBattleModeFlag;
    
    
    bool wtRdy;
    bool wtRdy2;
    bool wtRdy3;
    
    struct _UNIT *Uselected;
    struct _UNIT *unitBreak;
    struct _UNIT *Utarget;
    
    int chipNum[1002][1002];
    int buildNum[1002][1002];
    int unitNum[1002][1002];
    int loadNum[1002][1002];
    int buildTeam[1002][1002];
    int unitTeam[1002][1002];
    int posX;
    int posY;
    
    int chipHeight;
    int chipWidth;
    
    int eSlctX;
    int eSlctY;
    
    int registerNum;
    int registerNumB;
}SAVEDATADAT;
NSStringの時点でポインターですが、実はこれらはクラスで、
NSImageなにやらこの中にstructとなっているのが
この中にさらに構造体ポインタなどが入っています

これでいけたら最高の機能だったんですけど・・・
みけCAT さんが書きました:
Killery85 さんが書きました:また、一般に市販されているゲームはどのようなセーブデータ生成方法をとっているのでしょうか?
何も考えずに書き込む、チェックサムを用いて改竄されにくくする、暗号化するなど、ゲームによって様々な方法があるでしょう。
自分が言いたいのは、暗号化などのことではなく、
具体的な作成方法です、ググって載っている簡単な作成方法のもっとコアなやり方など
ポインターを使用した場合のセーブデータの作り方などです
ポインターを使用した場合のセーブした場合のセーブデータはググっても出ないので
質問させていただきました
特に構造体ポインターの一括でできるようなやり方があればと

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: セーブデータの生成方法(構造体ポインターがあるやつ)

#4

投稿記事 by YuO » 8年前

Killery85 さんが書きました:
みけCAT さんが書きました:
Killery85 さんが書きました:構造体ポインターがあるセーブデータの構造体はどうすればいいんでしょうか?
適当にシリアライズすればいいでしょう。
もうちょっと具体的にお願いできないでしょうか?
Objective-Cなら,NSCodingプロトコルを実装して,NSKeyedArchiverを使ってシリアライズ・デシリアライズするのが基本的な方法でしょうね。
ただ,オブジェクトをそのまま保存するのが効率よいとは限らず,自分でシリアライズ・デシリアライズコードを書くのも方法の一つかと思います。
Killery85 さんが書きました:シリアライズとは、セーブデータをfprintfで、構造体のメンバーから間接的に徐々に書き出していく方法でしょうか?
それだと、自分の構造体は膨大な数なので途方に暮れてしまいそうなので困っています
普通,シリアライズといった場合はバイナリデータかXMLやJSONといったデータ構造を利用するので,fprintfは使わないですね。
で,だいたいオブジェクトは自分のメンバー等をシリアライズするような処理を書くのが普通です。
メンバーが多いのは,通常はその構造体等が役割を持ちすぎていることを示しています。
複数の役割を持っているのであれば,その情報を分割する,といったことをすれば,個々のオブジェクトのシリアライズコードは少なくなります。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: セーブデータの生成方法(構造体ポインターがあるやつ)

#5

投稿記事 by naohiro19 » 8年前

letsboost::serialization
上記のサイトで公開されているBoost.Serializationを使えば、シリアライズが簡単できます。

閉鎖

“C言語何でも質問掲示板” へ戻る