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);