SFML draw() не рисует первую форму объектаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 SFML draw() не рисует первую форму объекта

Сообщение Anonymous »

Я создаю движок физического моделирования на 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»