int refresh_game() { char key; fd_set set; FD_ZERO(&set); FD_SET(0, &set); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec= 4* 100*1000; if (select(1, &set, NULL, NULL, &timeout) < 0) return -1; if(FD_ISSET(0,&set)){ while((key=getch())==-1); if(key==' '||key== 'w'||key == 'W') bird.y -=1; else if(key=='q'||key=='Q') return -1; } else bird.y +=1; move_wall(); draw_bird(); if(wether_crash()==1) return -2; return 1; }
int main() { int state=0; init_scr(); init_gamewin(); init_wall(); begain_game(); draw_wall(); draw_bird(); char c=getch(); while((state=refresh_game())>0) ; if(state==-2) game_over(); endwin(); return 0; }
int main() { // само окно sf::RenderWindow window(sf::VideoMode(width, height), "_dtts"); // для картинки птицы sf::Image bird_image; bird_image.loadFromFile("images/bird_0.png"); bird_image.createMaskFromColor(sf::Color::White); sf::Texture bird_texture; bird_texture.loadFromImage(bird_image); sf::Sprite bird_sprite(bird_texture); // для картинки мертвой птицы sf::Image dead_bird_image; dead_bird_image.loadFromFile("images/dead_bird.png"); dead_bird_image.createMaskFromColor(sf::Color::White); sf::Texture dead_bird_texture; dead_bird_texture.loadFromImage(dead_bird_image); sf::Sprite dead_bird_sprite(dead_bird_texture); // для картинки горизонтального шипа sf::Image hor_spike_image; hor_spike_image.loadFromFile("images/hor_spike.png"); hor_spike_image.createMaskFromColor(sf::Color::White); sf::Texture hor_spike_texture; hor_spike_texture.loadFromImage(hor_spike_image); sf::Sprite hor_spike_sprite(hor_spike_texture); // для картинки вертикального шипа sf::Image ver_spike_image; ver_spike_image.loadFromFile("images/ver_spike.png"); ver_spike_image.createMaskFromColor(sf::Color::White); sf::Texture ver_spike_texture; ver_spike_texture.loadFromImage(ver_spike_image); sf::Sprite ver_spike_sprite(ver_spike_texture); // для отображения текущего счета sf::Font score_font; score_font.loadFromFile("fonts/a_Alterna.ttf"); sf::Text score_text(sf::String("0"), score_font, 36); score_text.setPosition(100, 100); score_text.setColor(sf::Color::Black); // само поле dtts::Field field(width, height, hor_spike_base, hor_spike_height,ver_spike_base,ver_spike_height, complexity, time_step); // создадим птицу, кружочки и шипы и получим начальное состояние птицы dtts::BirdState bird_state = make_bird_n_other(field); bool bird_to_right = true; // ? птица летит вправо bool is_game = false; // ? игра идет // время, прошедшее после смерти птицы double after_death_counter = 0.0; while (window.isOpen()) { // обработка закрытия окна sf::Event Event; while (window.pollEvent(Event)) { if (Event.type == sf::Event::Closed) { window.close(); } if (Event.type == sf::Event::MouseButtonPressed) { if (Event.mouseButton.button == sf::Mouse::Left) { // если игра не идет if (!is_game) { // игра начинается при нажатии на клавишу is_game = true; } // постольку поскольку нажата мышка, взмах имеет место быть field.bird_swing(0); } } } // если игра идет if (is_game) { // птица летит, и получаем ее новое состояние bird_state = field.bird_fly(0); // если птица мертва, считаем время, прошедшее после сметри if (!bird_state.alive) { after_death_counter += time_step; } // если птица мертва достаточно долго, игра прекращается, // старая птица удаляется, и создается новая птица, аналогичная старой, // также создаются новые шипы if (after_death_counter > 1.0) { // удаляем старые кружочки field.clear_circles(0); is_game = false; after_death_counter = 0; field.erase_bird(0); bird_state = make_bird_n_other(field); } // если живая птица ударилась о стену и поменяла направление if (bird_state.alive && bird_state.right_direction != bird_to_right) { // запоминаем новое направление bird_to_right = bird_state.right_direction; // удаляем все шипы field.clear_hor_spikes(); // добавляем шипы на противоположную стену field.add_random_hor_spikes(bird_to_right); } } // получаем все шипы на поле auto spikes = field.get_hor_spikes(); // получаем все кружочки на поле auto circles = field.get_circles(); // счет меняется только во время игры if (is_game) { score_text.setString(sf::String(std::to_string(bird_state.score))); } // очистка старого изображения window.clear(sf::Color::White); // для отображение кружочка sf::CircleShape circle; circle.setFillColor(sf::Color::White); circle.setOutlineThickness(1.5); circle.setOutlineColor(sf::Color::Green); // отображение кружочков for (const auto &one_bird_circles : circles) { for (const auto &one_circle : one_bird_circles) { circle.setPosition(one_circle.x - one_circle.r, height - (one_circle.y + one_circle.r)); circle.setRadius(one_circle.r); window.draw(circle); } } // прорисовка горизонтальных шипов for (const auto &one_spike : spikes) { hor_spike_sprite.setPosition(one_spike.x - (one_spike.x == 0 ? 0 : hor_spike_height), height - (one_spike.y + hor_spike_base / 2)); hor_spike_sprite.setTextureRect(sf::IntRect(one_spike.x == 0 ? 0 : hor_spike_height, 0, hor_spike_height, hor_spike_base)); window.draw(hor_spike_sprite); } // прорисовка вертикальных шипов for (unsigned n = 0; n != std::round(width / ver_spike_base); ++n) { ver_spike_sprite.setPosition(n * ver_spike_base, 0); ver_spike_sprite.setTextureRect(sf::IntRect(ver_spike_base * 0, 0, ver_spike_base, ver_spike_height)); window.draw(ver_spike_sprite); ver_spike_sprite.setPosition(n * ver_spike_base, height - ver_spike_height); ver_spike_sprite.setTextureRect(sf::IntRect(ver_spike_base * 1, 0, ver_spike_base, ver_spike_height)); window.draw(ver_spike_sprite); } // прорисовка птицы draw_bird(bird_state, (bird_state.alive ? bird_sprite : dead_bird_sprite), window); // отображение счета window.draw(score_text); // отображение нового кадра window.display(); // задержка времени Sleep(time_step*1000.0); } return 0; }