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

Problem z poruszaniem się po mapie w grze konsolowej [c++]

Ostatnio zmodyfikowano 2019-06-28 13:28
Autor Wiadomość
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 :

C/C++
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 << '@';
           
           
           
           
            ////////////////// PONIŻEJ MAŁO ISTOTNA RZECZ - PROSZĘ SKUPIĆ SIĘ NA TYM FRAGMENCIE KODU ^^^
            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 :
C/C++
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 :
C/C++
#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 << '@';
               
               
               
               
                ////////////////// PONIŻEJ MAŁO ISTOTNA RZECZ - PROSZĘ SKUPIĆ SIĘ NA TYM FRAGMENCIE KODU ^
                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ę.
P-174848
« 1 »
  Strona 1 z 1