{{notification.text}}

MirGames

02.11.09 23:34
0
Приветствую всех!!!
Начну здесь, т.к. DGLE2 майн и собственно может быть это относится к нему...
Поднимал тему про мап эдитор и прошу считать это продолжением.
P.S. вопросы могут быть чисто по с++

Итак начну...

Хотелось бы разобраться с загрузкой данных из файла. Есть тестовый мап файл со следующей структурой и реализацией:
Код

//MapFunc.h
#include <string>
using namespace std;
#include <DGLE2.h>
using namespace DGLE2;

extern IFileSystem *pHDDFileSystem;
extern IFile *pMyFile;
extern IResourceManager    *pResMan;
#define RESOURCE_PATH    "..\\..\\..\\..\\Shared resources\\"

struct MAPFILEHEADER {
    const char *        Ver;
    //int                    NumOfAllElements;
};
struct DATASTRUCT {
    const char *    Name;
    const char *    Path;
    int                     NumOfElements;
};
struct ELEMENTSTRUCT {
    int        ID;
    int        PosX;
    int        PosY;
    int        Angle;
};

bool SaveTestMap(const char* name);
bool ReadTestMap(const char* name);

И реализация...
Код

//MapFunc.cpp
#include "MapFunc.h"

MAPFILEHEADER    MFH,MFH2;
DATASTRUCT        DS,DS2;
ELEMENTSTRUCT    ES,ES2;

bool SaveTestMap(const char* name) {
    MFH2.Ver="FMF 1.0";
    MFH2.NumOfAllElements=1;
    DS2.Name="grass";
    DS2.Path="Ducks\\Grass4.png";
    //DS2.NumOfElements=1;
    ES2.ID            =1;
    ES2.PosX        =100;
    ES2.PosY        =100;
    ES2.Angle        =45;
    pHDDFileSystem->OpenFile(name, (FS_OPEN_FLAGS)(FS_WRITE | FS_TRUNK), pMyFile);
    unsigned int write[4];
    pMyFile->Write(&MFH2,sizeof(MAPFILEHEADER),write[0]);
    pMyFile->Write(&DS2,sizeof(DATASTRUCT),write[1]);
    pMyFile->Write(&ES2,sizeof(ELEMENTSTRUCT),write[2]);
    return true;
};
bool ReadTestMap(const char* name) {
    pHDDFileSystem->OpenFile(name, (FS_OPEN_FLAGS)(FS_READ), pMyFile);
    unsigned int read[3];
    pMyFile->Read(&MFH,sizeof(MAPFILEHEADER),read[0]);
        if (MFH.Ver!="FMF 1.0") return false;
        pMyFile->Read(&DS,sizeof(DATASTRUCT),read[1]);
        const int& NumTex=DS.NumOfElements;
        ITexture *pTex[NumTex] = NULL;                  //Массив только константа при компиляции?
        for (int i=0;i<NumTex;i++) {
            pResMan->LoadTexture(RESOURCE_PATH/*(DS.Path)*/,pTex[NumTex],TEX_LD_DEFAULT_2D);             //Тут тоже непонятно что с PATH к файлу...
            //Здесь ID и координаты объекта
            //pMyFile->Read(&ES,sizeof(ELEMENTSTRUCT),read[2]);
        };
    return true;
};

Соответственно это не компилится и возникают многочисленные вопросы. Например как в строчке
Код
ITexture *pTex[NumTex] = NULL;

Задать нужное количество ITexture....???
Определить путь в LoadTexture(RESOURCE_PATH/*(DS.Path)* ...???

...Или может это как-то сделать по другому? Нужна помощь...

Может это не правильный путь, поправте меня... Возникает вопрос как потом это все отрисовывать, т.е. мало прочитать карту, еще надо это все как-то хранить для ортисовки...
Отредактировано: 02.11.09 23:37
#1
02.11.09 23:57
0
FOXGLove
Завести динамический массив ITexture **pTex;
Сосчитать кол-во текстур в папке и занести это кол-во в переменную TexturesCount.
Выделить память pTex = new ITexture*[TexturesCount];
Дальше уже считывать.
#2
03.11.09 00:19
0
visual
Про динамический массив я завтра обязательно прочитаю...
Сосчитать кол-во текстур в папке и занести это кол-во в переменную TexturesCount. - с этим думаю проблем не будет...
Выделить память pTex = new ITexture*[TexturesCount]; - Тут пожалуйста поподробнее...

Как примерно все то что выше будет реализовано, если не трудно...
#3
03.11.09 00:41
0
FOXGLove
Цитата
Выделить память pTex = new ITexture*[TexturesCount]; - Тут пожалуйста поподробнее...

В книжках про дин. массивы лучше написано, чем я могу описать. В крайнем случае просто скопируй эту строку.

После того, как ты выделил память, работа с дин. массивом не отличается от работы с обычным. Обращаться так же: pTex[i]

Ну, и раз уж ты их пока что не освоил, вот правило: любой дин. массив, когда он уже не нужен, должен быть освобожден
delete[] pTex;
Отредактировано: 03.11.09 00:41
#4
03.11.09 15:38
0
visual Спасибо тебе большое. Разобрался с динамичесскими массивами.
Еще вот такое сообщение выходит при завершении приложения...

Это как-то связано с работой с файлом, а как этот баг устранить? Может кто знает...
#5
03.11.09 19:28
0
FOXGLove
Там же сказано в какой строке произошла ошибка.
#6
04.11.09 18:28
0
Папки dd на диске f вообще нет:)
И диска такого тоже...
Отредактировано: 04.11.09 18:28
#7
04.11.09 18:57
0
FOXGLove
Ну, значит это внутри DGLE2. Сурсы открыты - можешь посмотреть что там внутри и попробовать понять как исправить свой код, чтобы движок не падал.
#8
04.11.09 20:12
0
Он пишет, в каком файле исходного кода произошла ошибка и пишет полное имя на той машине, на которой компилилось.
#9
04.11.09 20:47
0
Может это от DRONа осталось? Проект я добавил в DGLE2 солюшен. Поиском на всех жестких дисках не нашел файла dbgdel.cpp
#10
04.11.09 21:20
0
Причем если закомментировать функцию загрузки карты, то такая бяка не вылазит... Может в коде где косяк?
Код
bool ReadTestMap(const char* name) {
    pHDDFileSystem->OpenFile(name, (FS_OPEN_FLAGS)(FS_READ), pMyFile);
    unsigned int read;
    pMyFile->Read(&MFH,sizeof(MAPFILEHEADER),read);
        if (MFH.Ver[0]!='F' || MFH.Ver[1]!='M' || MFH.Ver[2]!='F' || MFH.Ver[3]!=' ' ||
            MFH.Ver[4]!='1' || MFH.Ver[5]!='.' || MFH.Ver[6]!='0') return false;
        DatStr=new DATASTRUCT*[MFH.NumOfAllElements];
        EleStr=new ELEMENTSTRUCT*[MFH.NumOfAllElements];
        pTextures=new ITexture*[MFH.NumOfAllElements];
        for (unsigned int i=0;i<MFH.NumOfAllElements;i++) {
            pMyFile->Read(&DS,sizeof(DATASTRUCT),read);
            DatStr[i]=&DS;
            pResMan->LoadTexture((PATH+DS.Path).c_str(),pTextures[i],TEX_LD_DEFAULT_2D);
            EleStr[i]= new ELEMENTSTRUCT[DS.NumOfElements];
            for (unsigned int j=0;j<DS.NumOfElements;j++) {
                pMyFile->Read(&ES,sizeof(ELEMENTSTRUCT),read);
                EleStr[i][j]=ES;
            }
        }
    return true;
}
#11
04.11.09 23:06
0
Попробуй потрейсить. А указанный файл вполне может существовать на компе где-то в недрах майкрософта - похоже что это потроха CRT.
P.S. А разве DGLE2 позволяет напрямую обратиться к HDDFileSystem?
#12
05.11.09 00:49
0
Как это потрейсить?:)
Код
IMainFileSystem        *pFileSystem        = NULL;

Код
Init() { ...
pFileSystem->GetVirtualFileSystem(MFS_HDD_FS, pHDDFileSystem);
...
#13
05.11.09 02:43
0
F7 и F8 в дебаггере ) Ну или какие там в студии хоткеи для Step Over и Step Into.
#15
05.11.09 12:43
0
Нашел вот такое... Хз откуда это и вообще что искать то? :(
Код

--- f:\dd\vctools\crt_bld\self_x86\crt\src\newaop.cpp --------------------------
00405A20  mov         edi,edi
00405A22  push        ebp  
00405A23  mov         ebp,esp
00405A25  mov         eax,dword ptr [count]
00405A28  push        eax  
00405A29  call        operator new (405A88h)
00405A2E  add         esp,4
00405A31  pop         ebp  
00405A32  ret              
--- Нет исходного файла --------------------------------------------------------

Код
0040361F  int         3    
--- f:\dd\vctools\crt_bld\self_x86\crt\src\ti_inst.cpp -------------------------
00403620  mov         edi,edi
00403622  push        ebp  
00403623  mov         ebp,esp
00403625  push        ecx  
00403626  mov         dword ptr [ebp-4],ecx
00403629  mov         eax,dword ptr [this]
0040362C  mov         esp,ebp
0040362E  pop         ebp  
0040362F  ret         4    
--- Нет исходного файла --------------------------------------------------------
std::exception::what:

И такой лабуды полно... Что делать?
#16
05.11.09 23:40
0
Nobody knows...
Помогите хоть с рендером в Form.
#17
10.11.09 00:33
0
Блин... уже свой класс для файлов сделал. fwrite все нормально, а если использовать fread то вылетает при завершении приложения. Что за фигня? Записывает и считывает байт в байт. уже не знаю куда "думать". Руки опустились...
#18
Программир Всия Руси!
10.11.09 11:00
0
FOXGLove
Плохо стараешься, давай разбирайся :)
#19
10.11.09 17:15
0
FOXGLove
Забавные баги. Ты поди при чтении (или еще где) память портишь где-нить, глюки на ровном месте характерны как раз для этого.
#20
10.11.09 19:56
0
Это именно при чтении из файла такой глюк.
Читаю блоками
Код
struct MAPFILEHEADER {
    const char*        Ver;
    unsigned int        NumOfAllElements;
};
struct DATASTRUCT {
    string                Name;
    string                Path;
    unsigned short        NumOfElements;
    unsigned char        Alpha;
};
struct ELEMENTSTRUCT {
    unsigned short        ID;
    unsigned short        PosX;
    unsigned short        PosY;
    unsigned short        Angle;
};[

Функция чтения такая...
Код
void ReadTestFFMap(const char* name) {
    unsigned int read;
    FFile tf;
    tf.Open(name, FF_READ);
    tf.Read(&MFH, sizeof(MAPFILEHEADER), read);
            if (MFH.Ver[0]!='F' || MFH.Ver[1]!='M' || MFH.Ver[2]!='F' || MFH.Ver[3]!=' ' ||
            MFH.Ver[4]!='1' || MFH.Ver[5]!='.' || MFH.Ver[6]!='0') return;
        DatStr=new DATASTRUCT*[MFH.NumOfAllElements];
        EleStr=new ELEMENTSTRUCT*[MFH.NumOfAllElements];
        pTextures=new ITexture*[MFH.NumOfAllElements];
        for (unsigned int i=0;i<MFH.NumOfAllElements;i++) {
            tf.Read(&DS, sizeof(DATASTRUCT), read);
            DatStr[i]=&DS;
            pResMan->LoadTexture((PATH+DS.Path).c_str(),pTextures[i],TEX_LD_DEFAULT_2D);
            EleStr[i]= new ELEMENTSTRUCT[DS.NumOfElements];
            for (unsigned int j=0;j<DS.NumOfElements;j++) {
                tf.Read(&ES, sizeof(ELEMENTSTRUCT), read);
                EleStr[i][j]=ES;
            }
        }
    tf.Close();
}

Ну и сам класс...
Код
#pragma region Class FFile
    FFile::FFile() {
        opened=false;
        _file=NULL;
    }
    FFile::~FFile() {
        if (_file) fclose(_file);
    }
    bool FFile::Open(const char* filename, unsigned int mode) {
        if (opened) return false;
        _filename=filename;
        _mode=mode;
        char* cmode;
        switch (mode)
        {
            case FF_CREATE:
                cmode="wb";
                _write=true;
                break;
            case FF_APPEND:
                cmode="ab";
                _write=true;
                break;
            case FF_READ:
                cmode="rb";
                _write=false;
                break;
        }
        if (_file = fopen(_filename, cmode)) opened=true;
        return opened;
    }
    int FFile::GetMode() {return _mode;}
    void FFile::Write(void *data, unsigned int datasize) {
        if (opened && _write) fwrite(data, 1, datasize, _file);
    }
    void FFile::Write(void *data, unsigned int datasize, unsigned int& writed) {
        if (opened && _write) writed=fwrite(data, 1, datasize, _file);
    }
    void FFile::Read (void *data, unsigned int datasize) {
        if (opened && !_write) fread(data, 1, datasize, _file);
    }
    void FFile::Read (void *data, unsigned int datasize, unsigned int& readed) {
        if (opened && !_write) readed=fread(data, 1, datasize, _file);
    }
    void FFile::Offset(unsigned int offset) {
        if (opened && !_write) fseek(_file, offset, SEEK_SET);
    }
    void FFile::Close() {
        if (opened) {
            fclose(_file);
            _file=NULL;
            opened=false;
        }
    }
#pragma endregion

Где тут можно память испортить? :(
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}