【问题标题】:Not displaying Sprite created with class不显示使用类创建的 Sprite
【发布时间】:2017-01-04 18:13:45
【问题描述】:

我在我的 Pickup.h 中为我的皮卡创建了一个类。 这将是:

class Pickup
{
private:
    Sprite m_Sprite;
    int m_Value;
    int m_Type;
public:
Pickup (int type)
{
    m_Type = type;
    if (m_Type == 1)
    {
        Sprite m_Sprite;
        Texture health;
        health.loadFromFile("health.png");
        m_Sprite.setTexture(health);
    }
    else ...

}
void spawn()
{
    srand((int)time(0) / m_Type);
    int x = (rand() % 1366);
    srand((int)time(0) * m_Type);
    int y = (rand() % 768);
    m_Sprite.setPosition(x, y);
}
Sprite getSprite()
{
    return m_Sprite;
}
};

如果我尝试在屏幕上绘制使用此类创建的 Sprite,使用

Pickup healthPickup(1);
healthPickup.spawn();

在进入游戏循环之前,在游戏循环里面放

    mainScreen.draw(healthPickup.getSprite());

我从来没有在屏幕上看到那个 Sprite。我尝试使用

制作另一个 Sprite
Sprite m_Sprite2;
Texture health2;
health2.loadFromFile("health.png");
m_Sprite2.setTexture(health2);
m_Sprite2.setPosition(healthPickup.getSprite().getPosition().x, healthPickup.getSprite().getPosition().y);

如果我尝试在游戏循环中显示它,一切正常。我的问题是:为什么这不适用于我创建的课程?

【问题讨论】:

  • nvm 看看你的构造函数,你正在创建一个名为 m_sprite 的精灵,而不是仅仅设置你的 m_sprite。

标签: c++ sfml


【解决方案1】:

来自构造函数:

Pickup (int type)
{
    m_Type = type;
    if (m_Type == 1)
    {
        Sprite m_Sprite;
        ...

在这里定义一个与成员变量同名的局部变量。这会创建一个局部变量,该变量将超出范围并被破坏。

构造函数未初始化成员变量。


正确地解决你的问题,你需要做两个改变:第一个是构造成员变量m_Sprite。二是不定义局部变量。

类似这样的:

Pickup (int type)
    : m_Sprite()    // Constructor initializer list, default-constructs the m_Sprite member
{
    m_Type = type;
    if (m_Type == 1)
    {
        // Don't define a local variable m_Sprite
        Texture health;
        health.loadFromFile("health.png");
        m_Sprite.setTexture(health);
    }
    ...
}

【讨论】:

    【解决方案2】:

    你的代码应该是:

    class Pickup
    {
    private:
        Sprite m_Sprite;
        int m_Value;
        int m_Type;
    public:
    Pickup (int type)
    {
        m_Type = type;
        if (m_Type == 1)
        {
            Texture health; // removed the declaration of m_Sprite that was here.
            health.loadFromFile("health.png");
            m_Sprite.setTexture(health);
        }
        else ...
    
    }
    void spawn()
    {
        srand((int)time(0) / m_Type);
        int x = (rand() % 1366);
        srand((int)time(0) * m_Type);
        int y = (rand() % 768);
        m_Sprite.setPosition(x, y);
    }
    Sprite getSprite()
    {
        return m_Sprite;
    }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多