Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zmienna bool o wartości... 19

Ostatnio zmodyfikowano 2013-01-26 12:32
Autor Wiadomość
mzg147
Temat założony przez niniejszego użytkownika
Zmienna bool o wartości... 19
» 2013-01-26 03:12:46
Witam. Próbuję zrobić prostą gierkę używając biblioteki Allegro 5(ale sam problem allegro nie dotyczy). Używam zmiennych logicznych które mówią czy kulka porusza się w danym kierunku. No ale z nimi mam problem. I to dość dziwny...

Wciskanie klawiszy mimo że dobrze ustawione nie działało. A kulka uciekała z ekranu własną ścieżką. To postanowiłem sprawdzić co tam kryje się za tymi boolami odpowiedzialnymi za kierunek. Nadmienię że powinny być one ustawione na false. I użyłem takiej funkcji:

al_draw_textf( font, al_map_rgb( 255, 255, 255 ), 100, 300, 0, "left:%d  right:%d   up:%d   down:%d", static_cast < int >( hero.left ), static_cast < int >( hero.right ), static_cast < int >( hero.up ), static_cast < int >( hero.down ) );

Działa ona jak zwykły printf. Tyle że wypisuje to na bitmapie. Po uruchomieniu, ukazał się oto taki napis:

left:0  right:0   up:19   down:0

Załamało mnie trochę. Niemożliwa rzecz. Nie wiedziałem co zrobić. Napisałem coś takiego:

if( up == true )
[funkcja wyżej]

Teraz informacje o zmiennych nie pojawiły się. Więc napisałem tak:

if( up == 19 )
[funkcja wyżej]

Voila! Pojawiły się. Chociaż nawet nie wiedziałem że boola da się porównać do 19...

Potem zrobiłem coś, co jeszcze bardziej mnie zadziwiło

C/C++
if( up == 19 ) al_draw_filled_circle( pos.x, pos.y, mass, al_map_rgb( 255, 0, 0 ) ); //rysowanie kółka


Kółko nie pojawiło się.
Za to z loga debuggera wynikało że zmienna left się włączyła. Nie wiadomo skąd. Nawet wcześniej była zero..
Wychodzi na to że owy "printf" powoduje że komputer zaczyna liczyć nonadecylarnie(?).

Usunąłem ten warunek, teraz sprawdziłem znowu, uruchomiłem program, nagle debugger pokazuje że wszystkie zmienne na true. Bez robienia zmian. Co to może być...

No i opisałem moją sytuację. Czy ktokolwiek spotkał się z czymś takim? Jeśli tak, to jest sposób jak na to zaradzić? Sam nie mam zielonego pojęcia, dlaczego się to robi, ale wiem że mimo tego iż w konstruktorze obiektu było jasno żeby wszystkie boole z góry były false, to kompilator nie chce się słuchać, i ustawia na true. Za pomoc z góry dziękuje.
P-75037
SeaMonster131
» 2013-01-26 11:43:59
false to 0, true to != 0. Dlatego bool może mieć wartość 19 (true).

ale wiem że mimo tego iż w konstruktorze obiektu było jasno żeby wszystkie boole z góry były false, to kompilator nie chce się słuchać, i ustawia na true.
Podaj kod.
P-75041
mzg147
Temat założony przez niniejszego użytkownika
» 2013-01-26 12:13:13
Konstruktor prosty jak budowa cepa:

C/C++
ball::ball( int x, int y, int s, int t )
    : velocity( s )
    , mass( t )
{
    pos.x = x;
    pos.y = y;
   
   
    bool right = false;
    bool up = false;
    bool down = false;
    bool left = false;
}

Zapomniałem wspomnieć o jednej rzeczy. Taki kod:

if( hero.up == 19 ) al_draw_textf( font, al_map_rgb( 0, 0, 0 ), 100, 300, 0, "up:%d", hero.up );

Pokazuje tekst. Ale taki już nie:

if( hero.up == true ) al_draw_textf( font, al_map_rgb( 0, 0, 0 ), 100, 300, 0, "up:%d", hero.up );

Więc według kompilatora 19 równa się false, ale kulka i tak ucieka do góry ekranu
P-75046
kubawal
» 2013-01-26 12:14:38
» KursyPorady dla użytkowników cpp0x.pl porady, wskazówki, zalecenia
P-75047
ison
» 2013-01-26 12:16:04
Konstruktor prosty jak budowa cepa
prosty, a i tak jest błąd ;)

C/C++
bool right = false;
bool up = false;
bool down = false;
bool left = false;
to nie ma sensu, tworzysz tylko tymczasowe zmienne
P-75048
mzg147
Temat założony przez niniejszego użytkownika
» 2013-01-26 12:32:21
Cóż, pokrywam się płaszczem wstydu po zrobieniu takiego błahego błędu. Dzięki za pomoc. Wprawdzie kulka nadal nie chodzi, ale to już sprawa eventów w allegro, więc spróbuje sam to zrobić.
P-75051
« 1 »
  Strona 1 z 1