C++/SFML объект рисуется не там, где надо

#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>
#include <iostream>
#include <list>
#include <cstdlib>
#include <ctime>

using namespace sf;
using namespace std;

float radians = 0.017453;

//класс со сходными свойствами всех игровых объектов
class Entity
{
public:
    int points, size;
    float dx, dy, x, y;
    float speed;
    float angle;

    CircleShape EntityShape;
    Entity(float X, float Y, int POINTS, int SIZE, int ANGLE)
    {
            x = X; y = Y; points = POINTS; size = SIZE;

            angle = ANGLE;
           
            dx, dy = 0;

            EntityShape.setOrigin(size, size);
    }

    virtual void update() {};
    };

//класс игрока
class Ship : public Entity
{
public:
    bool thrust = false;
    float maxSpeed = 7;

    Ship(float X, float Y, int POINTS, int SIZE, int ANGLE) : Entity(X, Y, POINTS, SIZE, ANGLE)
    {
            EntityShape.setRadius(size);
            EntityShape.setPointCount(points);
            EntityShape.setFillColor(Color::White);
            EntityShape.setOutlineColor(Color::White);
            EntityShape.setOutlineThickness(2);
            EntityShape.setScale(0.7, 1);
            EntityShape.setPosition(x, y);
    }
    void update()
    {
            //проверяем:есть ли тяга
            if (thrust)
            {
                    dx += cos(angle * radians) * 0.2;
                    dy += sin(angle * radians) * 0.2;
            }
            else
            {
                    dx *= 0.99;
                    dy *= 0.99;
            }

            speed = sqrt(dx * dx + dy * dy);

            if (speed > maxSpeed)
            {
                    dx *= maxSpeed / speed;
                    dy *= maxSpeed / speed;
            }

            //вычисляем икс и игрек
            x += dx;
            y += dy;

            //проверяем: корабль вышел за пределы игрового пространства?
            if (x > 620) x = 0;
            if (x < -20) x = 600;

            if (y > 420) y = 0;
            if (y < -20) y = 400;

            //перемещаем корабль
            EntityShape.setPosition(x, y);

            //непосредственно сам поворот
            EntityShape.setRotation(angle + 90);
         }
    };

    class Asteroid : public Entity
    {
    public:
        Asteroid(float X, float Y, int POINTS, int SIZE, int ANGLE) : Entity(X, Y, POINTS, SIZE, 
        ANGLE)
        {
            EntityShape.setRadius(size);
            EntityShape.setPointCount(points);
            EntityShape.setFillColor(Color::Black);
            EntityShape.setOutlineColor(Color::White);
            EntityShape.setOutlineThickness(2);
            EntityShape.setPosition(x, y);

            dx = rand() % 9 - 4;
            dy = rand() % 9 - 4;
        }
        void update()
        {
            x += dx;
            y += dy;

            if (x > 650) x = -50;
            if (x < -50) x = 650;

            if (y > 450) y = -50;
            if (y < -50) y = 450;

            EntityShape.setPosition(x, y);

        }
    }; 

  class Bullet : public Entity
  {
  public:
    Bullet(float X, float Y, int POINTS, int SIZE, int ANGLE) : Entity(X, Y, POINTS, SIZE, ANGLE)
    {
            EntityShape.setRadius(size);
            EntityShape.setPointCount(points);
            EntityShape.setFillColor(Color::White);
            EntityShape.setOutlineColor(Color::White);
            EntityShape.setPosition(x, y);
    }
    void update()
    {
            dx = cos(angle * radians) * 6;
            dy = sin(angle * radians) * 6;

            x += dx;
            y += dy;

            EntityShape.setPosition(x, y);
       }
 };

int main()
{
    //рисуем окно
    RenderWindow app(VideoMode(600, 400), "Game");
    app.setFramerateLimit(60);

    Ship ship(300, 200, 3, 10, 0);

    list <Entity*> entities;
    list <Entity*> :: iterator iter;

    for (int i = 0; i < 10; i++)
    {
            Asteroid* asteroids = new Asteroid(rand() % 600, rand() % 400, 5, 20, 0);
            entities.push_back(asteroids);
    }

    while (app.isOpen())
    {
            Event event;
            while (app.pollEvent(event))
            {
                    if (event.type == Event::Closed)
                    {
                            app.close();
                    }
                   
                    if (event.type == Event::KeyPressed)
                    {
                            if (event.key.code == Keyboard::Space)
                            {
                                    Bullet *bullet = new Bullet(300, 200, 10, 2, 0);
                                    entities.push_back(bullet);
                            }
                    }
            }
           
            if (Keyboard::isKeyPressed(Keyboard::A))
            {
                    ship.angle -= 3;
            }
           
            if (Keyboard::isKeyPressed(Keyboard::D))
            {
                    ship.angle += 3;
            }
           
            if (Keyboard::isKeyPressed(Keyboard::W))
            {
                    ship.thrust = true;
            }
            else ship.thrust = false;

            for (iter = entities.begin(); iter != entities.end(); iter++)
            {
                    (*iter)->update();
            }

            app.clear(Color::Black);
            app.draw(ship.EntityShape);

            for (iter = entities.begin(); iter != entities.end(); iter++)
            {
                    app.draw((*iter)->EntityShape);
            }

            ship.update();
           
            app.display();
        }
  }

Https://pastebin.pl/view/33ae18c2

В цикле с событий клавиш создаю объекты класса Bullet и запихиваю их в список типа Entity. Пульки, как и астероиды, прорисовываются при нажатии клавиши Space,но вылетают не из корабля, а из центра окна и только, независимо от положения кораблика. Я не знаю как это исправить, надеюсь вы мне поможете))


Ответы (1 шт):

Автор решения: EOF

В строке Bullet *bullet = new Bullet(300, 200, 10, 2, 0); Вы создаете обьект каждый раз в одинаковых координатах и задаёте одинаковый угол. Что всё заработало, необходимо передавать в конструктор координаты корабля и угол. Просто замените строку

Bullet *bullet = new Bullet(300, 200, 10, 2, 0);

на

Bullet *bullet = new Bullet(ship.x, ship.y, 10, 2, ship.angle);
→ Ссылка