Problem z poruszaniem się po mapie w grze konsolowej [c++]
Ostatnio zmodyfikowano 2019-06-28 13:28
maciora Temat założony przez niniejszego użytkownika |
Problem z poruszaniem się po mapie w grze konsolowej [c++] » 2019-06-28 13:28:32 Dzień dobry, W mojej "grze" chciałbym aby podczas poruszania sie postacią po mapie i zbliżeniu sie do krawędzi wyświetlanego fragmentu mapy (mapa planowo ma mieć rozmiar 1000x1000, wyświetlany fragment to ~ 45x20) przesuwała się ona tak, aby postać była cały czas widoczna (coś jak w Don't Starve). Niestety nie mam pojęcia jak się za to zabrać. Poniżej przedstawiam klase Display która wyświetla obiekt mapa[][] wokół gracza : void wyswietlWyswietlacz( int xGracza, int yGracza, short godz, char mapa[][ 100 ] ) { for( int y = 0; y < displayHeight; y++ ) { for( int x = 0; x < displayWidth; x++ ) { if( x == 0 || y == 0 || y == displayHeight - 1 || x == displayWidth - 1 ) cout << wyswietlacz[ x ][ y ]; else if( x == xGracza && y == yGracza ) cout << '@'; else { int poludnie = 7; int wieczor = 5; int noc = 3; int rano = 4; if( godz > 7 && godz < 20 ) { if((( x > xGracza - poludnie && x < xGracza + poludnie ) &&( y > yGracza - poludnie + 2 && y < yGracza + poludnie - 2 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz < 24 && godz > 20 ) { if((( x > xGracza - wieczor && x < xGracza + wieczor ) &&( y > yGracza - wieczor - 1 && y < yGracza + wieczor - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz < 5 ) { if((( x > xGracza - noc && x < xGracza + noc ) &&( y > yGracza - noc - 1 && y < yGracza + noc - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz > 5 && godz < 7 ) { if((( x > xGracza - rano && x < xGracza + rano ) &&( y > yGracza - rano - 1 && y < yGracza + rano - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } } } cout << endl; } } }; Oraz klase Gracz w której również można (jak się domyślam) rozwiązać ten problem : class Gracz { public: int xGracza = 10; int yGracza = 10; void poruszanieGracza( bool & r ) { char z = _getch(); switch( z ) { case 'w': yGracza -= 1; break; case 's': yGracza += 1; break; case 'a': xGracza -= 1; break; case 'd': xGracza += 1; break; } r = 1; } };
Wstawiam również kopie całego kodu : #include <iostream> #include <string> #include <ctime> #include <windows.h> #include <conio.h> #include <string> #include <cmath> using namespace std;
class Mapa { const static int mapY = 100; const static int mapX = 100; public: char mapa[ mapX ][ mapY ]; Mapa() { for( int y = 0; y < mapY; y++ ) { for( int x = 0; x < mapX; x++ ) { mapa[ x ][ y ] = char( 250 ); } } } };
class Display { const static int displayWidth = 45; const static int displayHeight = 20; public: char wyswietlacz[ displayWidth ][ displayHeight ]; Display() { for( int y = 0; y < displayHeight; y++ ) { for( int x = 0; x < displayWidth; x++ ) { if( x == 0 || y == 0 || y == displayHeight || x == displayWidth ) wyswietlacz[ x ][ y ] = char( 254 ); else wyswietlacz[ x ][ y ] = ' '; } } } void wyswietlWyswietlacz( int xGracza, int yGracza, short godz, char mapa[][ 100 ] ) { for( int y = 0; y < displayHeight; y++ ) { for( int x = 0; x < displayWidth; x++ ) { if( x == 0 || y == 0 || y == displayHeight - 1 || x == displayWidth - 1 ) cout << wyswietlacz[ x ][ y ]; else if( x == xGracza && y == yGracza ) cout << '@'; else { int poludnie = 7; int wieczor = 5; int noc = 3; int rano = 4; if( godz > 7 && godz < 20 ) { if((( x > xGracza - poludnie && x < xGracza + poludnie ) &&( y > yGracza - poludnie + 2 && y < yGracza + poludnie - 2 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz < 24 && godz > 20 ) { if((( x > xGracza - wieczor && x < xGracza + wieczor ) &&( y > yGracza - wieczor - 1 && y < yGracza + wieczor - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz < 5 ) { if((( x > xGracza - noc && x < xGracza + noc ) &&( y > yGracza - noc - 1 && y < yGracza + noc - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } else if( godz > 5 && godz < 7 ) { if((( x > xGracza - rano && x < xGracza + rano ) &&( y > yGracza - rano - 1 && y < yGracza + rano - 1 ) ) ) cout << mapa[ x ][ y ]; else cout << wyswietlacz[ x ][ y ]; } } } cout << endl; } } };
class Gracz { public: int xGracza = 10; int yGracza = 10; void poruszanieGracza( bool & r ) { char z = _getch(); switch( z ) { case 'w': yGracza -= 1; break; case 's': yGracza += 1; break; case 'a': xGracza -= 1; break; case 'd': xGracza += 1; break; } r = 1; } };
int main() { Display wys; Gracz gra; Mapa map; srand( time( 0 ) ); bool ruch = true; for(;; ) { if( ruch ) { ruch = 0; gra.poruszanieGracza( ruch ); system( "cls" ); wys.wyswietlWyswietlacz( gra.xGracza, gra.yGracza, 13, map.mapa ); cout << "X : " << gra.xGracza << "\t" << "Y : " << gra.yGracza; } } return 0; } Proszę o pomoc i z góry za nią dziękuję. |
|
« 1 » |