2017-01-04 4 views
0

Я создал класс для своих пикапов в своем Pickup.h. Это было бы:Не показывать Sprite, созданный с помощью класса

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

Если я пытаюсь рисовать на экране спрайт, созданный с этим классом, используя

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

перед входом в игровой цикл, и внутри игрового цикла, чтобы положить

mainScreen.draw(healthPickup.getSprite()); 

Я никогда не увижу этот спрайт на экране. Я попытался сделать еще один спрайт, используя

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

, и если я попытаюсь отобразить его в игровом цикле, все будет хорошо. Мой вопрос: почему это не работает с моим созданным классом?

+1

NVM взгляд на конструкторе, вы создаете спрайт с именем m_sprite вместо того, чтобы просто установив свой m_sprite. – Eddge

ответ

1

Ваш код должен быть:

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

Из конструктора:

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); 
    } 
    ... 
} 
Смежные вопросы