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

Zacinanie się

Ostatnio zmodyfikowano 2020-03-20 18:02
Autor Wiadomość
Żerbo
Temat założony przez niniejszego użytkownika
Zacinanie się
» 2020-03-20 17:06:48
Witam, mam problem z moją grą 2d. Otóż podczas przesuwania kamerą program się tnie. Nie wiem co może być tego przyczyną.
Podejrzewam, że problemem jest to że rysuję całą mapę w każdej klatce. Próbowałem zrobić tak aby wyświetlać ten fragment mapy na który patrzę ale nie wiem jak. Potrzebuję z tym pomocy.

Tutaj kod do wyświetlania mapy:
C/C++
void Wyswietlanie_Mapy( int PoleX, int PoleY )
{
    for( int a = 0; a < 25; a++ )
    {
        for( int b = 0; b < 25; b++ )
        {
            Okno.draw( Mapa[ a ][ b ].obraz );
            Okno.draw( Mapa[ a ][ b ].obraz_drzewa );
           
            if( noc == true )
                 Okno.draw( Mapa[ a ][ b ].P_noc );
           
            if( Mapa[ a ][ b ].myszka == true )
                 Okno.draw( Mapa[ a ][ b ].podswietlenie );
           
            if( PokazZnacznik == true )
                 Okno.draw( Mapa[ PoleX ][ PoleY ].Znacznik );
           
        }
    }
   
}

Tutaj kod do ruszania kamerą:
C/C++
if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::W )
{
    cam.move( 0, - 15 ); StatOgolne.move( 0, - 15 );
}
if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::S )
{
    cam.move( 0, 15 ); StatOgolne.move( 0, 15 );
}
if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::A )
{
    cam.move( - 15, 0 ); StatOgolne.move( - 15, 0 );
}
if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::D )
{
    cam.move( 15, 0 ); StatOgolne.move( 15, 0 );
}


P-176434
pekfos
» 2020-03-20 17:17:54
A jak się ma jeden kod do drugiego? Te dwa fragmenty są wyrwane z kontekstu.
P-176435
Żerbo
Temat założony przez niniejszego użytkownika
» 2020-03-20 17:26:03
W czym takim razie tkwi problem?
P-176436
pekfos
» 2020-03-20 17:43:25
W kodzie, którego nie podałeś.
P-176437
Żerbo
Temat założony przez niniejszego użytkownika
» 2020-03-20 17:45:40
C/C++
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics.hpp>
#include <ctime>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <sstream>

using namespace std;
using namespace sf;

RenderWindow Okno;
View cam;

bool noc;
bool PokazZnacznik;
int licznik_Czasu, godzina, minuta, dzien;


void ObliczanieCzasu()
{
    licznik_Czasu++;
    if( licznik_Czasu == 60 )
    {
        licznik_Czasu = 0;
        minuta++;
    }
   
    if( minuta == 60 )
    {
        minuta = 0;
        godzina++;
    }
   
    if( godzina == 24 )
    {
        godzina = 0;
        dzien++;
    }
   
    if( godzina >= 20 || godzina < 5 )
         noc = true;
   
    if( godzina >= 6 && godzina < 20 )
         noc = false;
   
}


class Pole
{
public:
    Texture tekstura;
    Sprite obraz;
   
    string nazwa;
   
    Texture Powiekszone_pole;
    Sprite Obraz_zBliska;
   
    Texture zna;
    Sprite Znacznik;
   
    Texture drzewo;
    Sprite obraz_drzewa;
   
    bool myszka;
    RectangleShape podswietlenie;
   
    RectangleShape P_noc;
   
    bool krzak;
};


Pole Mapa[ 30 ][ 30 ];


void Generowanie_Mapy()
{
    srand( time( NULL ) );
    for( int a = 0; a < 25; a++ )
    {
        for( int b = 0; b < 25; b++ )
        {
            int los = rand() % 2;
           
            if( los == 0 )
            {
                int losKrzak = rand() % 2;
               
                if( losKrzak == 0 )
                {
                    Mapa[ a ][ b ].tekstura.loadFromFile( "txt/lakakrzak.PNG" );
                    Mapa[ a ][ b ].obraz.setTexture( Mapa[ a ][ b ].tekstura );
                    Mapa[ a ][ b ].obraz.setScale( 2, 2 ); Mapa[ a ][ b ].krzak = true;
                   
                    Mapa[ a ][ b ].obraz.setPosition( b * 64, a * 64 );
                    Mapa[ a ][ b ].nazwa = "Polana";
                    int losDrzewo = rand() % 2;
                    if( losDrzewo == 0 )
                    {
                        Mapa[ a ][ b ].drzewo.loadFromFile( "txt/greentree.PNG" );
                        Mapa[ a ][ b ].obraz_drzewa.setTexture( Mapa[ a ][ b ].drzewo );
                        Mapa[ a ][ b ].obraz_drzewa.setPosition( Mapa[ a ][ b ].obraz.getPosition().x + 10, Mapa[ a ][ b ].obraz.getPosition().y + 11 );
                        Mapa[ a ][ b ].obraz_drzewa.setScale( 1.75, 1.75 );
                    }
                   
                }
                else
                {
                    Mapa[ a ][ b ].tekstura.loadFromFile( "txt/lakabezkrzaka.PNG" );
                    Mapa[ a ][ b ].obraz.setTexture( Mapa[ a ][ b ].tekstura );
                    Mapa[ a ][ b ].obraz.setScale( 2, 2 );
                   
                    Mapa[ a ][ b ].obraz.setPosition( b * 64, a * 64 );
                    Mapa[ a ][ b ].nazwa = "Polana";
                    int losDrzewo = rand() % 2;
                    if( losDrzewo == 0 )
                    {
                        Mapa[ a ][ b ].drzewo.loadFromFile( "txt/greentree.PNG" );
                        Mapa[ a ][ b ].obraz_drzewa.setTexture( Mapa[ a ][ b ].drzewo );
                        Mapa[ a ][ b ].obraz_drzewa.setPosition( b * 64 + 5, a * 64 + 8 );
                        Mapa[ a ][ b ].obraz_drzewa.setScale( 1.75, 1.75 );
                    }
                }
            }
            else
            {
                Mapa[ a ][ b ].tekstura.loadFromFile( "txt/lasDS.PNG" );
                Mapa[ a ][ b ].obraz.setTexture( Mapa[ a ][ b ].tekstura );
                Mapa[ a ][ b ].obraz.setScale( 2, 2 );
                Mapa[ a ][ b ].obraz.setPosition( b * 64, a * 64 );
                Mapa[ a ][ b ].nazwa = "las";
            }
        }
    }
    for( int a = 0; a < 25; a++ )
    {
        for( int b = 0; b < 25; b++ )
        {
            Mapa[ a ][ b ].podswietlenie.setPosition( b * 64 + 2, a * 64 + 2 );
            Mapa[ a ][ b ].podswietlenie.setFillColor( Color( 255, 255, 200, 90 ) );
            Mapa[ a ][ b ].podswietlenie.setSize( Vector2f( 60, 60 ) );
           
            Mapa[ a ][ b ].P_noc.setPosition( b * 64, a * 64 );
            Mapa[ a ][ b ].P_noc.setFillColor( Color( 0, 0, 0, 150 ) );
            Mapa[ a ][ b ].P_noc.setSize( Vector2f( 64, 64 ) );
           
            Mapa[ a ][ b ].zna.loadFromFile( "txt/znacznik.PNG" );
            Mapa[ a ][ b ].Znacznik.setTexture( Mapa[ a ][ b ].zna );
            Mapa[ a ][ b ].Znacznik.setScale( 2, 2 );
            Mapa[ a ][ b ].Znacznik.setPosition( b * 64, a * 64 );
        }
    }
}


class Gracz
{
public:
    Texture tekstura, miniglowa;
    Sprite obraz, obrazMini;
    int x, y;
    int hp, energia, Najedzenie;
    bool PytRuch;
   
    void Wykonanie_Ruchu( int MousePosX, int MousePosY )
    {
        x = MousePosX; y = MousePosY;
    }
};

Gracz Postac;

void Ladowanie_Postaci()
{
    Postac.tekstura.loadFromFile( "txt/glowa.PNG" );
    Postac.obraz.setTexture( Postac.tekstura );
    Postac.obraz.setPosition( Mapa[ Postac.x ][ Postac.y ].obraz.getPosition() );
    Postac.obraz.setScale( 2, 2 );
   
    Okno.draw( Postac.obraz );
}

void Wyswietlanie_Mapy( int PoleX, int PoleY )
{
   
   
    for( int a = 0; a < 25; a++ )
    {
        for( int b = 0; b < 25; b++ )
        {
            Okno.draw( Mapa[ a ][ b ].obraz );
            Okno.draw( Mapa[ a ][ b ].obraz_drzewa );
           
            if( noc == true )
                 Okno.draw( Mapa[ a ][ b ].P_noc );
           
            if( Mapa[ a ][ b ].myszka == true )
                 Okno.draw( Mapa[ a ][ b ].podswietlenie );
           
            if( PokazZnacznik == true )
                 Okno.draw( Mapa[ PoleX ][ PoleY ].Znacznik );
           
        }
    }
   
}

RectangleShape StatOgolne, StatOgolne2, kreska1, kreska2, hp, energia, najedzenie;




void Interfejs()
{
    StatOgolne.setSize( Vector2f( Okno.getSize().x, Okno.getSize().y / 9 ) );
    StatOgolne.setFillColor( Color( 105, 105, 105 ) );
    StatOgolne.setPosition( 0, 0 );
   
    StatOgolne2.setSize( Vector2f( Okno.getSize().x / 5, Okno.getSize().y ) );
    StatOgolne2.setFillColor( Color( 105, 105, 105 ) );
   
    Postac.miniglowa.loadFromFile( "txt/miniglowa.PNG" );
    Postac.obrazMini.setTexture( Postac.miniglowa );
    Postac.obrazMini.setScale( 2.25, 2.25 );
   
    kreska1.setSize( Vector2f( StatOgolne.getSize().x / 75, StatOgolne.getSize().y ) );
    kreska2.setSize( Vector2f( StatOgolne.getSize().x / 75, StatOgolne.getSize().y ) );
}

void Rysowani_Interfejsu()
{
    StatOgolne2.setPosition( StatOgolne.getPosition().x + Okno.getSize().x - Okno.getSize().x / 5, StatOgolne.getPosition().y );
   
    Postac.obrazMini.setPosition( StatOgolne.getPosition().x, StatOgolne.getPosition().y );
   
    kreska1.setPosition( StatOgolne.getPosition().x + StatOgolne.getSize().y, StatOgolne.getPosition().y );
   
    hp.setSize( Vector2f( Postac.hp * 1.5, StatOgolne.getSize().y / 5 ) );
    hp.setFillColor( Color::Red );
    hp.setPosition( StatOgolne.getPosition().x + Okno.getSize().x / 12, StatOgolne.getPosition().y + StatOgolne.getSize().y / 10 );
   
    energia.setSize( Vector2f( Postac.energia * 1.5, StatOgolne.getSize().y / 5 ) );
    energia.setFillColor( Color( 34, 139, 34 ) );
    energia.setPosition( StatOgolne.getPosition().x + Okno.getSize().x / 12, StatOgolne.getPosition().y + Okno.getSize().y / 25 );
   
    najedzenie.setSize( Vector2f( Postac.Najedzenie * 1.5, StatOgolne.getSize().y / 5 ) );
    najedzenie.setFillColor( Color( 255, 222, 173 ) );
    najedzenie.setPosition( StatOgolne.getPosition().x + Okno.getSize().x / 12, StatOgolne.getPosition().y + Okno.getSize().y / 14.5 );
   
    kreska2.setPosition( StatOgolne.getPosition().x +( 100 * 1.5 ) + Okno.getSize().x / 8, StatOgolne.getPosition().y );
   
    Okno.draw( StatOgolne );
    Okno.draw( StatOgolne2 );
    Okno.draw( Postac.obrazMini );
    Okno.draw( kreska1 );
    Okno.draw( hp );
    Okno.draw( energia );
    Okno.draw( najedzenie );
    Okno.draw( kreska2 );
}

Text HP, ENERGIA, NAJEDZENIE, Min, Hour, Day;
void RysowanieNapisy_interfejs()
{
    Font nr; nr.loadFromFile( "Fonts/asInterfejs.otf" );
   
    stringstream pkthp, pkten, pktna, M, H, D;
    pkthp << Postac.hp;
    pkten << Postac.energia;
    pktna << Postac.Najedzenie;
   
    HP.setFont( nr );
    HP.setString( pkthp.str() );
    HP.setPosition( Postac.hp * 1.5 + StatOgolne.getPosition().x + Okno.getSize().x / 11.5, hp.getPosition().y );
    HP.setCharacterSize( 16 );
    HP.setFillColor( Color::White );
   
    ENERGIA.setFont( nr );
    ENERGIA.setString( pkten.str() );
    ENERGIA.setPosition( Postac.energia * 1.5 + StatOgolne.getPosition().x + Okno.getSize().x / 11.5, energia.getPosition().y );
    ENERGIA.setCharacterSize( 16 );
    ENERGIA.setFillColor( Color::White );
   
    NAJEDZENIE.setFont( nr );
    NAJEDZENIE.setString( pktna.str() );
    NAJEDZENIE.setPosition( Postac.Najedzenie * 1.5 + StatOgolne.getPosition().x + Okno.getSize().x / 11.5, najedzenie.getPosition().y );
    NAJEDZENIE.setCharacterSize( 16 );
    NAJEDZENIE.setFillColor( Color::White );
   
    M << minuta;
    H << godzina;
    D << dzien;
   
    Text czas;
    czas.setFont( nr ); czas.setCharacterSize( 16 );
    czas.setString( H.str() + ":" + M.str() );
   
    if( minuta < 10 )
         czas.setString( H.str() + ":0" + M.str() );
   
    if( godzina < 10 )
         czas.setString( "0" + H.str() + ":" + M.str() );
   
    if( godzina < 10 && minuta < 10 )
         czas.setString( "0" + H.str() + ":0" + M.str() );
   
    czas.setPosition( kreska2.getPosition().x + Okno.getSize().x / 45, hp.getPosition().y );
   
    Text Pokaz_dzien;
    Pokaz_dzien.setCharacterSize( 16 ); Pokaz_dzien.setFont( nr );
    Pokaz_dzien.setPosition( kreska2.getPosition().x + Okno.getSize().x / 45, energia.getPosition().y );
    Pokaz_dzien.setString( "Dzien: " + D.str() );
   
    Okno.draw( HP );
    Okno.draw( ENERGIA );
    Okno.draw( NAJEDZENIE );
    Okno.draw( Pokaz_dzien );
    Okno.draw( czas );
}

void InfoRuch()
{
    Font as;
    as.loadFromFile( "Fonts/asInterfejs.otf" );
    Text PressE( "Ruch (E)", as ); PressE.setCharacterSize( 16 );
    PressE.setPosition( StatOgolne2.getPosition().x, StatOgolne2.getPosition().y );
   
    Text AnulujRuch( "Anuluj (Escape)", as ); AnulujRuch.setCharacterSize( 16 );
    AnulujRuch.setPosition( StatOgolne2.getPosition().x, StatOgolne2.getPosition().x / 8 );
   
    Okno.draw( PressE );
    Okno.draw( AnulujRuch );
}


int main()
{
    bool W_Menu = true;
    bool GameStarted = false;
    bool Ruch = false;
    PokazZnacznik = false;
   
    Okno.create( VideoMode( 1366, 768, 32 ), "Projekt Gry", Style::Fullscreen );
    Okno.setFramerateLimit( 60 ); Okno.setActive( true );
   
    cam.setSize( Okno.getSize().x, Okno.getSize().y );
    cam.setCenter( Okno.getSize().x / 2, Okno.getSize().y / 2 );
   
    Font mh; mh.loadFromFile( "Fonts/mh.otf" );
   
    Text Start( "Start", mh, 38 );
    Start.setFillColor( Color::White ); Start.setPosition( 300, 300 );
   
    Text Ustawienia( "Ustawienia", mh, 38 );
    Ustawienia.setFillColor( Color::White ); Ustawienia.setPosition( 300, 340 );
   
    Text R1( "1280x800", mh, 38 ); R1.setPosition( 300, 300 ); R1.setFillColor( Color::White );
    Text R2( "1280x1024", mh, 38 ); R1.setPosition( 300, 340 ); R1.setFillColor( Color::White );
    Text R3( "1366x768", mh, 38 ); R1.setPosition( 300, 380 ); R1.setFillColor( Color::White );
    Text R4( "1600x900", mh, 38 ); R1.setPosition( 300, 420 ); R1.setFillColor( Color::White );
    Text R5( "1920x1080", mh, 38 ); R1.setPosition( 300, 460 ); R1.setFillColor( Color::White );
    Text Wstecz( "Wstecz", mh, 40 ); Wstecz.setPosition( 300, 500 ); Wstecz.setFillColor( Color::White );
   
    Text Wyjscie( "Wyjscie", mh, 38 );
    Wyjscie.setFillColor( Color::White ); Wyjscie.setPosition( 300, 380 );
   
    RectangleShape Ramka_Ruch( Vector2f( 50, 50 ) ); Ramka_Ruch.setFillColor( Color( 205, 133, 63, 230 ) );
   
    Postac.hp = 100;
    Postac.energia = 100;
    Postac.Najedzenie = 100;
    Postac.x = 6; Postac.y = 5;
   
    noc = false;
    dzien = 4;
    minuta = 52;
    godzina = 14;
   
    int licznik = 0;
    Event Akcja;
    while( Okno.isOpen() )
    {
       
        Vector2i pixelPos = Mouse::getPosition( Okno );
        int Wx = Okno.mapPixelToCoords( pixelPos ).x;
        int Wy = Okno.mapPixelToCoords( pixelPos ).y;
       
        int Px = Wy / 64; int Py = Wx / 64;
        int znX, znY;
       
        if( Ruch == false )
             licznik++;
       
        if( Okno.pollEvent( Akcja ) )
        {
            if( Akcja.type == Event::Closed )
                 Okno.close();
           
            if( PokazZnacznik == false && Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::Escape )
            {
                W_Menu = true; Ruch = false; licznik = 0;
            }
           
            if( Start.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
            {
                Start.setFillColor( Color::Red );
                if( W_Menu == true && Akcja.type == Event::MouseButtonPressed && Akcja.mouseButton.button == Mouse::Left
                && GameStarted == false )
                {
                    Generowanie_Mapy(); W_Menu = false; GameStarted = true; Interfejs();
                }
            }
            if( !Start.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
                 Start.setFillColor( Color::White );
           
            if( Ustawienia.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
            {
                Ustawienia.setFillColor( Color::Red );
                //ustawienia tutaj
            }
            if( !Ustawienia.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
                 Ustawienia.setFillColor( Color::White );
           
            if( Wyjscie.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
            {
                Wyjscie.setFillColor( Color::Red );
                if( W_Menu == true && Akcja.type == Event::MouseButtonPressed && Akcja.mouseButton.button == Mouse::Left )
                     Okno.close();
               
            }
            if( !Wyjscie.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
                 Wyjscie.setFillColor( Color::White );
           
            if( Start.getGlobalBounds().contains( Mouse::getPosition( Okno ).x, Mouse::getPosition( Okno ).y ) )
            {
                Start.setFillColor( Color::Red );
                if( W_Menu == true && Akcja.type == Event::MouseButtonPressed && Akcja.mouseButton.button == Mouse::Left
                && GameStarted == true )
                     W_Menu = false;
               
            }
           
            //podswietlanie pola
            if( W_Menu == false )
            {
                for( int a = 0; a < 25; a++ )
                {
                    for( int b = 0; b < 25; b++ )
                    {
                        if( Mapa[ a ][ b ].myszka == true )
                             Mapa[ a ][ b ].myszka = false;
                       
                    }
                }
               
                if( Mapa[ Px ][ Py ].obraz.getGlobalBounds().contains( Wx, Wy ) && !StatOgolne.getGlobalBounds().contains( Wx, Wy )
                && !StatOgolne2.getGlobalBounds().contains( Wx, Wy ) )
                {
                    Mapa[ Px ][ Py ].myszka = true;
                    //Ruch postaci po mapie ogolnej
                   
                    if( Ruch == true && Akcja.type == Event::MouseButtonPressed && Akcja.mouseButton.button == Mouse::Left )
                    {
                        PokazZnacznik = true; znX = Wy / 64; znY = Wx / 64;
                    }
                }
               
                if( Ruch == true && PokazZnacznik == true && Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::E )
                {
                    PokazZnacznik = false; Postac.Wykonanie_Ruchu( znX, znY );
                }
               
                if( PokazZnacznik == true && Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::Escape )
                {
                    PokazZnacznik = false;
                }
            }
           
            if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::W )
            {
                cam.move( 0, - 15 ); StatOgolne.move( 0, - 15 );
            }
            if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::S )
            {
                cam.move( 0, 15 ); StatOgolne.move( 0, 15 );
            }
            if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::A )
            {
                cam.move( - 15, 0 ); StatOgolne.move( - 15, 0 );
            }
            if( Akcja.type == Event::KeyPressed && Akcja.key.code == Keyboard::D )
            {
                cam.move( 15, 0 ); StatOgolne.move( 15, 0 );
            }
           
        } //If do wydarzen
       
       
       
        int CamPosPPx = cam.getCenter().x;
        int CamPosPPy = cam.getCenter().y;
        if( W_Menu == true )
        {
            if( GameStarted == true )
            {
                Start.setString( "Kontynuuj" );
            }
           
            cam.setCenter( Okno.getSize().x / 2, Okno.getSize().y / 2 );
            Okno.setView( cam );
            Okno.draw( Start ); Okno.draw( Ustawienia ); Okno.draw( Wyjscie );
        }
       
        cam.setCenter( CamPosPPx, CamPosPPy );
        if( W_Menu == false && GameStarted == true )
        {
            Okno.setView( cam );
            Wyswietlanie_Mapy( znX, znY );
            Ladowanie_Postaci();
            Rysowani_Interfejsu();
            RysowanieNapisy_interfejs();
            ObliczanieCzasu();
           
            if( PokazZnacznik == true )
                 InfoRuch();
           
        }
       
        if( licznik == 60 )
        {
            Ruch = true;
            licznik = 0;
        }
       
       
        Okno.display();
        Okno.clear();
       
    } //Petla glowna programu
}
P-176439
pekfos
» 2020-03-20 18:02:50
Raczej bym obstawiał że problem wynika z wielokrotnego ładowania zasobów w pętli. Tekstury i czcionki są ciężkie, a sprajty i teksty są lekkie. Te pierwsze powinny być utworzone raz i tylko używane wielokrotnie, a tych drugich często nie ma nawet sensu trzymać dłużej niż potrzeba, bo ich główną rolą jest przekazanie parametrów do operacji rysowania.
P-176441
« 1 »
  Strona 1 z 1