• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML ustawianie tekstury

42 Warsaw Coding Academy
0 głosów
960 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez NewUser1 Nowicjusz (210 p.)

#include "headers.h"



sf::RectangleShape setSquareGround(int x, int y) {
    
    sf::Texture texture;
    texture.create(x, y);
    if(!texture.loadFromFile("Ground.png")) {
        std::cout<<"File not found";
    }
    else
        std::cout<<1;
    
    
    sf::RectangleShape rectangle(sf::Vector2f(x, y));
    
    rectangle.setTexture(&texture); 
    
    
    return rectangle;
    
}

Tekstura z pliku zostaje wczytana, prostokąt nadal jest biały. Dlaczego tak się dzieje? :(

2 odpowiedzi

+1 głos
odpowiedź 5 stycznia 2019 przez RafalS VIP (122,820 p.)
wybrane 5 stycznia 2019 przez NewUser1
 
Najlepsza
Prawdopodobnie dlatego, że texture to zmienna lokalna w funkcji, która przestaje istnieć po wyjscu z tej funkcji. Zwrócony rectangle ma zatem wskaźnik do obiektu który przestał istnieć.
komentarz 5 stycznia 2019 przez NewUser1 Nowicjusz (210 p.)
Czyli muszę tekstury inicjalizowac globalnie, czy to brzydko?
komentarz 5 stycznia 2019 przez RafalS VIP (122,820 p.)
Nie koniecznie globalnie, ale tak żeby zmienna żyła dopóki jest potrzebna.

Pewnie najlepiej dynamiczna alokacja, ale nie wiem jakie są praktyki dla tekstur w sfml.
0 głosów
odpowiedź 5 stycznia 2019 przez NewUser1 Nowicjusz (210 p.)
//Ground.h klasa

#include "headers.h"


class Ground {
public:
 const std::string GROUND_TEXTURE_PATH = "Ground.png";
 void setWidth(int inWidth); //ustaw wysokość
 void setHeight(int inHeight); //ustaw szerokosc
 void printGround(int inWidth, int inHeight, std::string inTexture);
 sf::RectangleShape rectangle;
 
private:
    //tekstura
     sf::Texture texture;
    //shape
     
     
     int width = 600;
     int height = 800;
     
     void loadTexture(std::string path); //pobierz i ustaw teksture
   
     void setSquareGround();   //stworz ksztalt i ustaw teksture
     
     
     
};

 

 

 

 

 


#include "headers.h"
#include "Ground.h"



void Ground::loadTexture(std::string path) {
    sf::Texture texture;
    texture.create(this->width, this->height);
    if(!texture.loadFromFile(path)) {
        std::cout<<"file not found";
    }
    else
        std::cout<<1;
    
    
}
void Ground::setWidth(int inWidth){
    
    this->width=inWidth;
    
}
void Ground::setHeight(int inHeight){
    
    this->height=inHeight;
    
}

void Ground::setSquareGround() {
    
    
     
    this->rectangle.setSize(sf::Vector2f(this->height, this->width));
    this->rectangle.setTexture(&this->texture);
    //this->rectangle.setTextureRect(sf::IntRect(10, 10, 100, 100));
    
       
    
}

void Ground::printGround(int inWidth, int inHeight, std::string inTexture) {
    
    loadTexture(inTexture);
    setWidth(inWidth);
    setHeight(inHeight);
    setSquareGround();
    
}

 

main:

        Ground floor;
        
        floor.printGround(600, 800, "Ground.png");
        window.draw(floor.rectangle);
   
            
        
        window.display();

 

Nadal shape wyświetla się bez tekstury. Co robię nie tak :/

komentarz 5 stycznia 2019 przez NewUser1 Nowicjusz (210 p.)
Znalazłem błąd w metodzie loadTexture

Podobne pytania

0 głosów
1 odpowiedź 551 wizyt
pytanie zadane 28 lipca 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 20 marca 2020 w C i C++ przez Kondz10 Początkujący (270 p.)
0 głosów
1 odpowiedź 241 wizyt

93,382 zapytań

142,381 odpowiedzi

322,539 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...