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

[Allegro] Jak to zrobić?

Ostatnio zmodyfikowano 2009-07-26 14:22
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Allegro] Jak to zrobić?
» 2009-07-26 12:36:34
Witam. Jak zrobić coś takiego jak w kodzie poniżej z tą różnicą ze obrazek ma się pokazywać w określonym polu ekranu dopiero po wykryciu kolizji z obrazkiem i bez użycia funkcji rand? Mogę prosić o kawałek kodu ilustrującego to zagadnienie? Z góry dzieki!!

C/C++
int licznik = 0;
licznik = rand() % 500;
if( licznik == 40 ) { cel1.x = 120; cel1.y = 260; }
if( licznik == 0 ) { cel1.x = 40; cel1.y = 40; }
if( licznik == 5 ) { cel1.x = 60; cel1.y = 40; }
if( licznik == 10 ) { cel1.x = 80; cel1.y = 100; }
if( licznik == 15 ) { cel1.x = 360; cel1.y = 260; }
if( licznik == 20 ) { cel1.x = 400; cel1.y = 40; }
if( licznik == 25 ) { cel1.x = 540; cel1.y = 60; }
if( licznik == 29 ) { cel1.x = 100; cel1.y = 65; }
if( licznik == 32 ) { cel1.x = 60; cel1.y = 40; }
P-8783
DejaVu
» 2009-07-26 12:49:22
Nic nie rozumiem ;p zapewne nie tylko mnie to dotyczyć będzie ;p
P-8784
wojownik266
Temat założony przez niniejszego użytkownika
» 2009-07-26 13:34:48
W dużym uproszczeniu chodzi o wyświetlenie bitmapy na ściśle określonym polu ekranu ale dopiero po wystąpieniu kolizji. Przykład:następuje  kolizja obiektu a z obiektem b, obiekt a wyswietlam na polu ekranu o współrzędnych: x=10,y=20.... Po kolejnej kolizji tych obiektów obiekt a wyświetlam na innej pozycji. W kodzie który przedstawiłem nieco wyzej (bez kolizji) obiekt a jest wyświetlany "pseudo losowo" na zadanych pozycjach... prościej już się chyba nie da. proszę o wskazówki może być "pseudokod".
P-8785
wojownik266
Temat założony przez niniejszego użytkownika
» 2009-07-26 13:43:40
C/C++
#include <allegro.h>

BITMAP * bufor = NULL;
BITMAP * smok = NULL;
BITMAP * ludek = NULL;
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};
class Cpostac
{
public:
    short int x, y;
    short int s, w;
};
Cpostac cel1, kursor1;
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_palette( default_palette );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    bufor = create_bitmap( 640, 480 );
    smok = load_bmp( "smok.bmp", default_palette );
    ludek = load_bmp( "ludek.bmp", default_palette );
    int poz_x = 0, poz_y = 0, licznik = 0, punkty = 0;
    int ludek_x, ludek_y;
    cel1.x = 39; cel1.y = 39; cel1.s = 39; cel1.w = 39;
    kursor1.x = 40; kursor1.y = 40; kursor1.s = 40; kursor1.w = 40;
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
           
            if( key[ KEY_LEFT ] ) { kursor1.x--; }
            if( key[ KEY_RIGHT ] ) { kursor1.x++; }
            if( key[ KEY_UP ] ) { kursor1.y--; }
            if( key[ KEY_DOWN ] ) { kursor1.y++; }
           
            licznik = rand() % 500;
            if( licznik == 0 ) { cel1.x = 10; cel1.y = 10; }
            if( licznik == 5 ) { cel1.x = 60; cel1.y = 40; }
            if( licznik == 10 ) { cel1.x = 80; cel1.y = 100; }
            if( licznik == 15 ) { cel1.x = 360; cel1.y = 240; }
            if( licznik == 20 ) { cel1.x = 600; cel1.y = 40; }
           
           
            speed--;
        }
        if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true )
        {
            punkty++;
        }
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        int czas = clock() / 1000;
        textprintf_ex( bufor, font, 20, 20, makecol( 255, 255, 255 ), - 1, "ZDOBYTE PUNKTY = %d", punkty / 360, 0, 0 );
        textprintf_ex( bufor, font, 20, 40, makecol( 200, 200, 200 ), - 1, "CZAS GRY = %d", czas, 0, 0 );
       
       
        masked_blit( ludek, bufor, 0, 0, kursor1.x, kursor1.y, kursor1.s, kursor1.w );
        masked_blit( smok, bufor, 0, 0, cel1.x, cel1.y, cel1.s, cel1.w );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( smok );
    destroy_bitmap( ludek );
    remove_int( increment_speed );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
                          
P-8786
DejaVu
» 2009-07-26 13:44:55
Jeśli chodzi o kolizje to wszystkim z uporem maniaka daję linka http://archiwum.ddt.pl/?TextId=1660. Sprawa kolizji była wielokrotnie poruszana na forum. Jak sama funkcja do wykrywania kolizji to dla Ciebie za mało to możesz sobie też poczytać trochę innych tematów z forum [google] site:forum.ddt.pl kolizja.

/edit:
Hm... widzę trochę kodu wkleiłeś i masz w nim już tą funkcję ;p

/edit2:
Z tego co zrozumiałem to chcesz zrobić 'punkt' na planszy, który się zbiera (np. tak jak w grze wąż). Punkt jest tylko jeden i póki go nie zbierzesz to nie zmienia on swojej pozycji.

Czyli...
1) masz pozycję obrazka, np. ox, oy.
2) domyślnie ustawiasz jakąś pozycję ox = 123, oy = 234;
3) sprawdzasz czy zachodzi kolizja obrazka z tym obiektem zbierającym.
4) jeśli kolizja zaszła - losujesz nową pozycję ox, oy tak długo dopóki nie będzie zachodziła kolizja z żadnym obiektem.
P-8787
wojownik266
Temat założony przez niniejszego użytkownika
» 2009-07-26 14:22:48
Dzięki za wskazówki. Rozwiązanie mojego problemu ma się tak:

C/C++
if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true )
cel1.x == 10; cel1.y == 10;
if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true )
cel1.x = 200; cel1.y = 100;
if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true )
     cel1.x = 540; cel1.y = 124;
P-8788
« 1 »
  Strona 1 z 1