Autor Wątek: Różnice pomiędzy windows i linux. Wyswietlanie w SFML i wskaźniki.  (Przeczytany 2613 razy)

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 06, 2015, 17:36:47
Robię grę na 2 platfromy: windows(mingw) i linux. I napotkałem problem. Ten kod działa pod linuxem, ale nie działa pod windowsem.
Shop::Shop(): shop_texts() {}
//...

void Shop::draw(App* app)
{
    app->window.draw(shop_texts.getText("btn_playerskins"));
}

shop_texts zwraca sf::Drawable object.
Później w App:

shop.draw(this);
Ten kod wyświetla wszystko poprawnie pod linuxem, ale nie wyświetla nic pod windowsem.
Za pomocą std::cout sprawdziłem czy istnieją obiekty w shop_texts, i normalnie zwracają mi wartości.
Jaka jest różnica w kodzie dla windowsa?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Luty 06, 2015, 17:40:24
Może tekstury ci się nie załadowały?

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 06, 2015, 17:43:50
Akurat to jest tekst, poza tym mam assets manager i w konsoli widzę co sie ładuje.

Offline Xirdus

  • Redaktor

# Luty 06, 2015, 19:54:41
Zdecydowanie za mało kodu dałeś żeby powiedzieć coś więcej. Pokaż konstruktor tego shop_texts i metodę getText().

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 06, 2015, 20:43:29
Oto kod:

shop_texts:
class TextManager
{
 public:
  TextManager();
//...
  ShakingText& getText(const std::string& text_id);
 private:
  std::map<std::string, ShakingText> texts;
};
Konstruktor:
TextManager::TextManager():
  texts()
{

}
getText:
ShakingText& TextManager::getText(const std::string& text_id)
{
  return texts.find(text_id)->second;
}

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

# Luty 06, 2015, 21:08:52
Czy budowanie czcionki opiera się o czcionkę w formacie ttf itp.? Bo w Windows czcionka musi być zainstalowana (do katalogu fonts), żeby aplikacje mogły jej używać. Taki miałem problem w Qt. Zamiast czcionek ttf znajdujących się w katalogu z aplikacją, najwygodniej było mi używać tych dostarczanych z systemem. Żeby stworzyć przenośną aplikację graficzną, najlepiej wygeneruj sobie literki w png i używaj ich przy rysowaniu tekstu.

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 06, 2015, 23:04:10
Akurat tekst w poprzednich wersjach gry działa. I jest wszystko ok. I nie musi być zainstalowana, to zależy od biblioteki jakiej używasz.
http://bitcoin-patys.rhcloud.com/download To ta gra. Poprzednie wersje działają jak należy, kolejna też jest gotowa, tylko pod windowsem nie chce działać. Może, gdzieś, coś nie jest w liście inicjalizacyjnej dopisane.

Jak konstruktor jakiegoś pola nie jest jawnie 'wywołany' np w liscie inicjalizacyjnej, to jest jest wywołany w momencie tworzenia obiektu, czy jest przypisywany mu null czy coś innego, czy to zależy od platformy(wtedy by może się zgadzało z moim problemem)?

Offline Xirdus

  • Redaktor

# Luty 06, 2015, 23:54:00
Jak konstruktor jakiegoś pola nie jest jawnie 'wywołany' np w liscie inicjalizacyjnej, to jest jest wywołany w momencie tworzenia obiektu, czy jest przypisywany mu null czy coś innego, czy to zależy od platformy(wtedy by może się zgadzało z moim problemem)?
Jeśli coś nie występuje na liście inicjalizacyjnej, to używany jest konstruktor domyślny - co dla typów prymitywnych oznacza brak inicjalizacji.

Nie podoba mi się ta metoda getText(). Co jak tekstu nie będzie w mapie?

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 07, 2015, 00:05:48
tak :D mam w TODO dopisane żeby dodać zabezpieczenie. Program wybucha jak nie ma jej.
Ale działa bo pod linuxem jest ok (kod mam w sumie ten sam).
A z cout pod win dostaje tekst wybrany ta metoda.

Offline Xirdus

  • Redaktor

# Luty 07, 2015, 09:03:23
Sprawdź sobie swój kod jakimś narzędziem SCA, np. Cppcheck. Jak są jakieś wiszące wskaźniki albo niezainicjalizowane zmienne to ci je powinien znaleźć.

Offline P@tyS

  • Użytkownik
    • Patys coding

# Luty 08, 2015, 15:17:01
Sprawdziłem, były 4 niezainicjalizowane niezwiazane z tym, poprawiłem. Może coś nie znalazło, albo przy dziedziczeniu coś pochrzaniłem z listami inicjalizującymi.
https://stackoverflow.com/questions/10950756/uninitialized-values-behave-as-expected-on-linux-but-not-windows znalazłem to i w miarę pasuje do mojego problemu. Może gdzieś coś się ukryło :(

Chyba po prostu od nowa przepisze ten kod.

Offline revo

  • Użytkownik

# Luty 08, 2015, 21:17:27
Możesz jeszcze spróbować uruchomić pod valgrindem i sprawdzić czy czegoś ciekawego nie wykryje.