【问题标题】:C++ SFML 2.2 graphics not renderingC++ SFML 2.2 图形不渲染
【发布时间】:2015-06-08 17:22:20
【问题描述】:

我只是在玩 C++ SFML 的东西,我有点不明白为什么我的代码不起作用。我想做的事情是像 5 一样绘制,Window 中的正方形使用矢量随机放置在屏幕周围,但我不明白为什么它不起作用。而且它也没有任何错误,我可以正常打开游戏,但它只是没有渲染。

这是主要的游戏类:

#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;
}

这是 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;
};

这是 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();
}

main_game.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;
};

【问题讨论】:

  • 您是否已经使用调试器检查过这段代码?如果没有,请先这样做,然后报告您在问题中看到的特定异常情况。
  • 如果没有main_game.h 的指导,我们很难弄清楚到底发生了什么。根据我的经验,我猜这是范围错误。
  • 我也添加了 main_game.h。
  • testObject::Initialize() 中存在一个明显的问题,您可以在其中创建本地纹理并将其分配给您的精灵。 testObjectTexture 将在 Initialize 范围结束时被破坏,并且测试对象精灵只会呈现为白框。为您的纹理创建一个纹理管理器对象。

标签: c++ sfml


【解决方案1】:

一个简单的解决方法是简单地使用一个数组或任何其他可以通过复制存储而不是通过引用存储而不是通过引用存储的向量来保存精灵的数据结构。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多