Anonymous
Преобразование SFML для массивов вершин фактически не применяется к вершинам?
Сообщение
Anonymous » 30 дек 2024, 01:56
Я пытаюсь реализовать обнаружение столкновений SAT в игре, которую я создаю с помощью SFML, но заметил, что позиции вершин из массива вершин, который я использовал для создания игрока, не меняют положение, даже несмотря на то, что я применил к ним преобразование работает правильно.
это класс Player:
Player.h
Код: Выделить всё
#include
#ifndef PLAYER_H
#define PLAYER_H
class Player : public sf::Drawable, public sf::Transformable
{
private:
sf::VertexArray square;
sf::Vector2f velocity;
float speed = 10.f;
sf::Vector2f position;
sf::Transform m_transform;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
public:
Player() = default;
Player(int screen_width, int screen_height);
void create(int screen_width, int screen_height);
void move(bool w, bool a, bool s, bool d);
void setVertexColor(sf::Color color, int vertex);
int getVertexCount();
sf::Vector2f getVertexPos(int n);
};
#endif
Player.cpp
Код: Выделить всё
#include
#include "Player.h"
#include
#include
Player::Player( int screen_width, int screen_height)
{
create(screen_width, screen_height);
}
void Player::create( int screen_width, int screen_height)
{
float size = 60.f;
square.setPrimitiveType(sf::Triangles);
square.resize(6);
square[0].position = sf::Vector2f(0.f, 0.f); //top left
square[1].position = sf::Vector2f(0.f, size); //bottom left
square[2].position = sf::Vector2f(size, 0.f); //top right
square[3].position = sf::Vector2f(0.f, size); //bottom left
square[4].position = sf::Vector2f(size, 0.f); //top right
square[5].position = sf::Vector2f(size, size); // bottom left
square[0].color = sf::Color(200,200,200);
square[1].color = sf::Color::White;
square[2].color = sf::Color(100,100,100);
square[3].color = sf::Color::White;
square[4].color = sf::Color(100,100,100);
square[5].color = sf::Color(200,200,200);
m_transform = getTransform();
}
void Player::move(bool w, bool a, bool s, bool d)
{
float mod_velocity;
sf::Vector2f t;
sf::Vector2f pos;
velocity = sf::Vector2f(0.f, 0.f);
if (w)
{
velocity.y -= 1;
}
if (a)
{
velocity.x -= 1;
}
if (s)
{
velocity.y += 1;
}
if (d)
{
velocity.x += 1;
}
if ((velocity.x != 0.f) || (velocity.y != 0.f))
{
mod_velocity = sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y));
t = velocity/mod_velocity;
velocity = t * speed;
}
m_transform.translate(velocity);
for (int i = 0; i < 6; i++)
{
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79316375/is-sfml-transform-for-vertex-arrays-not-actually-applied-to-vertices[/url]
1735513001
Anonymous
Я пытаюсь реализовать обнаружение столкновений SAT в игре, которую я создаю с помощью SFML, но заметил, что позиции вершин из массива вершин, который я использовал для создания игрока, не меняют положение, даже несмотря на то, что я применил к ним преобразование работает правильно. это класс Player: Player.h [code]#include #ifndef PLAYER_H #define PLAYER_H class Player : public sf::Drawable, public sf::Transformable { private: sf::VertexArray square; sf::Vector2f velocity; float speed = 10.f; sf::Vector2f position; sf::Transform m_transform; virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; public: Player() = default; Player(int screen_width, int screen_height); void create(int screen_width, int screen_height); void move(bool w, bool a, bool s, bool d); void setVertexColor(sf::Color color, int vertex); int getVertexCount(); sf::Vector2f getVertexPos(int n); }; #endif [/code] Player.cpp [code]#include #include "Player.h" #include #include Player::Player( int screen_width, int screen_height) { create(screen_width, screen_height); } void Player::create( int screen_width, int screen_height) { float size = 60.f; square.setPrimitiveType(sf::Triangles); square.resize(6); square[0].position = sf::Vector2f(0.f, 0.f); //top left square[1].position = sf::Vector2f(0.f, size); //bottom left square[2].position = sf::Vector2f(size, 0.f); //top right square[3].position = sf::Vector2f(0.f, size); //bottom left square[4].position = sf::Vector2f(size, 0.f); //top right square[5].position = sf::Vector2f(size, size); // bottom left square[0].color = sf::Color(200,200,200); square[1].color = sf::Color::White; square[2].color = sf::Color(100,100,100); square[3].color = sf::Color::White; square[4].color = sf::Color(100,100,100); square[5].color = sf::Color(200,200,200); m_transform = getTransform(); } void Player::move(bool w, bool a, bool s, bool d) { float mod_velocity; sf::Vector2f t; sf::Vector2f pos; velocity = sf::Vector2f(0.f, 0.f); if (w) { velocity.y -= 1; } if (a) { velocity.x -= 1; } if (s) { velocity.y += 1; } if (d) { velocity.x += 1; } if ((velocity.x != 0.f) || (velocity.y != 0.f)) { mod_velocity = sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y)); t = velocity/mod_velocity; velocity = t * speed; } m_transform.translate(velocity); for (int i = 0; i < 6; i++) { std::cout Подробнее здесь: [url]https://stackoverflow.com/questions/79316375/is-sfml-transform-for-vertex-arrays-not-actually-applied-to-vertices[/url]