Warsztat - Programowanie gier

Lipiec 30, 2010, 17:38:12 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: [c++;SFML] Problem (chyba) ze wskaźnikiem.  (Przeczytany 162 razy)
Juan
Newbie
*

wiadomości: 22


Zobacz profil
« : Marzec 11, 2010, 17:46:27 »

Witajcie, tworzę prosty Map Edytor do swojej gry. Niestety, utknąłem już na przycisku. Przycisku, który po na jego najechaniu, ma się półtora razy powiększyć. Zacząłem od stworzenia swojej klasy, w niej mam (całego kodu nie opłaca się wysyłać, ale jeżeli będzie taka potrzeba, to proszę napisać):
Kod:
sf::Sprite *Outlook,Firstoutlook, Secondoutlook;
Uzupełniam dwie ostatnie zmienne, tak:
Kod:
    sf::Image Picture;
    Picture.LoadFromFile(adres);

    Firstoutlook.SetImage(Picture);
    Secondoutlook=Firstoutlook;
    Secondoutlook.Scale(1.5f,1.5f);
Następnie zależnie od sytuacji, wskaźnik nakierowuje na dany obiekt:
Kod:
Outlook=&Firstoutlook;
// bądź Outlook=&Secondoutlook;
Nadchodzi wielka chwila, chcę owy przycisk narysować. Kompilator nie protestuje. Jest, udało się.. ale.. Zamiast obiecanej grafiki dostałem kawałek białego koloru. Któż wie dlaczego? Rysuję tak:
Kod:
App.Draw(*FirstButton.Outlook);
Zapisane
dannte
Jr. Member
**

wiadomości: 90


Zobacz profil
« Odpowiedz #1 : Marzec 11, 2010, 18:48:31 »

Kod:
    sf::Image Picture;
    Picture.LoadFromFile(adres);

    Firstoutlook.SetImage(Picture);
    Secondoutlook=Firstoutlook;
    Secondoutlook.Scale(1.5f,1.5f);
Jak dla mnie to błąd popełniasz tutaj, bo nie wiesz czy klasa Sprite ma konstruktor kopiujący zdefiniowany, żeby kopiował obrazek (a z tego co widzę, to nie ma http://www.sfml-dev.org/documentation/1.4/classsf_1_1Sprite.htm).
Kod powienien wyglądać tak:
Kod:
    sf::Image Picture;
    Picture.LoadFromFile(adres);

    Firstoutlook.SetImage(Picture);
    Secondoutlook.SetImage(Picture);
    Secondoutlook.Scale(1.5f,1.5f);

Popraw i powiedz, czy zadziałało. Pozdro.
Zapisane
Wyszo
SuperHero Member
******

wiadomości: 1207


Zobacz profil
« Odpowiedz #2 : Marzec 11, 2010, 19:02:26 »

Nie jestem specem od SFMLa, ale klasa Sprite przechowuje tylko referencję wskaźnik na obrazek Image. Dzięki temu wiele Sprite'ów może korzystać z jednego Image'a bez multiplikowania danych obrazka. A to oznacza, że musi on istnieć nie tylko podczas tworzenia, ale również podczas rysowania. W Twoim przypadku obiekt tymczasowy Picture jest zapewne niszczony przed wyświetlaniem (pewnie w konstruktorze Twojego przycisku).
« Ostatnia zmiana: Marzec 11, 2010, 19:04:55 wysłane przez Wyszo » Zapisane

Większość ludzi drzemie w nocy. Ci, którzy śnią na jawie są niebezpieczni, bo ich determinacja może przekształcić marzenia w rzeczywistość...
Groshu
Sr. Member
****

wiadomości: 262



Zobacz profil
« Odpowiedz #3 : Marzec 11, 2010, 19:54:24 »

Wyszo ma rację. Najprościej jest zrobić tak:
Kod:
    sf::Image FirstLook;
    sf::Image SecondLook;
    FirstLook.LoadFromFile(adres);
    SecondLook.LoadFromFile(adres);
    sf::Sprite Outlook;

    Outlook.SetImage(FirstLook);
    // a w razie potrzeby
    Outlook.SetImage(SecondLook);

Masz tu ten komfort, że gdy zrobisz Scale() lub cokolwiek innego na Outlook to po zmianie obrazka przez SetImage() masz wszystkie właściwości zachowane, więc wszystko robisz tylko raz ;P Między innymi właśnie po to sf::Sprite jest zrobiony jako "opakowanie" dla sf::Image Grin

P.S. Fajnie, że w końcu ktoś się bawi SFML'em, bo początkujący programiści wciąż mają tendencję do używania archaicznego SDL'a Tongue

P.S.2 Wygrzebałem w źródłach, że Sprite przechowuje wskaźnik, a w zasadzie to sprytny wskaźnik
Kod:
ResourcePtr<Image> myImage;
« Ostatnia zmiana: Marzec 11, 2010, 20:07:14 wysłane przez Groshu » Zapisane

Umiejętności zawodowe:
- wieloletnie doświadczenie w administrowaniu kontem na nk Cheesy
Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC