SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › GameStates
В этой теме 3 ответа, 2 участника, последнее обновление Dallon Avery 8 года/лет, 8 мес. назад.
-
АвторСообщения
-
В своём Арканоиде столкнулся с проблемой переключения между игровыми “стадиями”.
Ну вот у меня есть стадия с титульным экраном, где написано название игры и “нажмите пробел, чтобы начать”. Далее следует стадия самой игры, где отрисовывются все объекты и так далее. При выигрыше переключается на стадию, где написано “Вы -победили”, а если проиграл, переключется на стадию где пишется “вы – проиграли” И тут я решил добавить ещё одну стадию, которая при выигрыше или проигрыше позволила бы перезапустить игру по нажатию на R. Только вот стадии что-то не меняются.
Вот отрывок кода со всеми стадиями:
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071//GameStatesenum GameStates {STARTSCREEN, GAME, WIN, GAMEOVER};int gameState = STARTSCREEN;//Game loopwhile (window.isOpen()){window.clear(Color::White);switch(gameState){case STARTSCREEN:window.draw(background);window.draw(gamename);window.draw(start);break;case GAME:window.draw(background);window.draw(top);//window.draw(bottom);window.draw(left);window.draw(right);window.draw(brick1);window.draw(brick2);window.draw(brick3);window.draw(brick4);window.draw(brick5);window.draw(paddle);window.draw(ball);break;case WIN:window.draw(background);window.draw(won);window.draw(restart);break;case GAMEOVER:window.draw(background);window.draw(lost);window.draw(restart);break;}window.display();Event event;while (window.pollEvent(event)){if ( (event.type == Event::Closed) ||((event.type == Event::KeyPressed) && (event.key.code==Keyboard::Escape)) )window.close();else if((event.type == Event::KeyPressed) && (event.key.code==Keyboard::Space) && (gameState == STARTSCREEN)){cout<<"Stage changed"<<endl;gameState = GAME;}else if((event.type == Event::KeyPressed) && (event.key.code==Keyboard::R) && (gameState == GAMEOVER)){gameState = GAME;cout<<"Stage changed"<<endl;break;}else if((event.type == Event::KeyPressed) && (event.key.code==Keyboard::R) && (gameState == WIN)){cout<<"Stage changed"<<endl;gameState = GAME;}}if(gameState!=GAME)continue;А вот как прописаны условия win/lose:
C++123456789101112//Win conditionif(brick1.getPosition().x > width && brick2.getPosition().x > width && brick3.getPosition().x > width && brick4.getPosition().x > width && brick5.getPosition().x > width){cout<<"Stage changed"<<endl;gameState = WIN;}//game over conditionif(ball.getPosition().y > 480){cout<<"Stage changed"<<endl;gameState = GAMEOVER;}Почему же Restart не работает?
стадия то может и меняется, но ничего не происходит. выведи стадию и посмотри меняется или нет. нужно обновить игровую логику, помимо этих стадий. переменные , которые у тебя были в действии так же нужно обнулять.
Как это сделать?
проблему решил, написав три войда и сделав шарик и кирпичики глобальными переменными (чтоб их параметры можно было юзать вне int main())
C++12345678910111213141516171819RectangleShape ball, brick1, brick2, brick3, brick4, brick5;void resetBall(){ball.setPosition(640/2, 480/2);}void resetBricks(){brick1.setPosition(40,40);brick2.setPosition(150,40);brick3.setPosition(260,40);brick4.setPosition(370,40);brick5.setPosition(480,40);}void resetGame(){resetBall();resetBricks();} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.