Программы на C++. Форум разработчиков
Anonymous
SFML draw() не рисует первую форму объекта
Сообщение
Anonymous » 31 мар 2024, 03:27
Я создаю движок физического моделирования на C++ и SFML. Я столкнулся с проблемами, когда я хочу нарисовать вектор объектов, но метод Draw не рисует первый объект из вектора. Если я хочу нарисовать следующие объекты, все работает нормально. Были ли у кого-нибудь еще подобные проблемы?
Код: Выделить всё
main.cpp:
#include "../include/engine.hpp"
int main()
{
auto engine = new Engine();
while(engine->isRunning())
{
engine->update(0.25f);
engine->draw();
}
}
Код: Выделить всё
engine.cpp:
#include "../../include/engine.hpp"
Engine::Engine()
: window("Collision Engine")
{
generateObjects(totalObjects);
}
void Engine::update(float dt)
{
window.update();
releaseObject(dt);
applyConstraint();
applyGravity();
for(int i = 0; i < objectReleaseCount; i++)
objects[i].updatePosition(dt);
}
void Engine::draw()
{
window.beginDraw();
for(int i = 0; i < objectReleaseCount; i++)
window.draw(objects[i].shape);
window.endDraw();
}
bool Engine::isRunning() const
{
return window.isOpen();
}
void Engine::generateObjects(int objectsCount)
{
for(int i = 0; i < objectsCount; i++)
{
Sphere object;
object.radius = 40.0;
object.color.red = 255;
object.color.green = 150;
object.color.blue = 0;
object.color.opacity = 255;
objects.push_back(object);
}
}
void Engine::releaseObject(float dt)
{
totalTime += dt;
if(totalTime == releaseTime)
if(objectReleaseCount < totalObjects)
{
objectReleaseCount++;
totalTime = 0;
}
}
void Engine::applyGravity()
{
for(int i = 0; i < objectReleaseCount; i++)
objects[i].accelerate(gravity);
}
void Engine::applyConstraint()
{
for(int i = 0; i < objectReleaseCount; i++)
{
sf::Vector2f position = objects[i].position.current;
sf::Vector2f size(objects[i].radius * 2, objects[i].radius * 2);
// Left border
if (position.x - size.x < 0)
position.x = size.x;
// Right border
if (position.x + size.x > window.screenWidth)
position.x = window.screenWidth - size.x;
// Top border
if (position.y - size.y < 0)
position.y = -size.y;
// Bottom border
if (position.y + size.y > window.screenHeight)
position.y = window.screenHeight - size.y;
objects[i].position.current = position;
}
}
Код: Выделить всё
engine.hpp:
#ifndef ENGINE_HPP
#define ENGINE_HPP
#include
#include
#include "window.hpp"
#include "workingDirectory.hpp"
#include "sphere.hpp"
class Engine
{
public:
Engine();
void update(float dt);
void draw();
bool isRunning() const;
void generateObjects(int count);
void releaseObject(float dt);
void applyGravity();
void applyConstraint();
private:
Window window;
WorkingDirectory workingDir;
std::vector objects;
sf::Vector2f gravity = {-1.0f, 1.0f};
int objectReleaseCount = 1;
int totalObjects = 2;
float totalTime = 0;
float releaseTime = 40.0f;
};
#endif
Код: Выделить всё
sphere.cpp:
#include "../../include/sphere.hpp"
Sphere::Sphere()
{
shape.setRadius(radius);
shape.setFillColor(sf::Color(color.red,
color.green,
color.blue,
color.opacity));
setInitialPosition(position.initial);
}
void Sphere::updatePosition(float dt)
{
velocity = position.current - position.previous;
position.previous = position.current;
position.current = position.current + velocity + acceleration * dt * dt;
shape.setPosition(position.current);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78240903/sfml-draw-not-drawing-first-object-shape[/url]
1711844853
Anonymous
Я создаю движок физического моделирования на C++ и SFML. Я столкнулся с проблемами, когда я хочу нарисовать вектор объектов, но метод Draw не рисует первый объект из вектора. Если я хочу нарисовать следующие объекты, все работает нормально. Были ли у кого-нибудь еще подобные проблемы? [code]main.cpp: #include "../include/engine.hpp" int main() { auto engine = new Engine(); while(engine->isRunning()) { engine->update(0.25f); engine->draw(); } } [/code] [code]engine.cpp: #include "../../include/engine.hpp" Engine::Engine() : window("Collision Engine") { generateObjects(totalObjects); } void Engine::update(float dt) { window.update(); releaseObject(dt); applyConstraint(); applyGravity(); for(int i = 0; i < objectReleaseCount; i++) objects[i].updatePosition(dt); } void Engine::draw() { window.beginDraw(); for(int i = 0; i < objectReleaseCount; i++) window.draw(objects[i].shape); window.endDraw(); } bool Engine::isRunning() const { return window.isOpen(); } void Engine::generateObjects(int objectsCount) { for(int i = 0; i < objectsCount; i++) { Sphere object; object.radius = 40.0; object.color.red = 255; object.color.green = 150; object.color.blue = 0; object.color.opacity = 255; objects.push_back(object); } } void Engine::releaseObject(float dt) { totalTime += dt; if(totalTime == releaseTime) if(objectReleaseCount < totalObjects) { objectReleaseCount++; totalTime = 0; } } void Engine::applyGravity() { for(int i = 0; i < objectReleaseCount; i++) objects[i].accelerate(gravity); } void Engine::applyConstraint() { for(int i = 0; i < objectReleaseCount; i++) { sf::Vector2f position = objects[i].position.current; sf::Vector2f size(objects[i].radius * 2, objects[i].radius * 2); // Left border if (position.x - size.x < 0) position.x = size.x; // Right border if (position.x + size.x > window.screenWidth) position.x = window.screenWidth - size.x; // Top border if (position.y - size.y < 0) position.y = -size.y; // Bottom border if (position.y + size.y > window.screenHeight) position.y = window.screenHeight - size.y; objects[i].position.current = position; } } [/code] [code]engine.hpp: #ifndef ENGINE_HPP #define ENGINE_HPP #include #include #include "window.hpp" #include "workingDirectory.hpp" #include "sphere.hpp" class Engine { public: Engine(); void update(float dt); void draw(); bool isRunning() const; void generateObjects(int count); void releaseObject(float dt); void applyGravity(); void applyConstraint(); private: Window window; WorkingDirectory workingDir; std::vector objects; sf::Vector2f gravity = {-1.0f, 1.0f}; int objectReleaseCount = 1; int totalObjects = 2; float totalTime = 0; float releaseTime = 40.0f; }; #endif [/code] [code]sphere.cpp: #include "../../include/sphere.hpp" Sphere::Sphere() { shape.setRadius(radius); shape.setFillColor(sf::Color(color.red, color.green, color.blue, color.opacity)); setInitialPosition(position.initial); } void Sphere::updatePosition(float dt) { velocity = position.current - position.previous; position.previous = position.current; position.current = position.current + velocity + acceleration * dt * dt; shape.setPosition(position.current); std::cout Подробнее здесь: [url]https://stackoverflow.com/questions/78240903/sfml-draw-not-drawing-first-object-shape[/url]