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

[allegro] ograniczony obszar

Ostatnio zmodyfikowano 2008-05-08 20:49
Autor Wiadomość
zax090
Temat założony przez niniejszego użytkownika
[allegro] ograniczony obszar
» 2008-05-04 16:45:18
Kombinuje jak koń pod górkę z marnym skutkiem :D

1.Jak można zrobić żeby moja postać nie przechodziła poza obszar buferu chodzi o kolizje ?(np. mam bufer jako bitmapa 800x600 i gdzy moja postać idzie do góry to zanika mi poza monitorem i znika)Jak to można zrobić
2.czy da się gdy mamy dużą mapę, zrobić tak( w przypadku widoku z góry) że ta mapa przesuwa się razem z postacią (chyba wiadomo może słabo sprecyzowane)

oto kod thx :P

C/C++
#include <allegro.h>

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * ludek = NULL;
   
    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;
    }
   
    ludek = load_bmp( "ludek.bmp", default_palette );
    if( !ludek )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
   
    int ludek_x = 100, ludek_y = 100;
   
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_LEFT ] ) ludek_x--;
       
        if( key[ KEY_RIGHT ] ) ludek_x++;
       
        if( key[ KEY_UP ] ) ludek_y--;
       
        if( key[ KEY_DOWN ] ) ludek_y++;
       
        clear_to_color( bufor, makecol( 128, 128, 128 ) );
        rest( 8 );
       
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    destroy_bitmap( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
 
P-618
dudek
» 2008-05-04 17:48:22
Rozwiązanie pierwszego problemu jest bardzo proste:) dla bufora 640 x 480 zamień linijki, wktorych sprawdzasz jaki zostal wcisnięty przycisk na te:
C/C++
if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--;

if(( key[ KEY_RIGHT ] ) &&( ludek_x < 600 ) ) ludek_x++;

if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--;

if(( key[ KEY_DOWN ] ) &&( ludek_y < 440 ) ) ludek_y++;


Pewnie Cie dziwi dlaczego 600 a nie 640 i 440 a nie 480. Otoz Wspolrzędne ludzika sa ustawione na jego lewym górnym rogu więc gdy styka sie z prawą i dolną ściana przeniknie ja az jego lewy górny róg zetknie sie z krawędzia. Dlatego trzeba odjąc wysokość i szerekość obrazka od 640 i 480 i gotowe:) Obrazek o ile pamietam byl 40 na 40 więc tu już masz gotowca.

Jeśli chodzi o drugą sprawe to tak da się. To jest scrolling ekranu ale żeby cos wiecęj się dowiedzieć musisz wejść na strone easykodera do działu MAPA tam jest troche to opisane. A jak to jest za mało to zostaje Ci tylko help allegro:) ja sie jeszcze tym nie zajmowałem więc Ci nie pomoge przynamniej narazie:) narazie bo w planach miałem RTS w 2d ale czasu narazie brak:[
P-621
zax090
Temat założony przez niniejszego użytkownika
» 2008-05-04 19:20:04
czy tą samą technikę można zastosować gdy mamy zrobioną 2 przeszkodą a chcemy by z każdej strony nie mógł na nią wejść. po prostu gdy mam 2 postać to ta 1 gdy nią poruszam nakłada się na tą 2 postać, a chce żeby była z każdej strony "ogrodzona"
P-626
DejaVu
» 2008-05-04 19:58:19
Przykład zastosowania kolizji razem z kodem znajdziesz w tym temacie: http://ddt.pl/forum/?Tid=126&p=3.

/edit:
Ta funkcja wykrywa czy obiekty się zderzyły (obiekty są prostokątami):
x - współrzędna x
y - współrzędna y
s - szerokość
w - wysokość

C/C++
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 );
};
P-638
zax090
Temat założony przez niniejszego użytkownika
» 2008-05-04 21:24:40
to jak to tu ma wyglądać bo jak cały czas robie to mi błędy wyskakują ;/ ? thx :D

C/C++
#include <allegro.h>

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * ludek = NULL;
    BITMAP * ludek1 = 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;
    }
   
    ludek = load_bmp( "ludek.bmp", default_palette );
    if( !ludek )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
   
    int ludek_x = 100, ludek_y = 100;
   
    ludek1 = load_bmp( "ludek1.bmp", default_palette );
    if( !ludek )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
   
    int ludek1_x = 200, ludek1_y = 200;
   
    while( !key[ KEY_ESC ] )
    {
        if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--; // ograniczony obszar
       
        if(( key[ KEY_RIGHT ] ) &&( ludek_x < 680 ) ) ludek_x++;
       
        if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--;
       
        if(( key[ KEY_DOWN ] ) &&( ludek_y < 480 ) ) ludek_y++;
       
        clear_to_color( bufor, makecol( 128, 128, 128 ) );
        rest( 3 );
       
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
        masked_blit( ludek1, bufor, 0, 0, ludek1_x, ludek1_y, ludek1->w, ludek1->h );
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
   
    destroy_bitmap( ludek );
    destroy_bitmap( ludek1 );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-648
DejaVu
» 2008-05-05 12:03:59
Wklej log kompilacji... :)
P-649
zax090
Temat założony przez niniejszego użytkownika
» 2008-05-06 11:19:56
używając takiego czegoś mój ludek przeskakuje  po narożnikach, zamiazt płynnie chodzić po obwodzie....czy ktoś mógłby mi pomóc i mnie poprawić bo w tych klockach akurat kuleje :/

C/C++
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false; };

if( kolizja( ludek1.x, ludek1.y, ludek1.s, ludek1.w, ludek2.x, ludek2.y, ludek2.s, ludek2.w ) == true )
{
    if(( ludek1.x < ludek2.x ) )
    {
        ludek1.x = ludek2.x - ludek2.s;
    }
    if(( ludek1.x > ludek2.x ) )
    {
        ludek1.x = ludek2.x + ludek2.s;
    }
    if(( ludek1.y > ludek2.y ) )
    {
        ludek1.y = ludek2.y + ludek2.w;
    }
    if(( ludek1.y < ludek2.y ) )
    {
        ludek1.y = ludek2.y - ludek2.w;
    }
}
P-654
DejaVu
» 2008-05-08 20:04:13
Co chcesz uzyskać:
a) ludek, który się porusza po ekranie strzałkami i nie może wyjechać poza obszar
b) ludek, który się porusza po obwodzie drugiego ludka i nie może się od niego odrywać (nie może być osobno)
c) ludek, który nie może przenikać przez drugiego ludka - zatrzymuje się jeśli nie można iść w danym kierunku bo drugi ludek stoi na drodze
d) inne... jakie?
P-657
« 1 » 2
  Strona 1 z 2 Następna strona