SFML draw() 未绘制第一个对象形状

问题描述 投票:0回答:1

我正在用 C++ 和 SFML 创建物理模拟引擎。我遇到了问题,我想绘制对象向量,但是绘制不会从向量中绘制第一个对象。如果我想绘制下一个对象,它工作得很好。还有其他人遇到类似问题吗?

main.cpp

#include "../include/engine.hpp"

int main()
{
    auto engine = new Engine();

    while(engine->isRunning())
    {
        engine->update(0.25f);
        engine->draw();
    }
}

引擎.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;
    }
} 

引擎.hpp


#ifndef ENGINE_HPP
#define ENGINE_HPP

#include <SFML/Graphics.hpp>
#include <math.h>

#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<Sphere> objects;

        sf::Vector2f gravity = {-1.0f, 1.0f};

        int objectReleaseCount = 1;  
        int totalObjects = 2;
        float totalTime = 0;
        float releaseTime = 40.0f;
}; 

#endif

球体.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 << "Position = x: " << position.current.x << "y: " << position.current.y << std::endl; 

    acceleration = {};
}

void Sphere::setInitialPosition(sf::Vector2f newPosition)
{
    position.current = position.initial;

    position.previous = newPosition;

    shape.setPosition(newPosition);
}

void Sphere::accelerate(sf::Vector2f acc)
{
    acceleration += acc;
}

球体.hpp


#ifndef SPHERE_HPP
#define SPHERE_HPP

#include <iostream>
#include <SFML/Graphics.hpp>
#include "window.hpp"

class Sphere
{
    public:
        Sphere();
        void updatePosition(float dt);
        void setInitialPosition(sf::Vector2f newPosition);
        void accelerate(sf::Vector2f acc);

        // Custom shape
        sf::CircleShape shape; 
        int radius;
        struct 
        {
            sf::Uint8 red = 255;
            sf::Uint8 green = 0;
            sf::Uint8 blue = 255;
            sf::Uint8 opacity = 255;
        } color;   

        struct 
        {
            sf::Vector2f initial {400.0f, 100.0f};
            sf::Vector2f current;
            sf::Vector2f previous;
        } position;

        sf::Vector2f velocity;

        sf::Vector2f acceleration;
};

#endif


我尝试在draw()函数中创建一个对象,它起作用了,但是当我想访问.hpp文件中声明的对象变量时它不起作用。

c++ sfml
1个回答
0
投票

@user4581301 关于将一些函数从generateObjects()移动到Sphere构造函数的解决方案解决了这个问题

© www.soinside.com 2019 - 2024. All rights reserved.