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

wykrywanie krawędzi przez postać sterowaną

Ostatnio zmodyfikowano 2015-11-05 21:22
Autor Wiadomość
tolek
Temat założony przez niniejszego użytkownika
wykrywanie krawędzi przez postać sterowaną
» 2015-10-26 16:31:03
Witam,
Piszę swoją grę w C++, Code:Block'sie i wykorzystuję bibliotekę WinBGIm (mam narzuconą z góry bibliotekę). Gra jest podobna do pacmana, problem związany jest z nieodbijaniem się postaci od ścian labiryntu. Mapę mam zapisaną jako mapę bitową (0 i 1) i nie mam pojęcia czy mam odczytywać numery na mapie i poruszać się po tych ustalonych, czy też odczytywać kolor krawędzi labiryntu. Niestety nie mam pomysłu na funkcję jaką mógłbym wykorzystać. Wiem, że powinna się ona znaleźć w miejscu poruszania się postaci (przynajmniej tak mi się wydaje).Ktoś pomoże?
P-139216
pekfos
» 2015-10-26 16:49:54
Zależy, co jest jednostką mapy i jaką chcesz dać swobodę poruszania się graczowi. Jeśli bit mapy oznacza kwadrat o określonych z góry rozmiarach i gracz może, nie licząc animacji ruchu, znajdować się tylko na jednym polu naraz (na środku pola), to wystarczy sprawdzać, czy pole, na które chcesz wykonać ruch, nie jest ścianą. Jeśli gracz ma mieć pełną swobodę ruchów, byle by nie nachodził na ściany, możesz użyć kolizji prostokąt-prostokąt, koło-prostokąt, lub pixel perfect z prostokąt-prostokąt w roli filtra.
P-139218
tolek
Temat założony przez niniejszego użytkownika
» 2015-10-27 00:39:55
no to tak, podam kod mojej mapy:

C/C++
#define POKAZ 1
#define UKRYJ 0
#define SZER 50
#define WYS 30

void mapa( int x, int y ) {
    char rys[ WYS ][ SZER ] = {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        ..........................................tu jest narysowany labirynt, ucialem to.....................................................
        { 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    };
    int dl_x = 1000 / SZER;
    int dl_y = 600 / WYS;
    for( y = 0; y < WYS; y++ )
    for( x = 0; x < SZER; x++ )
    {
        if( rys[ y ][ x ] != 0 )
        {
            setcolor( WHITE );
            bar( x * dl_x, y * dl_y, x * dl_x + 20, y * dl_y + 20 );
        }
    }
}

i funkcja, która miałaby odczytywać kolor(kolor ścian to biały) o 20 pikseli przed postacią (wartość przykładowa), dla postaci poruszającej się np. w prawo:
C/C++
case RIGHT:
if( x < maxX - 285 - 5 ) x = x + 5; //ten kod dotyczy granicy prawej oraz o ile px przemieszcza się postać

if( getpixel( x + 20, y ) == WHITE ) //tu ten warunek odczytu kolorow
     break;

Oczywiście nie działa to zgodnie z oczekiwaniami :(
P-139234
Rashmistrz
» 2015-11-05 21:22:05
Według mnie najprościej w tym przypadku jest sprawdzić
czy pole, na które nasza postać miałaby wejść, jest ścianą...

// Heh... Mało wniosłem do tematu. To samo też Pekfos powiedział...
P-139684
« 1 »
  Strona 1 z 1