Avatar billede bjering Nybegynder
23. juni 2006 - 20:08 Der er 2 kommentarer og
1 løsning

Problem med pak system.

Hejsa eksperter.

puha, den bliver lang den her :)

Jeg har den her pak system som jeg har modificeret fra en fundet på gamedev.

Nu vil jeg så gerne loade en fil fra pak systemet ind i memory til at bruge som directx texture.

jeg har lavet så den loader data ud, og også så den skriver det rigtig til fil (inde i selve pak systemed), MEN, når jeg får data tilbage til min class, viser den at størrelsen er 4 byte hele tiden, uanset hvad.

men ok, først, her er pak (hente enkelt fil fra pak til hukommelsen)

char * CPakFile::ReadSingleFileByte( char* Filename )
{
    // Declare local variables
    FILE*            ReadStream;                // A read data stream
    fpos_t            Pos = 0;                // Offset in to file
    char            Buffer = 0;                // A read buffer

    // Error check the method parameters and PAK file acquired from LoadPAKHFT()
    if( strlen(m_szPakName) == 0 ){ return FALSE; }
    if( strlen(Filename) == 0 ){ return FALSE; }

    // Declare a temporary file table node to work from
    sFileTableEntry* Current = new sFileTableEntry();

    // Make it the top of the file table
    Current = m_FileTable;

    // Iterate through Current until it is the entry specified in the method parameters
    while( strcmp(Current->szFileName, Filename) != 0 )
    {
        // If we reach the dummy table entry we have to leave unsuccessfully
        if( Current->Next == NULL ){ return FALSE; }

        // Advance Current to the next entry
        Current = Current->Next;
    }
   
    // Open PAK file stream (to read from)
    ReadStream = fopen( m_szPakName, "rb" );
    if( !ReadStream )
        return FALSE;

    // Set the offset in PAK to the beginning of this particular file
    // to be extracted
    Pos = Current->dwOffset;
    fsetpos( ReadStream, &Pos );

    int size = (int)Current->dwFileSize;
    char * fBuffer = new char[size];            // A read buffer
    char* buf_ptr= fBuffer;

    // Loop through the file by it's size and read from the PAK
    // followed by write to file
    for( DWORD Count = 0; Count < Current->dwFileSize; Count++ )
    {
        // Read in the char
        Buffer = fgetc(ReadStream);

        // Perform decryption using the caesar cypher (reversed to decrypt)
        if( m_Header.bCypherAddition == TRUE )
            Buffer -= m_Header.iCypherValue;
        else
            Buffer += m_Header.iCypherValue;

        // Write to the buffer
       
        memcpy(buf_ptr, (char*)&Buffer, 1);
        buf_ptr+=1;
    }

    // Close the file streams
    fclose(ReadStream);
    return fBuffer;
}

hvis jeg skriver indholdet ud lige før fclose, så er filen komplet og virker fint.

MEN, hvis jeg returner den, så får jeg 4 byte.

og det gør jeg her f.eks

int LoadingScreen::InitTexture()
{
    pD3DDevice->SetRenderState(D3DRS_ZENABLE,  TRUE ); // Enable Z-Buffer (Depth Buffer)
    pD3DDevice->SetRenderState(D3DRS_CULLMODE, FALSE); // Disable Backface Culling
    pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); // Disable Light

    unsigned char *pVertices;
    pD3DDevice->CreateVertexBuffer(4*sizeof(tVertex), 0, D3DFVF_CUSTOMVERTEX,
                                    D3DPOOL_MANAGED, &pVertexBuffer, NULL );
    pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);
    memcpy(pVertices, quad, sizeof(quad) );
    pVertexBuffer->Unlock();

    char * data;

    if ( pak.LoadPAKHFT( "Data/System.mpk" ) )
    {
        data = pak.ReadSingleFileByte("Loading1.jpg");
        if ( data == NULL )
        {
            MessageBox( NULL, "Error Loading Resources", "Error", MB_OK | MB_ICONINFORMATION );
            exit(1);
        }

        int size = sizeof(data);

        ofstream test("test.txt", ios::out | ios::binary);
        test << size;

    }
    else
    {
        MessageBox( NULL, "Error Loading Resource File", "Error", MB_OK | MB_ICONINFORMATION );
        exit(1);
    }

ectect...

anyways, med

int size = sizeof(data);
ofstream test("test.txt", ios::out | ios::binary);

siger den i min txt fil, 4 byte
også hvis jeg prøver strlen(data); det er det samme

nogen ide til hvad der går galt ? hvordan jeg fikser det ?
Avatar billede tokelil Nybegynder
24. juni 2006 - 02:17 #1
sizeof(data) returnere 4 da det er størrelsen på char* (under 32bit OS). strlen returnere længden af strengen indtil den finder et 0, så det vil sandsynligvis afhænge af hvilken fil du loader. Du skal dog være heldig hvis du får returneret den rigtige længde.

Anyway, du bliver nødt til at returnere 2 værdier. En buffer pointer og størrelsen på bufferen. F.eks.
    char* data;
    int datasize;

    if ( pak.LoadPAKHFT( "Data/System.mpk" ) )
    {
        datasize = pak.ReadSingleFileByte("Loading1.jpg", data);
        if ( datasiza <= 0 )
        {
            MessageBox( NULL, "Error Loading Resources", "Error", MB_OK | MB_ICONINFORMATION );
            exit(1);
        }

        ofstream test("test.txt", ios::out | ios::binary);
        test << datasize;

    }

og så skrive din ReadSingleFileByte om så den modtager data pointeren og returnere Current->dwFileSize; (Som jo er den størrelse du vil have fat i)
Avatar billede bjering Nybegynder
24. juni 2006 - 11:07 #2
Mange tak, skriv et svar :)

btw, ændrede det til int CPakFile::ReadSingleFileByte( char* Filename )

så returnede size efter at have smidt data i en temp buffer, og så henter jeg bufferen ind fra CPakFile til min LoadingScreen og så ind i bufferen, virker fint :)
Avatar billede tokelil Nybegynder
24. juni 2006 - 11:44 #3
God fornøjelse :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester