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

[Allegro] Kolizje per pixel

Ostatnio zmodyfikowano 2011-12-17 22:16
Autor Wiadomość
radmack
Temat założony przez niniejszego użytkownika
[Allegro] Kolizje per pixel
» 2011-12-08 23:28:29
Temat był już oczywiście wałkowany miliony razy, ale nie doczytałem się kluczowych dla mnie kwestii.

W moim projekcie nadszedł czas na zrobienie jakichś kolizji. Zdecydowałem się na kolizje per pixel. Wiem, jak użyć getpixel(), wiem, jak to ma teoretycznie wyglądać, ale nie wiem, jak to razem ładnie skleić. Przeszkody wyświetlam na dwóch buforach. Na jednym z całą inną grafiką(trawka, ogólnie grafika, z którą nie nie ma kolizji), drugi bufor jest różowy + wyświetlone przeszkody. Ustawiając pixele kontrolne na drugim buforze i przesuwając je wraz z ludzikiem sprawdzam, czy pobrany pixel kontrolny jest różny od różowego. Jeśli tak, to następuje kolizja i zatrzymanie chodu ludzika w tę stronę. Nie wyświetlam drugiego bufora na ekranie. On jest tylko roboczym buforem do sprawdzania kolizji. Wyświetlam pierwszy bufor i oblatuję kolizje w drugim. To tylko teoria. Myślę właściwie? Jaki polecicie sposób na wyświetlanie grafiki przeszkód i jak to potem scrollować identycznie z mapą?
Jak mam scrollować obiekty będące na tych obu buforach?

A i jeszcze jedno. Czy w Allegro mamy jakąś funkcję odpowiedzialną za warstwowanie bitmap? Jeśli nie, to jak to zrobić prawidłowo? Nie chcę mieć sytuacji, że postać powinna wejść za drzewo(drzewo powinno zasłonić postać), a tymczasem wyświetla się na tym drzewie. Jak temu zaradzić?

pozdrawiam

 
P-45364
pekfos
» 2011-12-09 09:54:47
Takie tematy już były. widać że nie szukałeś i prawdopodobnie nie myślałeś. Warstwowanie? To chyba oczywiste by wyświetlać bitmapy w odpowiedniej kolejności. Co do przeszkód to wyświetl po prostu bufor od kolizji na którym masz te przeszkody.
Jak nie masz zagmatwanego kodu który by utrudniał dodanie tych funkcjonalności, to z lekka wątpię w sens istnienia tego tematu. Czy już nikt nie używa Google?
P-45369
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-09 18:40:22
Zapewniam cię, że przeczytałem całą masę tematów o kolizjach, a i Google nie jest mi obce. W twojej odpowiedzi jednak nie doczytałem się żadnej satysfakcjonującej mnie informacji. Inaczej. Jak mam wyświetlić na pustej bitmapie przeszkody i jak je scrollować identycznie z mapą? Z resztą sobie poradzę.
P-45377
SeaMonster131
» 2011-12-09 18:48:35
Tak samo jak scrollujesz zwykłą mapę ;p
P-45378
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-09 23:10:28
Jeszcze nie próbowałem, ale wydaje mi się, że jeśli mam mapę kafli na buforze i na tym samym buforze wyświetlę jakieś obiekty, to te obiekty nie będą scrollowane, zostaną w tym samym miejscu na buforze ;] Chyba, żeby uwzględnić przy wyświetlaniu tej bitmapy zmienne mapy i odpowiednio przesuwać przeszkody za ekran, po czym je niszczyć?






P-45382
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-11 14:56:50
Hmm pomóżcie, bo nie mogę się dopatrzyć żadnego błędu, a kolizje nie działają. Oto cały kod:

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 );

BITMAP * teren = NULL;
BITMAP * bufor = NULL;
BITMAP * bufor2 = NULL;
BITMAP * ludek = NULL;
BITMAP * celownik = NULL;
BITMAP * terenkolizji = NULL;

int ludek_x =( SCREEN_W / 2 ) - 12;
int ludek_y =( SCREEN_H / 2 ) - 32;

int mapa_x = 0, mapa_y = 0;
int scrollX = 0;
int scrollY = 0;

/*int sprawdz_kolizje(int kierunek)
{
     if(
            (getpixel(bufor2, (ludek_x+17) , (ludek_y+60)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+6) , (ludek_y+60  )       !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+23) , ludek_y+35  )       !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+2) , (ludek_y+32)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+2) , (ludek_y+19)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+23) , (ludek_y+19)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+7) , (ludek_y+5)  )       !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+19) , (ludek_y+5)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+13) , (ludek_y+5)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+5) , (ludek_y+12)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+21) , (ludek_y+12)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+4) , (ludek_y+19)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+21) , (ludek_y+20)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+2) , (ludek_y+27)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+22) , (ludek_y+28)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+3) , (ludek_y+38)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+23) , (ludek_y+40)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+2) , (ludek_y+44)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+19) , (ludek_y+43)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+2) , (ludek_y+51)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+18) , (ludek_y+49)  )     !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+3) , (ludek_y+57)  )      !=makecol(255,0,255))||

            (getpixel(bufor2, (ludek_x+18) , (ludek_y+55)  )     !=makecol(255,0,255))))

            switch(kierunek)
            {
                case 1: ludek_y--; break;
                case 2: ludek_x--; break;
                case 3: ludek_y++; break;
                case 4: ludek_x++; break;
            }
    else return 1;
}*/

int sprawdz_kolizje( int kierunek )
{
    switch( kierunek )
    {
       
    case 1:
       
        if(( getpixel( bufor2,( ludek_x + 2 ),( ludek_y + 47 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 6 ),( ludek_y + 47 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 11 ),( ludek_y + 47 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 17 ),( ludek_y + 47 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 23 ),( ludek_y + 47 ) ) != makecol( 255, 0, 255 ) )
        )
       
        {
            if( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) )
            {
                scrollY++;
            }
            else ludek_y++;
           
        }
        else return 0; break;
       
    case 2:
       
        if(( getpixel( bufor2,( ludek_x + 2 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 6 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 11 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 17 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 23 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) )
        )
        {
            if( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) )
            {
                scrollX--;
            }
            else ludek_x--;
           
        }
        else return 0; break;
       
    case 3:
       
        if(( getpixel( bufor2,( ludek_x + 2 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 6 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 11 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 17 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 23 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) )
        )
        {
            if( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) )
            {
                scrollY--;
            }
            else ludek_y--;
           
        }
        else return 0; break;
    case 4:
       
        if(( getpixel( bufor2,( ludek_x + 2 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 6 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 11 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 17 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) ) ||
        ( getpixel( bufor2,( ludek_x + 23 ),( ludek_y + 60 ) ) != makecol( 255, 0, 255 ) )
        )
        {
            if( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) )
            {
                scrollX++;
            }
            else ludek_x++;
           
        }
        else return 0; break;
    }
}

short int map[ 40 ][ 40 ] =
{
    4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 8, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
};

short int map_colliding[ 40 ][ 40 ] =
{
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};


void render_map_real()
{
    int startMapaX = scrollX / 40;
    int startMapaY = scrollY / 40;
   
    for( int x = startMapaX; x < startMapaX + 21; x++ )
    {
        for( int y = startMapaY; y < startMapaY + 16; y++ )
        {
            blit( teren, bufor,
            ( map[ y ][ x ] % 4 ) * 40,
            ( map[ y ][ x ] / 4 ) * 40,
            ( x - startMapaX ) * 40 -( scrollX % 40 ),
            ( y - startMapaY ) * 40 -( scrollY % 40 ),
            40, 40 );
        }
    }
} END_OF_FUNCTION( render_map_real() );

void render_map_collisions()
{
    int startMapaX = scrollX / 40;
    int startMapaY = scrollY / 40;
   
    for( int x = startMapaX; x < startMapaX + 21; x++ )
    {
        for( int y = startMapaY; y < startMapaY + 16; y++ )
        {
            blit( terenkolizji, bufor2,
            ( map_colliding[ y ][ x ] % 4 ) * 40,
            ( map_colliding[ y ][ x ] / 4 ) * 40,
            ( x - startMapaX ) * 40 -( scrollX % 40 ),
            ( y - startMapaY ) * 40 -( scrollY % 40 ),
            40, 40 );
        }
    }
} END_OF_FUNCTION( render_map_collisions );

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 160 ) );
    install_mouse();
    set_mouse_sprite( celownik );
    unscare_mouse();
   
    bufor = create_bitmap( 800, 600 );
    bufor2 = create_bitmap( 800, 600 );
    teren = load_bmp( "teren.bmp", default_palette );
    ludek = load_bmp( "ludek.bmp", default_palette );
    celownik = load_bmp( "celownik.bmp", default_palette );
    terenkolizji = load_bmp( "terenkolizji.bmp", default_palette );
   
    int ludek_x =( SCREEN_W / 2 ) -( ludek->w / 2 );
    int ludek_y =( SCREEN_H / 2 ) -( ludek->h / 2 );
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) &&( sprawdz_kolizje( 4 ) == 0 ) )
            {
                scrollX--; mapa_x--;
            }
            else if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) &&( sprawdz_kolizje( 4 ) == 0 ) ) ludek_x--;
           
            if(( key[ KEY_RIGHT ] ) &&( mapa_x < 40 * 20 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) &&( sprawdz_kolizje( 2 ) == 0 ) )
            {
                scrollX++; mapa_x++;
            }
            else if( key[ KEY_RIGHT ] &&( ludek_x <( SCREEN_W - ludek->w ) ) &&( sprawdz_kolizje( 2 ) == 0 ) ) ludek_x++;
           
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) &&( sprawdz_kolizje( 1 ) == 0 ) )
            {
                scrollY--; mapa_y--;
            }
            else if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) &&( sprawdz_kolizje( 1 ) == 0 ) ) ludek_y--;
           
            if(( key[ KEY_DOWN ] ) &&( mapa_y < 40 * 25 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) &&( sprawdz_kolizje( 3 ) == 0 ) )
            {
                scrollY++; mapa_y++;
            }
            else if(( key[ KEY_DOWN ] ) &&( ludek_y <( SCREEN_H - ludek->h ) ) &&( sprawdz_kolizje( 3 ) == 0 ) ) ludek_y++;
           
            speed--; }
       
        render_map_real();
        render_map_collisions();
       
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
        masked_blit( celownik, bufor, 0, 0, mouse_x, mouse_y, celownik->w, celownik->h );
        masked_blit( bufor2, screen, 0, 0, 0, 0, 800, 600 );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
    }
   
   
    remove_int( increment_speed );
    destroy_bitmap( celownik );
    destroy_bitmap( bufor );
    destroy_bitmap( bufor2 );
    destroy_bitmap( teren );
    destroy_bitmap( ludek );
    destroy_bitmap( terenkolizji );
    allegro_exit();
   
    return 0;
}
END_OF_MAIN();

W razie pytań co do kodu, piszcie.
P-45479
pekfos
» 2011-12-11 15:44:01
utrudniasz niesienie sobie pomocy.
1. Nie napisałeś co dokładnie jest nie tak więc niezbyt wiadomo czego szukać.
2. Nie można przetestować działania kodu bo nie ma potrzebnych plików których zawartość może być istotna.
Wgraj kompletną paczkę z projektem. Oczywiście najwygodniej podać kod i powiedzieć "nie działa". Tylko nie dziw się potem, czemu nikt nie odpowiada..
P-45484
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-12 16:29:28
Link do paczki z projektem:
http://www.fileserve.com/file/DVu4rsf/mapa.rar

Główne funkcjonalności mogące sprawiać kłopot zakomentowałem. Gdy włączam grę, to albo nie mogę się w ogóle poruszać, albo nie uwzględnia kolizji, a do tego nie scrolluje mapki.

Problem w tym, że gdy odpalam grę, nie mogę sterować postacią właśnie najprawdopodobniej przez źle napisaną kolizję. Jak już pisałem, podaję współrzędne pixeli kontrolnych (na bitmapie ludzika zaznaczone na niebiesko) do drugiego bufora, gdzie sprawdzam kolizje i jeśli one występują, to w pętli głównej niespełniony zostaje jeden z warunków, także cały ruch w tę stronę powinien być zablokowany i w dodatku powinno ludzika odrzucać o 1px w przeciwną stronę. Na pewno łatwiej byłoby zrobić to na mniejszej mapie, ale ja muszę jeszcze uwzględnić płynny scrolling mapki.
P-45548
« 1 » 2 3
  Strona 1 z 3 Następna strona