Код: Выделить всё
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]