Brunon3 Temat założony przez niniejszego użytkownika |
Wczytywanie mapy do RPG z pliku .txt » 2014-12-02 14:11:31 Mam kod: #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 ); } 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(); 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] |
|
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. |
|
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.
|
|
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 |
|
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: I opisz format pliku z mapą. Możemy pomóc zoptymalizować ten algorytm, bo widzę, że dosyć nietypowo go napisałeś :) |
|
Brunon3 Temat założony przez niniejszego użytkownika |
» 2014-12-02 17:18:48 Aktualny stan kodu: #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 ); } 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(); 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. ;) |
|
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: const int mapSizeX = 20; const int mapSizeY = 10;
enum Tile { Drzewo, Empty, };
Tile map[ sizeX ][ sizeY ];
Tile map[ sizeX * sizeY ];
struct Tile { enum Kind { Drzewo, Empty, } kind; BITMAP * bmp; int posX, posY; };
|
|
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ć?
|
|
« 1 » 2 |