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! :)