Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytywanie mapy do RPG z pliku .txt

Ostatnio zmodyfikowano 2014-12-02 17:39
Autor Wiadomość
Brunon3
Temat założony przez niniejszego użytkownika
Wczytywanie mapy do RPG z pliku .txt
» 2014-12-02 14:11:31
Mam kod:

C/C++
#include "main.h"
#include "drzewo1.h"
#include <allegro.h>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

int gx = 400;
int gy = 300;
int gr = 1;
BITMAP * gracz1;
BITMAP * gracz2;
BITMAP * gracz3;
BITMAP * gracz4;
BITMAP * gracz5;
BITMAP * dg1;
BITMAP * bufor = NULL;
Drzewo1 d1;

int * drzewaX;
int * drzewaY;
int d = 0;

void GraphLoad() {
    gracz1 = load_bmp( "Grafika/Gra/Gracz/stanie.bmp", default_palette );
    gracz2 = load_bmp( "Grafika/Gra/Gracz/wGore.bmp", default_palette );
    gracz3 = load_bmp( "Grafika/Gra/Gracz/wDol.bmp", default_palette );
    gracz4 = load_bmp( "Grafika/Gra/Gracz/wPrawo.bmp", default_palette );
    gracz5 = load_bmp( "Grafika/Gra/Gracz/wLewo.bmp", default_palette );
    dg1 = load_bmp( "Grafika/Gra/Obiekty/Natura/Drzewa/drzewo1.bmp", default_palette );
    bufor = create_bitmap( 800, 600 );
}

void mapDownload() {
    string map;
    string * linia;
    int numerLinii;
    int i = 0;
    int c = 0;
    int l = 0;
    fstream mapData;
    mapData.open( "DATA/save/map.txt", ios::in );
    while( getline( mapData, linia[ c ] ) ) {
        for( i = 0; i <= linia[ c ].length(); i++ ) {
            if( linia[ c ][ i ] = 'D' ) {
                for( l = 0; l <= linia[ c ][ i ]; l++ ) {
                    drzewaX[ d ] = l;
                    drzewaY[ c ] = c;
                }
                d++;
            }
        }
        c++;
    }
}

void Draw() {
    if( gr == 1 ) {
        draw_sprite( bufor, gracz1, gx - 75, gy - 75 );
    }
    if( gr == 2 ) {
        draw_sprite( bufor, gracz2, gx - 75, gy - 75 );
    }
    if( gr == 3 ) {
        draw_sprite( bufor, gracz3, gx - 75, gy - 75 );
    }
    if( gr == 4 ) {
        draw_sprite( bufor, gracz4, gx - 75, gy - 75 );
    }
    if( gr == 5 ) {
        draw_sprite( bufor, gracz5, gx - 75, gy - 75 );
    }
    //Drzewa
    int lp;
    for( lp = 0; lp <= d; lp++ ) {
        if( drzewaX[ lp ] > - 293 && drzewaX[ lp ] < 800 && drzewaY[ lp ] > - 400 && drzewaY[ lp ] < 600 ) {
            draw_sprite( bufor, dg1, drzewaX[ lp ], drzewaY[ lp ] );
        }
    }
}
void logic() {
    if( !key[ KEY_RIGHT ] && !key[ KEY_LEFT ] && !key[ KEY_UP ] && !key[ KEY_DOWN ] ) {
        gr = 1;
    }
    if( key[ KEY_RIGHT ] ) {
        gr = 4;
        d1.x--;
    }
    if( key[ KEY_LEFT ] ) {
        gr = 5;
        d1.x++;
    }
    if( key[ KEY_UP ] ) {
        gr = 2;
        d1.y++;
    }
    if( key[ KEY_DOWN ] ) {
        gr = 3;
        d1.y--;
    }
}

int walowo() {
    GraphLoad();
    mapDownload();
   
    while( !key[ KEY_ESC ] ) {
        clear_to_color( bufor, makecol( 0, 255, 100 ) );
       
        logic();
        //Draw();
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
    return 0;
}
END_OF_FUNCTION( walowo );

i od razu na wstępie piszę, że dosć długo analizowałem już ten kod, że próbowałem go poprawiać i zmieniać na co tylko przychodziło mi do głowy, że szukałem również w Google i nic.
A problem polega na tym:
Gdy uruchamiam program (main.cpp) wszystko działa, ale gdy za pomocą wyboru "Start gry" przejdę do "walowo.cpp" to program się sypie i wyskakuje mi okienko dialogowe mówiące:
"Debug Error!
Run-Time Check Failure #3 - The variable 'linia' is being used without being initialized.
(Press Retry to debug the application)".
Pomóżcie! Może ktos z Was widzi tam cos czego ja nie widzę. :(

PS. Wspomnę również, że albo ja robię cos źle, albo Debbuger w Visualu nie działa pod allegro. Dlatego go nie użyłem.
[/i]
P-121928
maly
» 2014-12-02 14:46:46
Może ktos z Was widzi tam cos czego ja nie widzę. :(
Ja widzę to.
The variable 'linia' is being used without being initialized.
P-121931
Brunon3
Temat założony przez niniejszego użytkownika
» 2014-12-02 14:57:57
@up:
Ja też to widzę, ale za to nie wiem co mam z tym zrobić. :/
"Zmienna 'linia' jest używany inicjowany."
???

Pomóżcie, ja już nic więcej tam nie zobaczę, ale to nie znaczy, że nie będę nadal analizować tego kodu.
Chcę jednak, żeby jeszcze ktos oprócz mnie przeanalizował ten kod i podał mi wynik swojej analizy.
P-121933
dek12
» 2014-12-02 15:13:13
jak już używasz translatora to chociaż dobrego użyj.
używasz zmiennej linia bez uprzedniego zainicjowania. tzn, że zadeklarowałeś zmienną, ale nie przypisałeś jej żadnej wartosći
P-121935
kubawal
» 2014-12-02 16:28:06
Konkretnie to tworzysz wskaźnik na nieistniejący obszar pamięci - powinieneś zaalokować tablicę dynamicznie.
Na mój rozum to chyba chciałeś utworzyć zmienną tekstową, ale pomyliło ci się z char* i dałeś string*. Stringów tak sie nie tworzy.
A alokujesz wogóle pamięć dla mapy? (drzewaX i drzewaY)

Chyba, że chciałeś utworzyć tablice stringów, to wtedy użyj lepiej std::vector<string> lines.
Będzie łatwiej, szybciej i bardziej elagancko.

Wogóle z tego co zerknąłem no ten kod jakiś dziwny sposób masz na przechowywanie danych mapy i ich odczytywanie.
Moze lepiej przeczytaj conieco na ten temat:
Frazy, które należy wpisać w wyszukiwarkę google:

I opisz format pliku z mapą. Możemy pomóc zoptymalizować ten algorytm, bo widzę, że dosyć nietypowo go napisałeś :)
P-121942
Brunon3
Temat założony przez niniejszego użytkownika
» 2014-12-02 17:18:48
Aktualny stan kodu:


C/C++
#include "main.h"
#include "drzewo1.h"
#include <allegro.h>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>

using namespace std;

int gx = 400;
int gy = 300;
int gr = 1;
BITMAP * gracz1;
BITMAP * gracz2;
BITMAP * gracz3;
BITMAP * gracz4;
BITMAP * gracz5;
BITMAP * dg1;
BITMAP * bufor = NULL;
Drzewo1 d1;

int drzewaX[ 10 ];
int drzewaY[ 10 ];
int d = 0;

void GraphLoad() {
    gracz1 = load_bmp( "Grafika/Gra/Gracz/stanie.bmp", default_palette );
    gracz2 = load_bmp( "Grafika/Gra/Gracz/wGore.bmp", default_palette );
    gracz3 = load_bmp( "Grafika/Gra/Gracz/wDol.bmp", default_palette );
    gracz4 = load_bmp( "Grafika/Gra/Gracz/wPrawo.bmp", default_palette );
    gracz5 = load_bmp( "Grafika/Gra/Gracz/wLewo.bmp", default_palette );
    dg1 = load_bmp( "Grafika/Gra/Obiekty/Natura/Drzewa/drzewo1.bmp", default_palette );
    bufor = create_bitmap( 800, 600 );
}

void mapDownload() {
    string map;
    std::vector < string > linia;
    int numerLinii;
    int i = 0;
    int c = 0;
    int l = 0;
    fstream mapData;
    mapData.open( "DATA/save/map.txt", ios::in );
    while( getline( mapData, linia[ c ] ) ) {
        for( i = 0; i <= linia[ c ].length(); i++ ) {
            if( linia[ c ][ i ] = 'D' ) {
                for( l = 0; l <= linia[ c ][ i ]; l++ ) {
                    drzewaX[ d ] = l;
                    drzewaY[ c ] = c;
                }
                d++;
            }
        }
        c++;
    }
}

void Draw() {
    if( gr == 1 ) {
        draw_sprite( bufor, gracz1, gx - 75, gy - 75 );
    }
    if( gr == 2 ) {
        draw_sprite( bufor, gracz2, gx - 75, gy - 75 );
    }
    if( gr == 3 ) {
        draw_sprite( bufor, gracz3, gx - 75, gy - 75 );
    }
    if( gr == 4 ) {
        draw_sprite( bufor, gracz4, gx - 75, gy - 75 );
    }
    if( gr == 5 ) {
        draw_sprite( bufor, gracz5, gx - 75, gy - 75 );
    }
    //Drzewa
    int lp;
    for( lp = 0; lp <= d; lp++ ) {
        if( drzewaX[ lp ] > - 293 && drzewaX[ lp ] < 800 && drzewaY[ lp ] > - 400 && drzewaY[ lp ] < 600 ) {
            draw_sprite( bufor, dg1, drzewaX[ lp ], drzewaY[ lp ] );
        }
    }
}
void logic() {
    if( !key[ KEY_RIGHT ] && !key[ KEY_LEFT ] && !key[ KEY_UP ] && !key[ KEY_DOWN ] ) {
        gr = 1;
    }
    if( key[ KEY_RIGHT ] ) {
        gr = 4;
        d1.x--;
    }
    if( key[ KEY_LEFT ] ) {
        gr = 5;
        d1.x++;
    }
    if( key[ KEY_UP ] ) {
        gr = 2;
        d1.y++;
    }
    if( key[ KEY_DOWN ] ) {
        gr = 3;
        d1.y--;
    }
}

int walowo() {
    GraphLoad();
    mapDownload();
   
    while( !key[ KEY_ESC ] ) {
        clear_to_color( bufor, makecol( 0, 255, 100 ) );
       
        logic();
        //Draw();
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
    return 0;
}
END_OF_FUNCTION( walowo );

Plik z mapą (map.txt) w stanie testowym:


EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

E - Empty - nie wyswietlaj nic
D - Drzewo - pozycja lewego górnego rogu sprita drzewo

Wiem, że jest nie typowo, bo chciałem (i chcę) wynalesć ten sposób jeszcze raz, w nieco innej formie. ;)
P-121956
kubawal
» 2014-12-02 17:25:13
Nie ma sensu odkrywać kwadratowego koła, skoro okrągłe i tak bedzie toczyło sie lepiej.
Użyj zwykłej tablicy kafelków:
C/C++
const int mapSizeX = 20;
const int mapSizeY = 10;

enum Tile
{
    Drzewo,
    Empty,
};

Tile map[ sizeX ][ sizeY ];
// lub jak ci wygodniej
Tile map[ sizeX * sizeY ];

// lub nawet
struct Tile
{
    enum Kind
    {
        Drzewo,
        Empty,
    } kind;
   
    BITMAP * bmp;
    int posX, posY;
    // inne dane
};

P-121959
Brunon3
Temat założony przez niniejszego użytkownika
» 2014-12-02 17:38:03
@up:
Niezbyt rozumiem jak mam zastosować powyższy kod u siebie w kodzie.
Co mam wyrzucić, i gdzie to wpisać?
P-121962
« 1 » 2
  Strona 1 z 2 Następna strona