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

[allegro] Problem z poruszaniem sie w menu za pomoca klawiatury

Ostatnio zmodyfikowano 2012-12-10 09:37
Autor Wiadomość
maksymiljan4
Temat założony przez niniejszego użytkownika
[allegro] Problem z poruszaniem sie w menu za pomoca klawiatury
» 2012-11-07 16:16:11
Witam wszystkich

Od jakiegos czasu zaiteresowalem sie tworzeniem gier w jezyku c++ i trafilem na ta strone.
Dzieki niej nauczylem sie w malym stopniu bibloteki allegro.
Piszac gre natrafilem na pewien problem, otoz gdy w moim menu sa trzy opcje: Nowa gra, Wczytaj gre, Wyjscie z gry
klikajac raz na klawisz S, przechodze odrazu do Wyjscie z gry a powinno najpeirw byc Wczytaj gre a potem po kolejnym wcisnieciu kalwisza S powinno byc wyjscie z gry jak mam to zrobic?
prosze o pomoc i z gory dziekuje.

oto moj tymczasowy kod:
C/C++
#include <allegro.h>

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 900, 650, 0, 0 );
   
    BITMAP * bufor1 = NULL;
   
    BITMAP * obrazek1 = NULL;
    BITMAP * obrazek2 = NULL;
    BITMAP * obrazek3 = NULL;
    BITMAP * obrazek4 = NULL;
   
    FONT * font1;
   
    font1 = load_font( "pap.pcx", NULL, NULL );
   
    obrazek1 = load_bmp( "nowa gra2.bmp", default_palette );
   
    bufor1 = create_bitmap( 900, 650 );
   
    int opcja1;
   
    int opcja2;
   
    int opcja3;
   
    while( !key[ KEY_DEL ] )
    {
       
        if( key[ KEY_SPACE ] )
        {
            blit( obrazek1, bufor1, 0, 0, 0, 0, obrazek1->w, obrazek1->h );
            textprintf_ex( bufor1, font1, 50, 50, makecol( 255, 255, 255 ), - 1, "     NOWA GRA" );
            textprintf_ex( bufor1, font1, 50, 100, makecol( 255, 255, 255 ), - 1, "     WCZYTAJ GRE" );
            textprintf_ex( bufor1, font1, 50, 150, makecol( 255, 255, 255 ), - 1, "     WYJSCIE Z GRY" );
        }
       
        if( key[ KEY_W ] )
        {
            blit( obrazek1, bufor1, 0, 0, 0, 0, obrazek1->w, obrazek1->h );
           
            textprintf_ex( bufor1, font1, 50, 50, makecol( 255, 255, 255 ), - 1, " --> NOWA GRA" );
            textprintf_ex( bufor1, font1, 50, 100, makecol( 255, 255, 255 ), - 1, "     WCZYTAJ GRE" );
            textprintf_ex( bufor1, font1, 50, 150, makecol( 255, 255, 255 ), - 1, "     WYJSCIE Z GRY" );
           
            opcja1 = 1;
        }
       
        if( opcja1 == 1 and key[ KEY_S ] )
        {
            blit( obrazek1, bufor1, 0, 0, 0, 0, obrazek1->w, obrazek1->h );
            textprintf_ex( bufor1, font1, 50, 50, makecol( 255, 255, 255 ), - 1, "     NOWA GRA" );
            textprintf_ex( bufor1, font1, 50, 100, makecol( 255, 255, 255 ), - 1, " --> WCZYTAJ GRE" );
            textprintf_ex( bufor1, font1, 50, 150, makecol( 255, 255, 255 ), - 1, "     WYJSCIE Z GRY" );
           
            opcja2 = 1;
           
        }
       
        if( opcja2 == 1 and key[ KEY_S ] )
        {
            blit( obrazek1, bufor1, 0, 0, 0, 0, obrazek1->w, obrazek1->h );
            textprintf_ex( bufor1, font1, 50, 50, makecol( 255, 255, 255 ), - 1, "     NOWA GRA" );
            textprintf_ex( bufor1, font1, 50, 100, makecol( 255, 255, 255 ), - 1, "    WCZYTAJ GRE" );
            textprintf_ex( bufor1, font1, 50, 150, makecol( 255, 255, 255 ), - 1, " --> WYJSCIE Z GRY" );
           
        }
       
       
       
        blit( bufor1, screen, 0, 0, 0, 0, 900, 650 );
    }
   
    destroy_bitmap( obrazek1 );
    destroy_bitmap( bufor1 );
    return 0;
}
END_OF_MAIN();
P-68715
DejaVu
» 2012-11-07 16:38:49
Hm... w zasadzie to źle się zabrałeś do robienia Menu. Powinieneś zrobić mniej więcej tak:
1. utwórz zmienną określającą pozycję od 1 do 3.
2. zwiększaj/zmniejszaj licznik określający zaznaczenie.
3. rysuj:
C/C++
if( opcja == 1 )
     rysujZaznaczonaOpcje1();
else
     rysujOpcje1();

if( opcja == 2 )
     rysujZaznaczonaOpcje1();
else
     rysujOpcje1();

if( opcja == 3 )
     rysujZaznaczonaOpcje1();
else
     rysujOpcje1();

To tylko pseudokod, no i da się to lepiej jeszcze zorganizować, ale kod przynajmniej dobrze pokazuje ideę organizacji rysowania Menu.
P-68716
maksymiljan4
Temat założony przez niniejszego użytkownika
» 2012-11-07 16:51:32
Dejavu moglbys mi to jakos bardziej wytlumaczyc, bo nie moge tego zrozumiec z ta zmienna okreslajaca pozycje i zmniejszaniem / zwiekszaniem licznika??
moze przykladowy kod by mi pomogl to zrozumiec..
P-68717
DejaVu
» 2012-11-07 16:53:50
C/C++
if( key[ KEY_W ] )
     opcja--;

if( key[ KEY_S ] )
     opcja++;

if( opcja < 1 )
     opcja = 1;

if( opcja > 3 )
     opcja = 3;


@up: u nas raczej dominuje polityka dać wędkę, a nie rybę. Oznacza to, że dajemy wskazówki, a nie rozwiązania.
P-68718
maksymiljan4
Temat założony przez niniejszego użytkownika
» 2012-11-07 17:02:57
To jakos zrozumialem

if( key[ KEY_W ] )
     opcja--;

if( key[ KEY_S ] )
     opcja++;

ale nie do konca rozumiem to

if( opcja < 1 )
     opcja = 1;

tutaj jest tak ze jesli opcja jest mniejsza od 1 to wtedy opcja wynosi 1

if( opcja > 3 )
     opcja = 3;

a tutaj jest tak ze jesli opcja jest wieksza od 3 to wtedy opcja wynosi 3

tylko co to jest ta opcja = 1
i co to jest ta opcja = 3

ze maja taka wartosc czy jak??
P-68719
DejaVu
» 2012-11-07 17:05:46
Jeżeli nie rozumiesz tych linijek to je wywal - później i tak je dopiszesz jak się zorientujesz po co one były :)
P-68720
maksymiljan4
Temat założony przez niniejszego użytkownika
» 2012-11-07 17:13:47
czyli jesli opcja ma wartosc to jaka jest poaczatkowa i czy dzieki niej bedzie odpowiadac  wyborze w menu
tzn. jak opcja bedzie wynosic 1 to wtedy zaznaczone bedzie nowa gra
jesli opcja wynosi 2 to wtedy zaznaczone bedzie wczytaj gre
i jesli opcja bedzie wynosic 3 to wtedy bedzie zaznaczone wyjscie z gry

jesli cos pokrecilem to prosze o korekte

coz widze ze Dejavu nie odpowiadasz szkoda, moze ktos inny bylby mi wstanie to wytlumaczyc.
jak cos to bede dalej czekal na wasza pomoc.

P-68721
sajgonek
RE:
» 2012-12-10 09:37:48
Kolego maksymiljanie4 ..pełno błędów w Twoim kodzie:

1.zła logika przesuwania się po menu np. w Twoim programie brakuje obsługi zdarzenia naciśnięcia klawisza "W" w momencie, kiedy jesteśmy na opcji -->Wyjście z gry.Normalnie po jego naciśnięciu powinniśmy wejść w opcję
--->Zapisz grę, ale my znajdziemy się w opcji --->Nowa gra,bo tak to zakodowałeś(u Ciebie kiedy wciskamy W idziemy do Nowa gra).

2.Menu wyświetla się dopiero po wciśnięciu spacji!!skąd mamy to wiedzieć jako gracze?

3.Menu wyświetla się bez opcji domyślnej czyli np. opcja domyślna to Nowa gra i tam powinna być ustawiona strzałka

4.po co nieużywane trzy wskażniki na bitmapy ? po co zmienna int opcja3?

5.zmienne sterujące opcja1 i opcja2 nie zainicjowane żadną wartością podczas deklaracji(tworzenia), a póżniej są w kodzie próby odczytu zmiennej która ma w sobie przypadkowe wartości z pamięci systemowej (przynajmniej tak jest podczas pierwszego kliknięcia klawiszem  "S"

6.to raczej nie jest błąd ale dziwne dla mnie, że do przesuwania się po menu klawisze "W" i "S" zamiast strzałek

7.zamiast ---> lepiej wygląda zmiana koloru aktualnej opcji w menu (u Ciebie robi to makecolor()

8.piszesz że po wciśnięciu klawisza S przechodzisz do opcji Wyjście z gry ale w którym momencie?
*najpierws klikasz W i później S?
*od razu S?
bo w twoim kodzie poprzez błędy w jego logice są 2 takie możliwości

w kodzie obsługi klawisza "S" dajesz if(opcja1==1 and key[S])

lub                                  if(opcja2==1 and key [S])

w obu przypadkach te zmienne nie mają jeszcze pożadanej wartości 1!!!(jeśli oczywiście nie wcisnąłeś jako pierwszego klawisza "W" wtedy zmienna opcja1 faktycznie równa się 1)

JEDNYM SŁOWEM Z TEGO KODU ZA WIELE SIĘ NIE ZROBI ..POTRZEBNE INNE PODEJŚCIE LOGICZNE DO TEMATU:)


P-70683
« 1 »
  Strona 1 z 1