2017-01-18 3 views
0

Я пытался исправить эту проблему около часа или более ... Но не нашел полезных ответов. Я пытаюсь разместить спрайт в центре окна, но он отображается на TOP_LEFT. Вот конструктор для моего класса и, как вы можете видеть, я разделив surface.width и surface.height на 2SFML Место Sprite по центру

Spaceship::Spaceship(sf::RenderWindow& game_window){ 
    auto surface = game_window.getSize(); 
    signed int ss_x = surface.x/2; 
    signed int ss_y = surface.y/2; 

    int ss_width = 128; 
    int ss_height = 128; 
    int ss_radius = ss_width/2; 
} 
    /////////////////////////////////////////// 
// For displaying the sprite on window // 
/////////////////////////////////////////// 
void Spaceship::drawsprite(sf::RenderWindow& game_window){ 
    sf::Texture ship; 
    if (!ship.loadFromFile(resourcePath() + "space-shuttle-64.png")) { 
     return EXIT_FAILURE; 
    } 
    sf::Sprite ss_sprite(ship); 
    ss_sprite.setPosition(ss_x, ss_y); 
    game_window.draw(ss_sprite); 
} 

Я также попытался с:

auto surface = game_window.RenderWindow::getSize(); 
    signed int ss_x = surface.x/2; 
    signed int ss_y = surface.y/2; 

, но это не помогло или.

UPDATE:

Я попытался напечатать переменные, которые определены внутри конструктора, и я получил 0 на всех из них. Поэтому мои проблемы, похоже, являются проблемой доступа. но не было никаких ошибок или предупреждений, которые мне это сказали.

UPDATE 2:

это заголовочный файл:

#ifndef Spaceship_hpp 
#define Spaceship_hpp 
#include <iostream> 
#include <SFML/Audio.hpp> 
#include <SFML/Graphics.hpp> 
#include <stdio.h> 

using namespace std; 

class Spaceship { 
public: 
    Spaceship(); 
    Spaceship(sf::RenderWindow&); 
    ~Spaceship(); 
    void moveship(char); 
    void drawsprite(sf::RenderWindow&); 

private: 
    signed int ss_x, ss_y; 
    unsigned int ss_speed; 
    int ss_width, ss_height, ss_radius; 

}; 

#endif /* Spaceship_hpp */ 
+0

Как вы описываете свой класс? В частности, задействованные переменные и ваш конструктор и ваш метод drawsprite. – ShadowMitia

+0

@ShadowMitia, обновленный вопрос. –

ответ

1

Вы не инициализация своих атрибутов в конструкторе правильно.

Spaceship::Spaceship(sf::RenderWindow& game_window){ 
    auto surface = sf::VideoMode::getDesktopMode(); 
    signed int ss_x = surface.width/2; 
    signed int ss_y = surface.height/2; 

    int ss_width = 128; 
    int ss_height = 128; 
    int ss_radius = ss_width/2; 
} 

должен быть

Spaceship::Spaceship(sf::RenderWindow& game_window){ 
    auto surface = sf::VideoMode::getDesktopMode(); 
    ss_x = surface.width/2; 
    ss_y = surface.height/2; 

    ss_width = 128; 
    ss_height = 128; 
    ss_radius = ss_width/2; 
} 

Объявление переменных в теле класса означает, что они видели во всем мире в классе, если вы переобъявить переменную в конструкторе, он возьмет на себя роль с глобальная переменная. Это называется переменная тень. Все изменения в переменной будут работать, но как только вы покинете область вашего конструктора/функции/метода, вы потеряете информацию, так как переменная вашего атрибута не была изменена.

Подробнее об областях: http://en.cppreference.com/w/cpp/language/scope

Подробнее о переменном затенении: https://en.wikipedia.org/wiki/Variable_shadowing?oldformat=true

+0

Большое вам спасибо: D Сегодня я узнал что-то новое! –

 Смежные вопросы

  • Нет связанных вопросов^_^