Форум программистов, компьютерный форум CyberForum.ru

Сохранение-Загрузка игры - C++

Восстановить пароль Регистрация
 
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
07.02.2012, 13:31     Сохранение-Загрузка игры #1
Всем доброго времени суток, слёзно прошу помощи, не получается реализовать сохранение и загрузку игры.
Имеется класс CGame который инкапсулирует в себе ещё несколько классов, в общем мне нужно чтоб всё содержимое CGame записалось в файл, ну а потом при вызове метода загрузилось обратно.
Вот класс CGame
C++
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
31
32
33
34
35
36
37
38
39
40
41
42
class CGame
{
    shared_ptr<CDestroyer> destroyer;
    shared_ptr<CBomber> bomb;
    shared_ptr<CCreiser> creiser;
    shared_ptr<CKsenDest> ksen;
    std::vector <shared_ptr<CEnemy>>:: iterator iter;
    std::vector <shared_ptr<CEnemy>> lst;
    std::vector<shared_ptr<CBonuses>> bonus;
    shared_ptr<CBonuses> bon;
    std::vector<shared_ptr<CBonuses>>::iterator it;
    std::vector<shared_ptr<CItem>> ittem;
    shared_ptr<CItem> item;
    std::vector<shared_ptr<CItem>>::iterator itm;
    CPlayer player;
    int wave;
    int Gamelevel;
    int counter;
    bool correct;
        int g,j;
        BITMAP* bg;
        BITMAP* health;
        BITMAP* armor;
        BITMAP* exp;
        BITMAP * buffer;
        BITMAP * lv[3];
        BITMAP * station;
        bool done;
        char sprt[200];
public:
    CGame(void);
    void Init();
    void Update();
    void Save(char * filename);
    void Load(char * filename);
    void Menu();
    void Craft();
    void Draw();
    void ChangeLevel();
    void StartGame();
    ~CGame(void);
};
Вот так я написал методы для сохранения и загрузки, вроде сохраняет, а вот загружатся не хочет
C++
1
2
3
4
5
6
7
8
9
10
11
12
void CGame::Save(char * filename)
{
    ofstream save(filename,ios::binary);
    save.write((char *)this,sizeof(CGame));
    save.close();
}
void CGame::Load(char * filename)
{
    ifstream load(filename,ios::binary);
    load.read((char *)this,sizeof(CGame));
    load.close();
}
Подскажите истинный путь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
07.02.2012, 13:46     Сохранение-Загрузка игры #2
Цитата Сообщение от revaldo666 Посмотреть сообщение
save.write((char *)this,sizeof(CGame));
дословно читаю, как это видит компилятор
взять адрес из поля this и привести к типу адреса на символ
взять размер класса CGame
передать эти данные методу write объекта save класса ofstream

далее читаем про метод write

Write block of data

Writes the block of data pointed by s, with a size of n characters, into the output buffer. The characters are written sequentially until n have been written.

This is an unformatted output function and what is written is not necessarily a c-string, therefore any null-character found in the array s is copied to the destination and does not end the writing process.

Parameters
s
Pointer to a block data with the content to be written.
n
Integer value of type streamsize representing the size in characters of the block of data to write.

т.е. что сделает метод write возьмет sizeog(CGame) байт начиная с адреса this и скопирует их в файл
если допустить, что ваш компилятор хранит объект соответствующим образом (хотя я сомневаюсь что вы читали его документацию по этому поводу), то в файл попадут все адреса ваших BITMAP-ов
но я не думаю, что вы поняли в чем проблема
это видно из того, что у вас не объявлен конструктор копий

очень рекомендую прочесть про него, тогда часть вопросов отпадет сама собой

да, и хранить итераторы контейнера - очень плохо
если контейнер был изменен, то итератор может стать не валидным
(конечно, если вы знакомы с тонкостями всех контейнеров STL, то возможно вы знаете когда и какие итераторы становятся не валидными)
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
07.02.2012, 14:08  [ТС]     Сохранение-Загрузка игры #3
Контейнеры работают нормально.
Конструктор копирования написал,
BITMAP ы не записываю, всё равно не работает, можете на примере показать, как осуществить запись?
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
07.02.2012, 14:33     Сохранение-Загрузка игры #4
C++
1
2
3
4
int i = 5;
ofstream out(filename);
out << i;
out.close();
Yandex
Объявления
07.02.2012, 14:33     Сохранение-Загрузка игры
Ответ Создать тему
Опции темы

Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru