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

[Allegro] Problem z wyświetlaniem bitmapy.

Ostatnio zmodyfikowano 2010-01-07 19:04
Autor Wiadomość
Qtk
Temat założony przez niniejszego użytkownika
[Allegro] Problem z wyświetlaniem bitmapy.
» 2010-01-03 23:45:26
Witam, mam dwa (chyba) nietypowe pytania, a nie znając odpowiedzi na nie, nie mogę sobie poradzić paroma problemami.
I.
C/C++
#include <allegro.h>
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
// OTWORZENIE GŁOWNEJ FUNKCJI = MAIN
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
   
    volatile long speed = 0;
   
    // Tworzenie bitmap
    BITMAP * bufor = NULL;
    BITMAP * Kloc1 = NULL;
    BITMAP * ninja = NULL;
    SAMPLE * dzwiek = NULL;
   
   
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    ninja = load_bmp( "ninja.bmp", default_palette );
    if( !ninja )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
   
    Kloc1 = load_bmp( "Kloc.bmp", default_palette );
    if( !Kloc1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka Kloc !" );
        allegro_exit();
        return 0;
    }
    dzwiek = load_sample( "muse.wav" );
    if( !dzwiek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować dzwieku !" );
        allegro_exit();
        return 0;
    }
    int ninja_x = 100, ninja_y = 100;
    int Kloc1_x = 200, Kloc1_y = 300;
    // Pętla odpowiedzialna za przemieszczanie zioma
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_LEFT ] ) ninja_x--;
       
        if( key[ KEY_RIGHT ] ) ninja_x++;
       
        if( key[ KEY_UP ] ) ninja_y--;
       
        if( key[ KEY_DOWN ] ) ninja_y++;
       
       
       
        while( speed > 0 )
        {
           
            if( key[ KEY_LEFT ] ) ninja_x--;
           
            if( key[ KEY_RIGHT ] ) ninja_x++;
           
            if( key[ KEY_UP ] ) ninja_y--;
           
            if( key[ KEY_DOWN ] ) ninja_y++;
           
            speed--;
        }
        play_sample( dzwiek, 255, 127, 1000, 1 );
       
        while( !key[ KEY_ESC ] )
        {
           
            if( key[ KEY_A ] ) { adjust_sample( dzwiek, 255, 127, 500, 1 ); }
            if( key[ KEY_S ] ) { adjust_sample( dzwiek, 255, 127, 2000, 1 ); }
            if( key[ KEY_D ] ) { adjust_sample( dzwiek, 255, 0, 1000, 1 ); }
            if( key[ KEY_F ] ) { adjust_sample( dzwiek, 255, 255, 1000, 1 ); }
           
        }
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        masked_blit( ninja, bufor, 0, 0, ninja_x, ninja_y, ninja->w, ninja->h );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        masked_blit( Kloc1, screen, 0, 0, Kloc1_x, Kloc1_y, Kloc1->w, Kloc1->h );
    }
   
   
    masked_blit( ninja, bufor, 100, 500, ninja_x, ninja_y, ninja->w, ninja->h );
   
   
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    masked_blit( Kloc1, screen, 0, 0, 100, 200, Kloc1->w, Kloc1->h );
   
    readkey();
   
    remove_int( increment_speed );
   
    stop_sample( dzwiek );
    destroy_bitmap( ninja );
    destroy_bitmap( Kloc1 );
    destroy_bitmap( bufor );
    destroy_sample( dzwiek );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
]

Byłbym wdzięczny jak by mi ktoś sprawdził, ten kod i powiedział co w nim nie tak, że odtwarza się tylko dzwięk, lecz bitmapy już nie :(


II.
Drugie pytanie jest związane również z bitmapami, oraz bądź co bądź popatrzeniem na ten kod. Czemu gdy (gdy nie ma kodu na odtwarzanie dzwieku), otwiera mi się tylko jedna bitmapa - ninja ?

Z góry dziękuję za pomoc. :)
P-12698
malan
» 2010-01-04 00:37:25
Double post
P-12701
malan
» 2010-01-04 00:39:45
1. Jeden problem == jeden temat.
2. Użyj innych tagów: http://forum.ddt.pl/?Tid=622

I
3. Nie widziałem, żeby ktoś deklarował bitmapy jako obiekty nie globalne, ale ok ;p.
4. Co się dziwić, że nie ma bitmap skoro wyświetlasz je poza główną pętlą :) ? Jeśli dobrze odczytałem Twój kod powinna ona mniej więcej wyglądać tak:
C/C++
play_sample( dzwiek, 255, 127, 1000, 1 );

while( !key[ KEY_ESC ] )
{
    clear_to_color( bufor, makecol( 150, 150, 150 ) );
   
    while( speed > 0 )
    {
        if( key[ KEY_LEFT ] ) ninja_x--;
       
        if( key[ KEY_RIGHT ] ) ninja_x++;
       
        if( key[ KEY_UP ] ) ninja_y--;
       
        if( key[ KEY_DOWN ] ) ninja_y++;
       
        speed--;
    }
   
    if( key[ KEY_A ] ) { adjust_sample( dzwiek, 255, 127, 500, 1 ); }
    if( key[ KEY_S ] ) { adjust_sample( dzwiek, 255, 127, 2000, 1 ); }
    if( key[ KEY_D ] ) { adjust_sample( dzwiek, 255, 0, 1000, 1 ); }
    if( key[ KEY_F ] ) { adjust_sample( dzwiek, 255, 255, 1000, 1 ); }
   
    masked_blit( ninja, bufor, 0, 0, ninja_x, ninja_y, ninja->w, ninja->h );
    masked_blit( Kloc1, bufor, 0, 0, Kloc1_x, Kloc1_y, Kloc1->w, Kloc1->h );
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
}
Jeśli jest nie tak jakbyś chciał powiedz jak to ma działać ;).
P-12702
lynx
» 2010-01-04 16:08:11
A czego robisz potrójną(podwójną) pętlę?

Generalnie rób według schematu:
1. Inicjalizacja.
2. Pętla (!key(KEY_ESC))
a) tam może być pętla (timer z allegro) gdzie wykonujesz rzeczy związane z ruchem obiektów.
b) możesz dać jakieś if'y dotyczące zmiany parametrów dźwięku. (może to być w timerze)

c) wyświetlanie odpowiednich klatek animacji itd.

3.Koniec głównej pętli, deincjalizacja.


Wiele pętli jest tu nie potrzebne wystarczą dwie, czyli główna pętla programu + timer.


Zmienne/obiekty jak najbardziej mogą być nie globalne, ale ważne jest by je dobrze rozplanować.
P-12707
Qtk
Temat założony przez niniejszego użytkownika
» 2010-01-04 22:59:09
Witam :). Dziękuję za zainteresowanie moim problemem,kod który podesłał mi malan(za co mu serdecznie dziękuję) powiedzmy, że działa, tzn nie ma żadnym błędów kompilacji, dźwięk się odtwarza, wyświetlają się bitmapy, lecz bitmapa "ninja" w ogóle się nie porusza.. Mógłby mi ktoś pomóc? Przepraszam, że zadaje takie pytania, ale dopiero co zaczynam przygodę z Allegro, oraz c++, więc niektóre rzeczy są dla mnie trudne do zrozumienia. :(
P-12728
malan
» 2010-01-05 17:43:26
Usuń pętlę while(speed > 0) (ale tylko pętlę, zawartość zostaw) i sprawdź, czy działa.
P-12734
Qtk
Temat założony przez niniejszego użytkownika
» 2010-01-05 20:01:23
malan, nie wiem jak Ci dziękować :]]]]. Wszystko działa tzw 'ninja' porusza się, więc jestem bardzo zadowolony :P. Dziękuję. Myślę,że temat do zamknięcia. :)
P-12737
malan
» 2010-01-05 22:51:30
Cieszę się, że działa jednak zastanawia mnie czemu nie działało. Tak teraz patrzę na Twój kod i chyba coś mam - zrobiłeś tak: zadeklarowałeś zmienną speed, potem zainicjalizowałeś timera, a potem znowu deklarujesz zmienną speed i ją zerujesz. Więc skoro zmienna speed jest == 0 to program nie wchodzi do pętli sterującej :) (przynajmniej tak mi się wydaje).
Proponowałbym mały test: zrób taką samą pętlę ( while( speed > 0 ) ) i wstaw ją w to samo miejsce z tą samą "zawartością" (jak w miałeś poprzednio), ale usuń tą linijkę z funkcji main:
volatile long speed = 0;
P-12739
« 1 » 2
  Strona 1 z 2 Następna strona