Bartekko Temat założony przez niniejszego użytkownika |
Problem z if(){} // niewiadomo czemu automatycznie wysiada program » 2011-05-01 14:04:49 #include <ctime> #include <cstdlib> #include <allegro.h> #include <iostream> #include <fstream> #include <conio.h>
int mx = 0, my = 0, mb = 0; void myszka() { if( mx != mouse_x | my != mouse_y | mb != mouse_b ) { mx = mouse_x; my = mouse_y; mb = mouse_b; } }; int main() { std::cout << "Uruchamianie Programu" << std::endl; srand( time( NULL ) ); std::cout << "ustalono rand na czas" << std::endl << "uruchamianie interfejsu graficznego"; allegro_init(); install_keyboard(); install_mouse(); BITMAP * menu = NULL; menu = load_bmp( "pliki/main.bmp", default_palette ); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT, 1280, 1024, 0, 0 ); clear_to_color( screen, makecol( 10, 10, 10 ) ); BITMAP * car = NULL; BITMAP * closed = NULL; BITMAP * logo = NULL; BITMAP * koza = NULL; koza = load_bmp( "pliki/koza.bmp", default_palette ); car = load_bmp( "pliki/car.bmp", default_palette ); closed = load_bmp( "pliki/closed.bmp", default_palette ); logo = load_bmp( "pliki/trol.bmp", default_palette ); if( !koza |!car |!closed |!logo |!menu ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nosz kurde, nie ma obrazka: albo masz za malo pamiêci, albo nie ma któregos obrazka w folderze /pliki/" ); allegro_exit(); return 0; } clear_to_color( screen, makecol( 255, 255, 255 ) ); blit( logo, screen, 0, 0, 256, 256, logo->w, logo->h ); rest( 2500 ); destroy_bitmap( logo ); meni: blit( menu, screen, 0, 0, 0, 0, menu->w, menu->h ); show_mouse( screen ); unscare_mouse(); myszka(); while( mouse_b != 1 ) { myszka(); } if( mx < 420 ) { goto meni; } if( mx < 857 && mx > 420 ) { int iloscdrzwi = 0, iloscprob = 0; clear_to_color( screen, makecol( 256, 256, 0 ) ); BITMAP * men2 = NULL; men2 = load_bmp( "pliki/menu2.bmp", default_palette ); blit( men2, screen, 0, 0, 0, 0, men2->w, men2->h ); rest( 1000 ); while( true ) { myszka(); if( mouse_b = 1 && mx > 940 && my > 770 ) { goto meni; } } if( mx > 857 && mx < 1024 ) { return 0; } } destroy_bitmap( car ); destroy_bitmap( koza ); destroy_bitmap( menu ); destroy_bitmap( closed ); } END_OF_MAIN();
Problem leży w tym, że w linii oznaczonej BŁĄD zamiast wychodzić do menu po najechaniu na odpowiedni obszar i kliknięciu wychodzi z programu bez kliknięcia( po najechaniu na obszar) Pytanie: czy problem leży w funkcji myszka(); czy w instrukcji goto meni; ? jak go naprawić |
|
kamillo121 |
» 2011-05-01 14:16:08 1. Zajrzyj do kursu STC i zobacz jak dodawać kod cpp na forum. 2. W innym temacie pisałeś o goto, było kilka powodów dla których się nie używa tego w pewnych przypadkach a mimo to używasz tego, jaki z tego morał ? kompletnie nie przywiązujesz wagi do tego co ktoś pisze więc się nie dziw, że teraz masz problemy... 3. if( mx != mouse_x | my != mouse_y | mb != mouse_b )
Jeżeli w tym miejscu chodziło ci o wyrażenie OR to powinno być tak: if( mx != mouse_x || my != mouse_y || mb != mouse_b )
Podobna sytuacja tutaj: if( !koza |!car |!closed |!logo |!menu )
4. Nazwij poprawnie temat |
|
Bartekko Temat założony przez niniejszego użytkownika |
» 2011-05-01 14:33:26 do mometnu napisania tematu w poprzednim nikt nie odpowiedział co w praktyce może się stać, a tylko coś o słabym działaniu kodu i problemach w odczytywaniu przez programistę (dodam, że pokazuje się menu, ale wypirnicza program po 0.2 sekundy Edit: Spróbuję inaczej... |
|
ison |
» 2011-05-01 15:36:06 to właśnie masz odpowiedź dlaczego nie używa się goto, bo nikomu nie będzie się chciało odszyfrowywać Twojego kodu i Ci pomagać ;) |
|
yyy...mleko |
» 2011-05-02 01:20:55 ykhm chyba mam przykład jak WIELCY PROGRAMIŚCI :D nie przywiązują wagi do błahostek, bo podstawowy błąd jaki mi się rzuca w oczy w linijce if( mouse_b = 1 && mx > 940 && my > 770 ) { goto meni; , to zły operator równości nie powinno być czasem mouse_b == 1 ??? :) |
|
absflg |
» 2011-05-02 08:33:27 ( mx != mouse_x | my != mouse_y | mb != mouse_b ) ( mx != mouse_x || my != mouse_y || mb != mouse_b )
Zadziała dokładnie tak samo...
Nie znam niestety tej biblioteki, ale wydaje mi się to osobliwe: jeżeli mouse_* to zmienne to na co ci w ogóle ta funkcja myszka()? Przecież możesz kontrolować równie dobrze oryginały.
Szybki rzut w Google mówi mi, że źle korzystasz ze zmiennej mouse_b. Powinieneś użyć maski wybranego przycisku/ów twoje mouse_b != 1 będzie spełnione gdy będzie wciśnięta kombinacja klawiszy inna niż wciśnięcie tylko klawisza 1. Zerknij w dokumentację.
Kolejne do czego się można przyczepić, to że etykieta nie jest wyróżniona, zwykle jej nazwa jest pisana wielkimi literami i ma jedną tabulację mniej niż blok, w którym się znajduje.
Oczywiście to szczegół natury estetycznej i na program nie wpłynie. To, że użycie goto jest w tym programie nieuzasadnione to już inna sprawa...
ALE DO SEDNA:
A tu chyba znalazłem problem prawdziwy problem makecol( 256, 256, 0 ) obawiam się, że w RGB natężenie barw podstawowych reprezentuje się liczbą z zakresu 0-255.
Ogarnij ten kod i wymień goto na funkcję i pętlę. I byłoby miło, gdybyś powstawiał trochę komentarzy dot. działania jak chcesz, żeby ktoś kto nie jest tobą to przeglądał. |
|
pekfos |
» 2011-05-02 11:09:06 Zadziała dokładnie tak samo... |
jesteś tego pewien? |
|
absflg |
» 2011-05-02 12:50:25 Ah no tak, nie ta kolejność działań. No to jeszcze nawiasy by się przydały :P |
|
« 1 » 2 |