• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przejście pomiędzy poziomami (RPG, SFML, C++)

Object Storage Arubacloud
0 głosów
397 wizyt
pytanie zadane 15 maja 2017 w C i C++ przez neos Początkujący (320 p.)

Cześć, piszę grę (C++, SFML) rpg. Napisałem już silnik (menu, renderowanie, grafiki, tryb edycji, muzyka, dźwięki, kolizje, eventy itp). Teraz chciałbym zająć się przejściem między poziomami (jak to w rpg). Moje główne pytanie jest takie, czy mógłby ktoś mnie nakierować w jaki sposób zrobić przejście między kolejnymi mapami? Jakiś wskaźnik polimorficzny czy coś w tym stylu? (prosiłbym bardzo o przykładowy kod) Obecnie trochę łopatologicznie mam to zrobione:

 

void Engine::runEngine()
{
    
    
    //load texture
    if(!textureBackground.loadFromFile(resourcePath()+"tiles.png"))
    {
        cout<<"Cant load tile_elements.png!"<<endl;
        return EXIT_FAILURE;
    }
    //set sprites
    spriteBackground.setTexture(textureBackground);
    spriteBackground.setTextureRect(sf::IntRect(0,200,50,50));
    
    cout<<"Engine started"<<endl;

    bool game = true;
    

  //////////////////////////////START THE GAME LOOP/////////////////////////
    while(game)
    {
    while(state_level != END)
    {
        
        switch (state_level)
        {
            case LevelState::LEVEL1:
            {
            level1:
                
                cout<<"LEVEL1"<<endl;
                //reserve memory for vector arrays
                WallArray.reserve(1000);
                BoxArray.reserve(500);
                CoinArray.reserve(500);
                displayTextArray.reserve(500);
                EnemyArray.reserve(500);
                BulletArray.reserve(500);
                
                WallArray.clear();
                BoxArray.clear();
                CoinArray.clear();
                displayTextArray.clear();
                EnemyArray.clear();
                BulletArray.clear();
                
                cout<<"WallArray size: "<<WallArray.size()<<endl;
                cout<<"BoxArray size: "<<BoxArray.size()<<endl;
                cout<<"CoinArray size: "<<CoinArray.size()<<endl;
                cout<<"displayTextArray size: "<<displayTextArray.size()<<endl;
                cout<<"EnemyArray size: "<<EnemyArray.size()<<endl;
                cout<<"BulletArray size: "<<BulletArray.size()<<endl;
                
                
             
                //load player parameters
                loadPlayer(&player);
                //setting text position on the screen
                moneyText.text.setPosition(0, 0);
                moneyText.text.setFont(moneyText.font_mr_otis);
                playerLifeText.text.setPosition(0, 55);
                playerLifeText.text.setFont(playerLifeText.font_mr_otis);
                bool menu = false;
                //setting view
                sf::View view1 (sf::Vector2f(200, 200), sf::Vector2f(300, 200));
                view1.setSize(sf::Vector2f(window->getSize().x, window->getSize().y ));
                view1.setCenter(sf::Vector2f(view1.getSize().x/2,view1.getSize().y/2));
                window->setView(view1);
                //////create level
                createLevelEnd(66, 820, 600);
                //(int roomSize, int roomStartPositionX, int roomStartPositionY, int doorPosition, int numberEnemies)
                createRoom(20,1000,1000,10,3);
                createRoom(22, 1000, 2100, 11, 6);
                createRoom(10, 1350, 2400, 5, 3);
                createBackground1();
                //set music background
                music.music1.play();
                music.music1.setLoop(true);
                //game loop
                while(state_level==LEVEL1)
                {
                    //keyboard events
                    KeyboardEvents(&canShowPredatorDistance ,distance_predator);
                    //clear window
                    window->clear();
                    //collisions
                    Collisions();
                    //checking distance beetwen predator enemy and player
                    check_IsPredatorNear(distance_predator);
                    //destruction animation
                    destructionAnimation();
                    //delete objects
                    DeleteObjects();
                    //EDITOR
                    Editor();
                    //PLAYER MOVE AND UPDATE POSITION WITH RECTANGLE
                    player.Movement();
                    player.Update();
                    //PLAYER VIEW AND TEXT
                    window->setView(view1);
                    view1.setCenter(player.rect.getPosition());
                    //drawing
                    window->clear();
                    //drawBackground();
                    drawALL();
                    //set display text position
                    moneyText.text.setPosition(player.rect.getPosition().x-window->getSize().x/2, player.rect.getPosition().y-window->getSize().y/2);
                    playerLifeText.text.setPosition(player.rect.getPosition().x-window->getSize().x/2, player.rect.getPosition().y-window->getSize().y/2+50);
                    /////////////////////////////////// DISPLAY ///////////////////////////////////
                    window->display();
                    //clear window
                    window->clear();
                    
                    if(state_level==LEVEL2)
                    {
                        goto level2;
                    }
                    else;
                }
                
                music.music1.stop();
                
                clearMap();
            }
                break;
                
            case LevelState::LEVEL2:
            {
            level2:
                
                
                window->clear();
                cout<<"LEVEL2"<<endl;

                //reserve memory for vector arrays
                WallArray.reserve(1000);
                BoxArray.reserve(500);
                CoinArray.reserve(500);
                displayTextArray.reserve(500);
                EnemyArray.reserve(500);
                BulletArray.reserve(500);
                
                
                WallArray.clear();
                BoxArray.clear();
                CoinArray.clear();
                displayTextArray.clear();
                EnemyArray.clear();
                BulletArray.clear();
                
                cout<<"WallArray size: "<<WallArray.size()<<endl;
                cout<<"BoxArray size: "<<BoxArray.size()<<endl;
                cout<<"CoinArray size: "<<CoinArray.size()<<endl;
                cout<<"displayTextArray size: "<<displayTextArray.size()<<endl;
                cout<<"EnemyArray size: "<<EnemyArray.size()<<endl;
                cout<<"BulletArray size: "<<BulletArray.size()<<endl;
                
                //load player parameters
                loadPlayer(&player);
                //setting text position on the screen
                moneyText.text.setPosition(0, 0);
                moneyText.text.setFont(moneyText.font_mr_otis);
                playerLifeText.text.setPosition(0, 55);
                playerLifeText.text.setFont(playerLifeText.font_mr_otis);
                bool menu = false;
                //setting view
                sf::View view1 (sf::Vector2f(200, 200), sf::Vector2f(300, 200));
                view1.setSize(sf::Vector2f(window->getSize().x, window->getSize().y ));
                view1.setCenter(sf::Vector2f(view1.getSize().x/2,view1.getSize().y/2));
                window->setView(view1);
                //////create level
                createLevelEnd(40, 820, 600);
                //(int roomSize, int roomStartPositionX, int roomStartPositionY, int doorPosition, int numberEnemies)
                createRoom(10,1000,1000,5,3);
                createRoom(10, 1000, 2100, 5, 2);
                createRoom(5, 1350, 2400, 2, 2);
                createBackground1();
                //set music background
                music.music1.play();
                music.music1.setLoop(true);
                //game loop
                while(state_level==LEVEL2)
                {
                    //keyboard events
                    KeyboardEvents(&canShowPredatorDistance ,distance_predator);
                    //clear window
                    window->clear();
                    //collisions
                    Collisions();
                    //checking distance beetwen predator enemy and player
                    check_IsPredatorNear(distance_predator);
                    //destruction animation
                    destructionAnimation();
                    //delete objects
                    DeleteObjects();
                    //EDITOR
                    Editor();
                    //PLAYER MOVE AND UPDATE POSITION WITH RECTANGLE
                    player.Movement();
                    player.Update();
                    //PLAYER VIEW AND TEXT
                    window->setView(view1);
                    view1.setCenter(player.rect.getPosition());
                    //drawing
                    window->clear();
                    //drawBackground();
                    drawALL();
                    //set display text position
                    moneyText.text.setPosition(player.rect.getPosition().x-window->getSize().x/2, player.rect.getPosition().y-window->getSize().y/2);
                    playerLifeText.text.setPosition(player.rect.getPosition().x-window->getSize().x/2, player.rect.getPosition().y-window->getSize().y/2+50);
                    /////////////////////////////////// DISPLAY ///////////////////////////////////
                    window->display();
                    //clear window
                    window->clear();
                    if(state_level==LEVEL1)
                    {
                        goto level1;
                    }
                    else;
                }
                
                music.music1.stop();
                clearMap();
                
            }
                break;
                
            default:
                break;
        }
        int x;
        cout<<"Wprowadz 1 by wrocic"<<endl;
        cin>>x;
        if(x==1)
        {
            game = false;
        }

    }
    //save player's parameters
    savePlayer();
    //set default view in menu
    window->setView(window->getDefaultView());
    //game background music stop
  
        
    }
}

Wiem, że dużo rzeczy jest tutaj źle zapisanych, ale proszę o jakieś porady. Jeśli będzie trzeba to będę starał się to całkowicie zmienić, tylko muszę widzieć w jaką stronę się kierować. Z góry dzięki za jakiekolwiek porady! :)

1 odpowiedź

+1 głos
odpowiedź 15 maja 2017 przez Ehlert Ekspert (212,670 p.)
Wskaźnik polifoniczny to świetny pomysł. Robisz sobie klasę level. Zawiera ona mapę, listę npc i różne inne dane które mają budować dany poziom.

Podobne pytania

0 głosów
2 odpowiedzi 887 wizyt
pytanie zadane 6 grudnia 2015 w C# przez emSon Stary wyjadacz (10,480 p.)
+2 głosów
0 odpowiedzi 614 wizyt
pytanie zadane 5 października 2017 w Nasze projekty przez L33TT12 Gaduła (3,950 p.)
+9 głosów
4 odpowiedzi 962 wizyt
pytanie zadane 23 czerwca 2015 w Nasze projekty przez DiZZie Gaduła (3,170 p.)

92,568 zapytań

141,422 odpowiedzi

319,635 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...