SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › При выстреле пуля не появляется, а просто наносит урон ближайшему противнику.
В этой теме 1 ответ, 1 участник, последнее обновление Ulysses 7 года/лет, 2 мес. назад.
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
-
АвторСообщения
-
Не нашёл ничего похожего, суть проблемы в заголовке, без лишних слов вот код:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216#include <SFML/Graphics.hpp>#include <iostream>#include <sstream>#include <vector>#include <list>using namespace sf; using namespace std;//Entityclass Entity {public:float dx, dy, x, y, speed;int w, h, hp;bool isLive;String file;Image image;Texture texture;Sprite sprite;String name;Entity(String f, float X, float Y, int W, int H, String Name) {file = f; x = X; y = Y; w = W; h = H; name = Name;speed = 0; dx = 0; dy = 0; isLive = true;image.loadFromFile(file);image.createMaskFromColor(Color(228, 228, 228));texture.loadFromImage(image);sprite.setTexture(texture);sprite.setScale(2.f, 2.f);sprite.setTextureRect(IntRect(x, y, w, h));}FloatRect getRect() {return FloatRect(x, y, w, h);}virtual void update(float time) = 0;};//Playerclass Player :public Entity {public:float currentFrame = 0;int dir;Player(String f, int X, int Y, float W, float H, String Name) :Entity(f, X, Y, W, H, Name) {dir = 0;hp = 200;sprite.setPosition(512,650);}// 37, 0, 43, 36void control(float time) {sprite.setTextureRect(IntRect(x, y, w, h));if (Keyboard::isKeyPressed(Keyboard::Up) || Keyboard::isKeyPressed(Keyboard::W) || Joystick::getAxisPosition(0, Joystick::Y) <= -50.) {dir = 0; speed = 0.1;currentFrame += 0.005*time;if (currentFrame > 2) currentFrame -= 2;sprite.setTextureRect(IntRect(37, 36 + 43 * int(currentFrame), 39, 43));}if (Keyboard::isKeyPressed(Keyboard::Left) || Keyboard::isKeyPressed(Keyboard::A) || Joystick::getAxisPosition(0, Joystick::X) <= -50.) {dir = 3; speed = 0.1;currentFrame += 0.005*time;if (currentFrame > 2) currentFrame -= 2;sprite.setTextureRect(IntRect(0, 0 + 43 * int(currentFrame), 30, 43));}if (Keyboard::isKeyPressed(Keyboard::Down) || Keyboard::isKeyPressed(Keyboard::S) || Joystick::getAxisPosition(0, Joystick::Y) >= 50.) {dir = 1; speed = 0.1;currentFrame += 0.005*time;if (currentFrame > 2) currentFrame -= 2;sprite.setTextureRect(IntRect(37, 36 + 43 * int(currentFrame), 39, 43));}if (Keyboard::isKeyPressed(Keyboard::Right) || Keyboard::isKeyPressed(Keyboard::D) || Joystick::getAxisPosition(0, Joystick::X) >= 50.) {dir = 2; speed = 0.1;currentFrame += 0.005*time;if (currentFrame > 2) currentFrame -= 2;sprite.setTextureRect(IntRect(84, 0 + 43 * int(currentFrame), 29, 43));}}void update(float time) {control(time);switch (dir) {case 0: dx = 0; dy = -speed; break;case 1: dx = 0; dy = speed; break;case 2: dx = speed; dy = 0; break;case 3: dx = -speed; dy = 0; break;}if (sprite.getPosition().x >= 1024 - w / 1.5) dx = -speed;if (sprite.getPosition().x <= 0.) dx = speed;if (sprite.getPosition().y >= 720 - h) dy = -speed;if (sprite.getPosition().y <= 0.) dy = speed;dx *= time; dy *= time;speed = 0;sprite.move(dx,dy);if (hp <= 0) isLive = false;}};//Enemyclass Enemy :public Entity {public:bool dir = true;Enemy(String f, int X, int Y, float W, float H, String Name) :Entity(f, X, Y, W, H, Name) {hp = 100;speed = 0.01;sprite.setPosition(512, 0);}void update(float time) {dy = 0.5*speed;if (dir) dx = 5*speed;else dx = -5 * speed;if (sprite.getPosition().x >= 1024 - w) dir = false;if (sprite.getPosition().x <= 0) dir = true;dx *= time; dy *= time;sprite.move(dx, dy);if (sprite.getPosition().y >= 720 || sprite.getPosition().y <= 0) isLive = false;if (hp <= 0) isLive = false;}};//Bulletclass Bullet : public Entity {public:Bullet(String f, int X, int Y, float W, float H, String Name, int pX, int pY) :Entity(f, X, Y, W, H, Name) {hp = 100;speed = 0.1;sprite.setPosition(pX, pY);}void update(float time) {dx = 0;dy = - speed * time;sprite.move(dx, dy);if (sprite.getPosition().y >= 720 || sprite.getPosition().y <= 0) isLive = false;if (hp <= 0) isLive = false;}};int main(){//InitializeRenderWindow window(VideoMode(1024, 720), "Invade on Vaalbara");Player p1("player.png", 37, 0, 43, 36, "Player1");Clock spawn;float spwnReady = 3;Clock clock;Font font; font.loadFromFile("font.otf");Text hpBar("", font, 20); hpBar.setColor(Color::Green);list<Entity*> entities; list<Entity*>::iterator it;//Scenewhile (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 300;srand(time);Event event;while (window.pollEvent(event)){if (event.type == Event::Closed ||(event.type == Event::KeyPressed && event.key.code == Keyboard::Escape))window.close();}float spawnT = spawn.getElapsedTime().asSeconds();spwnReady += spawnT;if (spwnReady > 3) {entities.push_back(new Enemy("enemy.png", 0, 0, 16, 20, "Enemy"));spwnReady = 0;}spawn.restart();if (Keyboard::isKeyPressed(Keyboard::Space) || Joystick::isButtonPressed(0, 1)) {float spawnT = spawn.getElapsedTime().asSeconds();spwnReady += spawnT;if (spwnReady > 0.5) {entities.push_back(new Bullet("ammo.png", 0, 0, 3, 7, "Bullet", p1.sprite.getPosition().x + p1.sprite.getTextureRect().width / 1.2, p1.sprite.getPosition().y));spwnReady = 0;}spawn.restart();}for (it = entities.begin(); it != entities.end();) {Entity *e = *it;e->update(time);if (e->isLive == false) {it = entities.erase(it);delete e;}else it++;}for (it = entities.begin(); it != entities.end(); it++) {if ((*it)->name == "Enemy") {Entity *enemy = *it;if (p1.getRect().intersects(enemy->getRect())) {p1.hp -= 25;enemy->hp -= 50;}for (list<Entity*>::iterator it2 = entities.begin(); it2 != entities.end(); it2++) {Entity *bullet = *it2;if (bullet->name == "Bullet") {if (bullet->hp > 0) {if (bullet->getRect().intersects(enemy->getRect())) {bullet->hp = 0;enemy->hp -= 50;}}}}}}p1.update(time);//Drawwindow.clear(Color(0, 0, 80, 255));ostringstream hpStr; hpStr << p1.hp; hpBar.setString("Health: " + hpStr.str());window.draw(hpBar);window.draw(p1.sprite);for (it = entities.begin(); it != entities.end(); it++) window.draw((*it)->sprite);window.display();}return 0;}Вообщем после дня ковыряния нашёл ответ в англоязычном форуме. Суть в чём: строка 29 даёт не те X и Y, при изменении её на return FloatRect(sprite.getPosition().x, sprite.getPosition().y, w, h); всё отлично работает.
-
АвторСообщения
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
Для ответа в этой теме необходимо авторизоваться.