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

[C++, Allegro] Kolizja - getpixel() z bitmapą...

Ostatnio zmodyfikowano 2010-07-24 18:41
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-07-24 16:49:42
No to plansza nie jest tylko bitmapa :)
Proszę:
C/C++
//...
int szerokosc = 800;
int wysokosc = 600;
//...
int ludek1_x = 100, ludek1_y = 100;
int domek1_x = 150, domek1_y = 100, domek1_s = 553, domek1_w = 398;
//....
blit( domek1, bufor, 0, 0, domek1_x, domek1_y, domek1_s, domek1_w );
/*masked_*/ blit( ludek1, bufor, 0, 0, ludek1_x, ludek1_y, ludek1->h, ludek1->w );
blit( bufor, screen, 0, 0, 0, 0, szerokosc, wysokosc );
Moge dac cały kod ale nie widzę w tym jakiejkolwiek potrzeby... :D
P-20138
malan
» 2010-07-24 16:53:32
C/C++
while( speed > 0 )
{
    if( getpixel( bufor, ludek1_x, ludek1_y ) != makecol( 0, 0, 255 ) )
    {
        if( key[ KEY_W ] ) if( ludek1_y >= domek1_y ) ludek1_y--;
       
        if( key[ KEY_S ] ) if( ludek1_y <= domek1_w + domek1_s ) ludek1_y++;
       
        if( key[ KEY_A ] ) if( ludek1_x >= domek1_x ) ludek1_x--;
       
        if( key[ KEY_D ] ) if( ludek1_x <= domek1_x + domek1_w ) ludek1_x++;
       
    }
    speed--;
}
P-20139
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-07-24 17:07:18
No powiedzmy że lepiej, ale chciałem zastosować getpixel i te cofanie żeby gracz mógł się poruszać także na zewnątrz domu oraz omijać ściany działowe w domu :):)
A jak zastosowałem Twój kod to za bardzo to nie działa...
Może wkleje na serwer paczke z grą i z plikami źródłowymi i po prostu jak ktoś będzie miał czas jak i chęci to może zerknie i coś poprawi żeby dobrze działało :)
P-20140
malan
» 2010-07-24 17:13:04
Tak myślałem, że to białe pomiędzy niebieskim to drzwi... Fakt- wtedy ten kod nie działa.
Wrzuć projekt na serwer- może się trochę pobawię. Tylko opisz dokładnie gdzie gracz może się poruszać, a gdzie nie :).
P-20141
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-07-24 17:20:23
Proszę bardzo: http://www.SeaProgrammers.cba.pl/P.rar
Gracz może się poruszać tylko po ekranie który widać (nie będzie przewijanej mapy jak coś) czyli po ekranie 800x600, i nie może wchodzić w ściany, czyli na ten niebieski kolor (0,0,255).
Więc please, help! :)
I dzięki @malan za takie zainteresowanie :)
P-20142
malan
» 2010-07-24 18:34:25
Dobra. Troch mi to zajęło, ale udało się :).
Problem leżał w tym, że:
C/C++
blit( domek1, bufor, 0, 0, domek1_x, domek1_y, domek1_s, domek1_w );
/*masked_*/ blit( ludek1, bufor, 0, 0, ludek1_x, ludek1_y, ludek1->h, ludek1->w );
blit( bufor, screen, 0, 0, 0, 0, szerokosc, wysokosc );
//...
if( getpixel( bufor, ludek1_x, ludek1_y ) == makecol( 0, 0, 255 ) )
//...
Przy takim układzie na pozycji ludek1_x ; ludek1_y była przecież postać (czyli żółta plama)! :) Program cały czas pobierał kolor postaci :). Dlatego trzeba zmienić kolejność i już ;p.

Tutaj masz sformatowany i działający kod. Chłopie zmień styl, bo ciężko Cie będzie rozczytać (przynajmniej mi było) ;p.
C/C++
#include <allegro.h>
#include <winalleg.h>
#include <windows.h>

//MYSZKA
int mx = 0, my = 0, mb = 0;

BITMAP * kursor;

void laduj_kursor()
{
    kursor = load_bitmap( "media/kursor.bmp", NULL );
    if( !kursor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac grafiki ( kursor )" );
        allegro_exit();
    }
};

void myszkaa()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};
//KONIEC MYSZKA

//PRĘDKOŚĆ
volatile long speed = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
//KONIEC PRĘDKOŚĆ

void init();
void deinit();

int szerokosc = 800;
int wysokosc = 600;

//OKNO
void init()
{
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    res = set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    if( res != 0 )
    {
        MessageBox( HWND_DESKTOP, "Nie można uruchomić gry, ponieważ rozdzielczość nie jest obsługiwana!", "ERROR", MB_OK + MB_ICONERROR );
        exit( - 1 );
    }
   
    install_keyboard();
    install_mouse();
    install_timer();
   
    install_int_ex( increment_speed, BPS_TO_TIMER( 150 ) );
   
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" ); //DŹWIĘK
    set_volume( 255, 255 ); //GŁOŚNOŚĆ
   
    laduj_kursor();
   
    show_mouse( screen ); //POKAZANIE MYSZKI NA EKRANIE
    //set_mouse_sprite(kursor);
    unscare_mouse();
}
//KONIEC OKNO

void deinit() {
    clear_keybuf();
    /* add other deinitializations here */
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    init();
   
    BITMAP * ludek1 = NULL;
    BITMAP * domek1 = NULL;
    BITMAP * bufor = NULL;
   
    int ludek1_x = 0, ludek1_y = 0;
    int domek1_x = 0, domek1_y = 0;
    int pixelColor = 0;
   
    SAMPLE * dzwiek = NULL;
   
    ludek1 = load_bmp( "media/czlowiek1.bmp", default_palette );
    if( !ludek1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        MessageBox( HWND_DESKTOP, "Nie można załadować grafiki!\nGra zostanie zamknięta!", "ERROR", MB_OK + MB_ICONERROR );
        allegro_exit();
        return 0;
    }
   
    domek1 = load_bmp( "media/domek1.bmp", default_palette );
    if( !domek1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        MessageBox( HWND_DESKTOP, "Nie można załadować grafiki!\nGra zostanie zamknięta!", "ERROR", MB_OK + MB_ICONERROR );
        allegro_exit();
        return 0;
    }
   
    dzwiek = load_sample( "media/muza.wav" );
    if( !dzwiek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        MessageBox( HWND_DESKTOP, "Nie można załadować dźwięku!\nGra zostanie zamknięta!", "ERROR", MB_OK + MB_ICONERROR );
        allegro_exit();
        return 0;
    }
   
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        MessageBox( HWND_DESKTOP, "Nie można utworzyć bufora!\nGra zostanie zamknięta!", "ERROR", MB_OK + MB_ICONERROR );
        allegro_exit();
        return 0;
    }
   
    play_sample( dzwiek, 255, 127, 1000, 1 ); //ODTWARZANIE MUZYKI
   
    ludek1_x = 350;
    ludek1_y = 150;
   
    domek1_x = 150;
    domek1_y = 100;
   
    while( !key[ KEY_ESC ] )
    {
        myszkaa();
       
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
       
        textout_ex( bufor, font, "Pieniadze:    ", 50, 30, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, font, "Pojazd:       ", 50, 50, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, font, "Zawod:        ", 50, 70, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, font, "Przyjaciele:  ", 350, 30, makecol( 255, 0, 255 ), - 1 );
        textout_ex( bufor, font, "Wiek:         ", 350, 50, makecol( 255, 0, 255 ), - 1 );
       
        textprintf_ex( bufor, font, 700, 10, makecol( 0, 0, 255 ), - 1, "X: %d", ludek1_x );
        textprintf_ex( bufor, font, 700, 20, makecol( 0, 0, 255 ), - 1, "Y: %d", ludek1_y );
        textprintf_ex( bufor, font, 700, 30, makecol( 0, 0, 255 ), - 1, "R: %d", getr( pixelColor ) );
        textprintf_ex( bufor, font, 700, 40, makecol( 0, 0, 255 ), - 1, "G: %d", getg( pixelColor ) );
        textprintf_ex( bufor, font, 700, 50, makecol( 0, 0, 255 ), - 1, "B: %d", getb( pixelColor ) );
       
        masked_blit( domek1, bufor, 0, 0, domek1_x, domek1_y, domek1->w, domek1->h );
       
        while( speed > 0 )
        {
            if( key[ KEY_W ] ) if( getpixel( bufor, ludek1_x, ludek1_y - 1 ) != makecol( 0, 0, 255 ) ) ludek1_y--; else textprintf_ex( bufor, font, 50, 100, makecol( 255, 255, 0 ), 0, "Sciana!" );
            if( key[ KEY_S ] ) if( getpixel( bufor, ludek1_x, ludek1_y + 1 ) != makecol( 0, 0, 255 ) ) ludek1_y++; else textprintf_ex( bufor, font, 50, 100, makecol( 255, 255, 0 ), 0, "Sciana!" );
            if( key[ KEY_A ] ) if( getpixel( bufor, ludek1_x - 1, ludek1_y ) != makecol( 0, 0, 255 ) ) ludek1_x--; else textprintf_ex( bufor, font, 50, 100, makecol( 255, 255, 0 ), 0, "Sciana!" );
            if( key[ KEY_D ] ) if( getpixel( bufor, ludek1_x + 1, ludek1_y ) != makecol( 0, 0, 255 ) ) ludek1_x++; else textprintf_ex( bufor, font, 50, 100, makecol( 255, 255, 0 ), 0, "Sciana!" );
            speed--;
        }
       
        masked_blit( ludek1, bufor, 0, 0, ludek1_x, ludek1_y, ludek1->w, ludek1->h );
        blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
        rest( 1 );
    }
   
    stop_sample( dzwiek );
    destroy_sample( dzwiek );
   
    remove_int( increment_speed );
   
    destroy_bitmap( bufor );
    destroy_bitmap( ludek1 );
    destroy_bitmap( domek1 );
   
    deinit();
    return( 0 );
}
Mam nadzieję, że o to chodziło :). Sformatuj sobie po swojemu jak chcesz ;).

/edit
Blokadę wyjścia poza ekran sam dorób, bo zapomniałem, ale kod i tak jest parę postów wcześniej :).
P-20144
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-07-24 18:41:39
Dzięki, naprawdę dzięki, co ja bym bez Ciebie zrobił :)
Teraz wszystko jest ok, jeszcze raz dzięki :)

A co do czytelności kodu to ja dla siebie tylko pisałem, dopiero tak pod koniec porządkuję kod i wtedy jest czytelniej :D

Temat zamykam ;)
P-20145
1 « 2 »
Poprzednia strona Strona 2 z 2