C++;SFML 2.2图形未渲染 我只是玩C++的SFML,我不明白为什么我的代码不起作用。我想做的是画,比如说5个,窗口中的正方形,用矢量随机放置在屏幕周围,但我不明白为什么它不起作用。它也不会给出任何错误,我可以像正常一样打开游戏,但它只是不渲染

C++;SFML 2.2图形未渲染 我只是玩C++的SFML,我不明白为什么我的代码不起作用。我想做的是画,比如说5个,窗口中的正方形,用矢量随机放置在屏幕周围,但我不明白为什么它不起作用。它也不会给出任何错误,我可以像正常一样打开游戏,但它只是不渲染,c++,sfml,C++,Sfml,这是主要的游戏类: #include "main_game.h" #include "main_menu.h" void main_game::Initialize(sf::RenderWindow* window) { this->Player = new player(); this->Player->setOrigin(this->Player->getGlobalBounds().width / 2, this->Player->

这是主要的游戏类:

#include "main_game.h"
#include "main_menu.h"

void main_game::Initialize(sf::RenderWindow* window)
{
    this->Player = new player();
    this->Player->setOrigin(this->Player->getGlobalBounds().width / 2, this->Player->getGlobalBounds().height / 2);

    this->TestObject = new testObject();
    this->TestObject->Initialize();
    this->TestObject->setOrigin(this->TestObject->getGlobalBounds().width / 2, this->TestObject->getGlobalBounds().height / 2);
}

void main_game::Update(sf::RenderWindow* window)
{
    this->Player->setPosition(sf::Mouse::getPosition(*window).x, sf::Mouse::getPosition(*window).y);
    this->Player->Update();

    if (this->Player->CheckCollision(TestObject))
    {
        this->TestObject->setColor(sf::Color::Red);
    }
    else
    {
        this->TestObject->setColor(sf::Color::Cyan);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape))
    {
        coreState.SetState(new main_menu());
    }
}

void main_game::Render(sf::RenderWindow* window, std::vector<sf::Sprite> sprites)
{
    this->TestObject->Render(*window, sprites);

    window->draw(*this->Player);
}

void main_game::Destroy(sf::RenderWindow* window)
{
    delete this->Player;
    delete this->TestObject;
}
#包括“main_game.h”
#包括“main_menu.h”
void main_game::初始化(sf::RenderWindow*窗口)
{
此->玩家=新玩家();
this->Player->setOrigin(this->Player->getGlobalBounds().width/2,this->Player->getGlobalBounds().height/2);
此->TestObject=新的TestObject();
这->测试对象->初始化();
this->TestObject->setOrigin(this->TestObject->getGlobalBounds().width/2,this->TestObject->getGlobalBounds().height/2);
}
无效主游戏::更新(sf::RenderWindow*窗口)
{
这个->播放器->设置位置(sf::Mouse::getPosition(*window).x,sf::Mouse::getPosition(*window.y);
此->播放器->更新();
如果(此->播放器->检查碰撞(TestObject))
{
这->测试对象->设置颜色(sf::Color::Red);
}
其他的
{
这->测试对象->设置颜色(sf::Color::Cyan);
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape))
{
SetState(新的主菜单());
}
}
void main_game::Render(sf::RenderWindow*窗口,std::向量精灵)
{
此->测试对象->渲染(*窗口,精灵);
窗口->绘制(*此->玩家);
}
void main_game::Destroy(sf::RenderWindow*窗口)
{
删除此->播放器;
删除此->测试对象;
}
这是testObject.h类

#pragma once

#include "entity.h"

class testObject : public Entity
{
public:
    testObject();
    void Initialize();
    void Render(sf::RenderWindow &window, std::vector<sf::Sprite> sprites);
    void Update();
private:
    sf::RenderWindow window;
};
#pragma一次
#包括“实体h”
类testObject:公共实体
{
公众:
testObject();
void初始化();
无效渲染(sf::RenderWindow&window,std::vector精灵);
无效更新();
私人:
sf::RenderWindow窗口;
};
这是testObject.cpp类

#include "testObject.h"

testObject::testObject()
{
    this->Load("testObject.png");
}

void testObject::Initialize()
{
    sf::Texture testObjectTexture;
    sf::Sprite testObjectSprite;

    testObjectTexture.loadFromFile("testObject.png");
    testObjectSprite.setTexture(testObjectTexture);

    std::vector<sf::Sprite> sprites(5, sf::Sprite(testObjectSprite));

    srand(time(0));

    for (unsigned int i = 0; i < sprites.size(); i++)
    {
        sprites[i].setPosition(1 + (rand() % 1024 - 32), rand() % 640 - 32);
    }
}

void testObject::Render(sf::RenderWindow &window, std::vector<sf::Sprite> sprites)
{
    for (unsigned int i = 0; i < sprites.size(); i++)
    {
        window.draw(sprites[i]);
    }
}

void testObject::Update()
{
    Entity::Update();
}
#包括“testObject.h”
testObject::testObject()
{
这个->加载(“testObject.png”);
}
void testObject::Initialize()
{
sf::纹理testObjectTexture;
sf::Sprite testObjectSprite;
testObjectTexture.loadFromFile(“testObject.png”);
setTexture(testObjectTexture);
std::vector Sprite(5,sf::Sprite(testObjectSprite));
srand(时间(0));
for(无符号整数i=0;i
主要游戏h:

#pragma once

#include "game_state.h"
#include "player.h"
#include "testObject.h"

class main_game : public tiny_state
{
public:
    void Initialize(sf::RenderWindow* window);
    void Update(sf::RenderWindow* window);
    void Render(sf::RenderWindow* window, std::vector<sf::Sprite> sprites);
    void Destroy(sf::RenderWindow* window);
private:
    player* Player;
    testObject* TestObject;
};
#pragma一次
#包括“game_state.h”
#包括“player.h”
#包括“testObject.h”
类主游戏:公共小游戏状态
{
公众:
无效初始化(sf::RenderWindow*窗口);
无效更新(sf::RenderWindow*窗口);
无效渲染(sf::RenderWindow*窗口,std::矢量精灵);
无效销毁(sf::RenderWindow*窗口);
私人:
玩家*玩家;
testObject*testObject;
};

解决这个问题的一个简单方法是使用数组或任何其他数据结构来保存精灵,这些数据结构可以按副本存储,而不是按引用存储,而不是使用按引用存储的向量


问题有两个方面,不仅仅是范围问题,如果将渲染函数移动到初始化范围,您将在同一位置绘制精灵5次,因为向量中的每个元素都指向testObjectSprite的内存位置(同一位置)。

您是否已经使用调试器检查了此代码?如果没有,请先这样做,并报告您在问题中看到的特定异常。如果没有
main_game.h
来指导我们,很难弄清楚到底发生了什么。根据我的经验,我猜这是一个范围错误。我还添加了main_game.h。testObject::Initialize()中有一个明显的问题,您可以在其中创建一个局部纹理并将其指定给精灵。testObjectTexture将在初始化范围结束时被销毁,并且测试对象精灵将仅呈现为白色框。为纹理创建一个纹理管理器对象,以替代纹理。