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

[Allegro] Pocisk nie chce lecieć cały czas

Ostatnio zmodyfikowano 2008-10-05 18:44
Autor Wiadomość
Tombol
Temat założony przez niniejszego użytkownika
[Allegro] Pocisk nie chce lecieć cały czas
» 2008-10-03 14:06:12
Nie chce w starym temacie dawać mojego problemu bo można tylko 1 na temat to zrobiłem nowy i mam taki problem.
Chce zrobić że naciśnie się guzik i pocisk leci ciągle do góry ale niestety nie wiem jak to zrobić, kod:
C/C++
/////////////////////////////////////////////////////BZDETY//////////////////////////////////////////////
#include <allegro.h>
#include<iostream>
#include <winalleg.h>
#include <windows.h>
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

///////////////////////////////////DEKLARACJE ZMIENNYCH//////////////////////////////////////////////
int statek_x = 500, statek_y = 440;
int pocisk_x = statek_x, pocisk_y = 440;
//////////////////////////////////DEKLARACJE FUNKCJI////////////////////////////////////////////////////
bool kolizja( void )
{
    if( statek_x > 590 )
         return true;
   
    if( statek_x < 10 )
         return false;
   
}
bool shoot( void )
{
    if( pocisk_y < - 40 )
         return true;
   
    if( pocisk_y > - 60 )
         return false;
   
}

////////////////////////////////////////////////MAIN///////////////////////////////////////////////////////
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    clear_to_color( screen, makecol( 0, 0, 0 ) );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
   
    BITMAP * statek = NULL;
    BITMAP * pocisk = NULL;
    BITMAP * bufor = NULL;
   
    ////////////////////////////////////////////////BUFORY I OBRAZKI///////////////////////////////////////////////////////////
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora  !" );
        allegro_exit();
        return 0;
    }
   
   
    statek = load_bmp( "statek.bmp", default_palette );
    if( !statek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka statek!" );
        allegro_exit();
        return 0;
    }
    pocisk = load_bmp( "pocisk.bmp", default_palette );
    if( !pocisk )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka pocisk!" );
        allegro_exit();
        return 0;
    }
   
   
    /////////////////////////////////////////////////////GUZIKI////////////////////////////////////////////
    while( !key[ KEY_ESC ] )
    {
       
        if( key[ KEY_LEFT ] )
        {
            statek_x--;
            if( kolizja() == false )
            {
                statek_x++;
            }
        }
        if( key[ KEY_RIGHT ] )
        {
            statek_x++;
            if( kolizja() == true )
            {
                statek_x--;
            }
        }
        if( key[ KEY_SPACE ] )
        {
            pocisk_y--;
        }
    }
   
   
   
    //  clear_to_color(bufors, makecol(0,0,0));
    //rest(1);
    speed--;
   
   
   
    //clear_to_color(screen, makecol(0,0,0));
    //rest(10);
    /////////////////////////////////////////////////////RYSOWANIE//////////////////////////////////////////
    masked_blit( statek, bufor, 0, 0, statek_x, statek_y, statek->w, statek->h );
    masked_blit( pocisk, bufor, 0, 0, pocisk_x, pocisk_y, pocisk->w, pocisk->h );
    blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
}

/////////////////////////////////////////////////CZYSZCZENIE//////////////////////////////////////////
remove_int( increment_speed );
destroy_bitmap( statek );
destroy_bitmap( pocisk );
destroy_bitmap( bufor );
allegro_exit();
return 0;
}
END_OF_MAIN();
Niestety próbowałem używać funkcji sleep rest wrzucałem to w pętle wrzucałem po pętli robiłem wszystko co możliwe a najwyżej co pocisk robił to czekał kilka chwil i teleportował się w inne miejsce :/
P-1788
DejaVu
» 2008-10-03 14:15:54
Podobny temat był już na forum. Odpowiedź: http://ddt.pl/archiwum/?TextId=1734.
P-1789
lynx
» 2008-10-03 14:24:37
Wyjmij funkcję pocisk_y++; i daj ją nie w instrukcji if tylko na zewnątrz, tak aby za każdym obrotem pętli była dodawana.

C/C++
if( key[ KEY_SPACE ] )
{
    pocisk_y--;
}


Zamiast tego w bloku if(key(KEY_SPACE]) umieść przypisanie x, y pocisku do jakiegoś miejsca na planszy np. statku.
P-1790
Tombol
Temat założony przez niniejszego użytkownika
» 2008-10-03 14:26:29
A w tzm tekscie   pokaz_pocisk=true;  to co to jest to bedzie to masked_blit( pocisk, bufor, 0,0, pocisk_x, pocisk_y, pocisk->w, pocisk->h); ?
P-1791
lynx
» 2008-10-03 16:09:18
Zabardzo Cie nie zrozumiałem. Jeżeli chodzi Ci co znaczy ta funkcja, to ona rysuje obrazek. Czym się różni od zwykłego blit-a? Tym, że ona kolor 255,0,255 (w RGB) rysuje jako przezroczysty, czyli nie rysuje. ;P
P-1797
Tombol
Temat założony przez niniejszego użytkownika
» 2008-10-03 19:28:58
No chodzi mi o to ca każda z tych funkcji oznacza bo jak napisze rysuj to kompilator raczej nie będzie wiedział o co mi chodzi :P
P-1801
lynx
» 2008-10-03 20:09:26
To masz napisane w tutorialu, ale niech Ci będzie. Czym się różni masked_blit od blit to już mówiłem, więc teraz Ci opiszę tylko jedną funkcję ;P

A więc w funkcji:
masked_blit( statek, bufor, 0,0, statek_x, statek_y, statek->w, statek->h);

Miejsce pierwsze jest przypisane wskaźnikowi do obiektu typu BITMAP, czyli po prostu do obrazka.

Miejsce drugie jest przypisane miejscu w którym mamy coś wyświetlić(statek) do dyzpozycji mamy screen(ekran), oraz różnego rodzaju stworzone przez nas bitmpay funkcją create_bitmap. W tym przykładzie jest to bufor. Dlaczego? Ponieważ gdybyśmy zastosowali odrazu screen, ekran by migał, z powodu wyświetlania po koleji (jedno po drugim, ale oddzielnie) obrazków. Gdy zastosujemy bufor, obrazki wyświetlają się jedno po drugim, ale w buforze, czego nie widzimy. Później wszystko nagle zostaje wyświetlone. (tylko bufor) Co niszczy efekt mrugania.

Miejsca 3-4 oznaczają od jakiego elemntu (pixele) zacząć wyświetlać obrazek. Bardzo przydatne do animacji, pod koniec dam Ci linka. Przykładowo masz obrazek 50 x 50, a dzięki tej funkcji możesz wyświetlić obrazek 20 x 20 omijająć sam początek obrazka. W pole musiałbyś wtedy wpisać 30 i 30.

Miejsca 5-6 oznaczają gdzie wyświetlić obrazek w pixelach. Zresztą to chyba wiesz. ;P

Miejsca 7-8 są przypisane ile z obrazka(pixele) chcemy wyświetlić. Mając obrazek 50 x 50, i chcąc wyświetlić jego sam środek o powierzchni 10 x 10 pixeli. Funkcja wyglądała by tak:
masked_blit( statek, bufor, 25,25, statek_x, statek_y, 10, 10);

A wpisując w ostatnie pola statek->h i statek->w, ustawiasz to pole ta wielkości obrazka.


A oto obiecany link do animacji:
http://www.easykoder.yoyo.pl/index.php?mm=anim



                                                                  Pozdr. Piotrek
P-1802
Tombol
Temat założony przez niniejszego użytkownika
» 2008-10-03 20:21:07
Thx że się napisałeś ale ja to wiem xD
I nadal nie wiem jak to zrobić xD
To może inaczej czy jest możliwe żeby po każdym obiegu pętli pętla zatrzymywała się na 1 milisekundę i znów obieg :P
Próbowałem tak robić ale może coś źle robiłem :p
P-1805
« 1 » 2 3
  Strona 1 z 3 Następna strona