SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Стрельба по клику мыши › Ответ в теме: Стрельба по клику мыши
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
Vector2f vectorNormalize(Vector2f vector, Vector2f vector2) { float velocity = 1 / std::sqrt((abs((vector - vector2).x * 5)*abs((vector - vector2).x) * 5) + (abs((vector - vector2).y * 5)*abs((vector - vector2).y * 5))); return Vector2f(vector.x * velocity, vector.y * velocity); } class projectiles { public: float speed_projectiles = 3; float distance; Texture texture_projectiles; Sprite sprite_projectiles; Vector2i size_projectiles; //Размер спрайта Vector2f temp; //Vector2f player; Vector2f velocity; projectiles(Image &image, int size_projectiles_x, int size_projectiles_y, /*float tempX, float tempY, float player_x, float player_y*/ Vector2f startPosition, Vector2f velocity, float duration = 5000) { texture_projectiles.loadFromImage(image); sprite_projectiles.setTexture(texture_projectiles); //player.x = player_x; player.y = player_y; //temp.x = tempX; temp.y = tempY; sprite.setPosition(startPosition); this.velocity = velocity; } void update(float delta) { duration -= delta; sprite.move(velocity.x * (delta/1000), velocity.y * (delta/1000); } }; int main() { RenderWindow window; Vector2i position_window = window.getPosition(); window.create(VideoMode(800, 600), "Game"); window.setFramerateLimit(60); //FPS RectangleShape rectangle_tab(sf::Vector2f(230, 580)); //Окно информации на "Tab" rectangle_tab.setFillColor(sf::Color(0, 0, 0, 128)); //Черный цвет с прозрачностью rectangle_tab.setPosition(position_window.y + 10, position_window.x + 10); Clock clock; //Время Image image_player; //Игрок image_player.loadFromFile("images/sprite1.png"); image_player.createMaskFromColor(Color::White); // Цвет прозрачности Image image_projectiles; //Выстрел image_projectiles.loadFromFile("images/shoot.png"); image_projectiles.createMaskFromColor(Color::White); // Цвет прозрачности Font font; //Текст Text text_stats("", font, 14); font.loadFromFile("fonts/font_SEVENET_7_CYR.ttf"); text_stats.setColor(Color::White); ///Вектор проджектайлов std::vector<*projectiles> projectiles; // Объект класса player player p(image_player, "Player", 48, 48, 0, 0, 300, 400); /* 1. Image - Изображение 2. Name - Имя игрока 3. size_player_x - Размер по Х 4. size_player_y - Размер по Y 5. origin_player_x - Начало первого спрайта по Х 6. origin_player_y - Начало первого спрайта по Y 7. position_x - Начальная позиция спрайта по Y 8. position_y - Начальная позиция спрайта по Y */ while (window.isOpen()) { //float time = clock.getElapsedTime().asMicroseconds(); //Лучше использовать милисикунды. Шаг в микросекунду ты никогда не поймаешь. float time = clock.getElapsedTime().asMiliseconds(); clock.restart(); time = time / 800; p.update(time); //Обновляем класс player с течением времени Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed) window.close(); if (event.type == Event::MouseButtonPressed) //Нажата клавиша мыши //Если ты смотришь в сторону ивента то ты должен хватать его в пуле, а не в остатке; if (event.key.code == Mouse::Left) //Левая { float speed = 1; Vector2f velocity = vectorNormalize(Vector2f(Mouse::getPosition(window).x, Mouse::getPosition(window).y), p.sprite.getPosition()); velocity.x *= speed; velocity.y *= speed; projectiles.push_back(new projectiles(image_projectiles, 32, 32, p.sprite.getPosition(), velocity)); } } for (auto it : projectiles) { if (it != nullptr)//Если ссылка валидна { it->update(time); if (it->duration <= 0)//Если время жизни подошло к концу { delete it;//Удаляем обьект projectiles.erase(it);//Удаляем ссылку на него } }else projectiles.erase(it);//Удаляем ссылку на него } window.clear(Color(128, 128, 128)); //Серый фон игры for (auto it : projectiles) { if (it != nullptr)//Если ссылка валидна { window.draw(it->sprite_projectiles);//Рисуем спрайт }else projectiles.erase(it);//Удаляем ссылку на него } window.draw(p.sprite); //Рисуем персонажа if (Keyboard::isKeyPressed(Keyboard::Tab)) //Окно информации на "Tab" { ostringstream name_player; name_player << p.name_player; //Имя персонажа ostringstream health_player; health_player << (int)p.health; //Здоровье персонажа ostringstream level_player; level_player << p.level; //Уровень персонажа ostringstream exp_player; exp_player << p.level_experience; //Опыт персонажа ostringstream position_player_x; position_player_x << (int)p.x; //Координата X ostringstream position_player_y; position_player_y << (int)p.y; //Координата Y ostringstream free_point_player; free_point_player << p.free_point; //Доступные очки характеристик text_stats.setString("Имя: " + name_player.str() + "\n\nЗдоровье: " + health_player.str() + "\n\nУровень: " + level_player.str() + "\nОпыт: " + exp_player.str() + "\n\nКоординаты:\nX: " + position_player_x.str() + "\nY: " + position_player_y.str() + "\n\nОчки характеристик: " + free_point_player.str()); text_stats.setPosition(position_window.y + 20, position_window.x + 20); window.draw(rectangle_tab); //Выводим окно при нажатии "Tab" window.draw(text_stats); //Выводим текст при нажатии "Tab" } window.display(); } return 0; } |