bingo009 Temat założony przez niniejszego użytkownika |
[Allegro 5]Funkcja do przezroczystości w klasie, program wysypuje się. » 2012-09-02 20:19:26 Witam was serdecznie, mam sobie taką klase: class ENEMY { private: unsigned short int lives; ALLEGRO_BITMAP * bitmap; public: int x, y; ENEMY(); ~ENEMY(); void SubLive(); void DrawEnemy(); };
No i w konstruktorze ładuje sobie potrzebną bitmapę, oraz ustawiam zmienne. Chciałbym też zrobić przezroczystość dla bitmapy. Ale nie ważne czy jest w konstruktorze, czy w metodzie; wywołanie metody, która zawiera tą funkcję: al_convert_mask_to_alpha( bitmap, al_map_rgb( 255, 0, 255 ) );
powoduje wysypanie programu. Debugger wskazuje na plik dbgheap.c, a dokładniej na tą linijkę: void * pvBlk = _nh_malloc_dbg_impl( nSize, nhFlag, nBlockUse, szFileName, nLine, & errno_tmp );
O co tu chodzi? Tu jest cały kod konstruktora: ENEMY::ENEMY() { bitmap = al_load_bitmap( "Data/enemy.bmp" ); if( !bitmap ) fprintf( stderr, "Failed to load enemy bitmap!\n" ); al_convert_mask_to_alpha( bitmap, al_map_rgb( 255, 0, 255 ) ); lives = 3; x = 0; y = 0; }
|
|
RazzorFlame |
» 2012-09-02 20:25:52 Jest możliwość że nie wczytuje obrazka. Nie wiem jak to jest w Allegro 5 ale myśle że powinieneś zrobić że kiedy POPRAWNIE zostanie wczytany obraz, wtedy dopiero dajesz ta maske
Edit: Sory za offtop ale odnośnie poprzedniego tematu: Znalazłeś rozwiązanie? Jeśli nie to otwórz temat i pogadamy dalej... Nie ma sensu żebyś go zamykał jeśli jeszcze nie znalazłeś rozwiązania. Sory że wtedy tak napisałem ale poprostu mógłbyś powiedzieć dokładnie w czym problem bo samo sprawdzenie czy obiekt jest w środku innego obiektu jest proste. Hehe z pół roku temu na tym forum pojawił się post "Jak zrobić minecraft" XD |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2012-09-02 20:29:30 No fakt, nie pomyślałem o tym. Faktycznie bitmapa enemy miała inną nazwę, niż ta w kodzie. Ale jak sie zabezpieczyć przed ponownymi sytuacjami. Normalnie dałbym return -1, ale w klasie to raczej nie działa? |
|
RazzorFlame |
» 2012-09-02 20:31:09 Działa działa. Poprostu zrób sobie w normalnej funkcji te ładowanie i tą maske a później w konstruktorze ją wywołaj.
Edit: O właśnie. Jesli korzystasz z Code::Blocks to nie będzie ci wyświetlało tekstu związanego z błędem jeśli masz ustawione GUI application |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2012-09-02 20:38:34 Korzystam z Visual Studio 2010, ale pomysł z oddzielną funkcją mi się podoba. Tylko przydałoby się jeszcze niszczyć tworzony obiekt, jeżeli nie udało się załadować zasobów. Jak to zrobić z poziomu klasy? |
|
RazzorFlame |
» 2012-09-02 20:41:18 Hmm przyznam zgasiłeś mnie. Może spróbuj wywołać destruktor w tej funkcji ale nie sądze by to było możliwe. Nigdy czegoś takiego nie zrobiłem. Właśnie przeczytaj moj post (edit z drugiego) jeśli jeszcze nie przeczytałeś. Poszukam coś w google może znajde.
Edit: Myśle że dynamiczne elementy klasy byłyby rozwiązaniem ale nie jestem pewien |
|
waxx |
» 2012-09-02 20:45:10 obiekty i tak powinny byc wskaznikami [skrot myslowy-rob je dynamicznie], mozesz zrobic funkcje create ktora thrownie wyjatek / albo po prostu zwroci boola i najwyzej uzyc delete...ale to i tak tbh niewazne bo jak ci sie wysypie przy inicie to i tak konczysz gre z pieknym error msg-em. |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2012-09-02 20:46:33 Czytałem, ale mi chodzi o to, że jak użytkownik zmieni sobie bitmape, to wtedy program najzwyczajniej w życiu się wysypie, a mi zależy na tym, aby dać ładny komunikat. Te wyświetlanie na konsoli jest narazie dla testów, jak ukończe gre, to dam jakieś ładne dialogi.
Edit: A tak się cieszyłem, ze wkońcu zrozumiałem ideę programowania obiektowego, a tu taka przeszkoda... Zależy mi, aby wydana gra była dopięta na ostatni guzik, więc raczej dziwaczny, niezrozumiały dla szarego usera błąd, który nic nie mówi, raczej nie wchodzi w grę. |
|
« 1 » 2 |