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

[SFML]Pozycja x y kafli w mapach kafelkowych

Ostatnio zmodyfikowano 2013-01-19 10:04
Autor Wiadomość
DanielSC
Temat założony przez niniejszego użytkownika
[SFML]Pozycja x y kafli w mapach kafelkowych
» 2013-01-18 17:22:31
Chciałbym się was zapytać czy polozenie x ,y na osi odpowiada czemus takiemu dla mapy kafelkowej : int mapa[x][y]
czyli jak bym wstawił takie wartosci jak x=1,x=1; to pozcja jednego kaflaw rowna jest (1,1) ?
P-74296
Mrovqa
» 2013-01-18 17:38:27
czyli jak bym wstawił takie wartosci jak x=1,x=1; to pozcja jednego kaflaw rowna jest (1,1) ?

Zależy co masz konkretnie na myśli. Kafel może mieć różną wielkość = przy wyliczaniu współrzędnych musisz użyć przeliczników.
P-74298
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-18 18:32:39
Zaluszżmy ze kafel ma wysokosc 50 i szerokosc 50
P-74300
Mrovqa
» 2013-01-18 18:43:17
Czego nie rozumiesz?
C/C++
int mapa[ X ][ Y ];
//wyliczanie pozycji (w pixelach)
int pix_pos_x = x * ROZMIAR_KAFLA_X;
int pix_pos_y = y * ROZMIAR_KAFLA_Y;
gdzie (x,y) to indeksy kafla w tablicy 'mapa', a (pix_pos_x,pix_pos_y) to współrzędne górnego lewego rogu na ekranie/w buforze.
P-74302
Gabes
» 2013-01-18 18:49:12
P-74304
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-18 20:00:03
W tamtym temacie wogóle mapy nie umiałem wyswietlić :D

A gdybym miał np mape z 100 kafelkami i kwadrat.
Chciałbym sprawdzać kolizje dla kazdego kafla a pisanie wszystkiego po kolei było by czasochłonnym zadaniem.
Prubowałem użyć pętli for np:

       
C/C++
for( i = 0; i < 5; i++ )
{
    for( j = 0; j < 5; j++ )
    {
        if( mapa1[ j ][ i ] == 1 )
             Aplikacja.Draw( trawa );
       
        trawa.SetPosition( i * s2, j * w2 );
        kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), s2, w2 );
        cout << kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), s2, w2 ) << endl;
        if( sterowanie.IsKeyDown( Key::Left ) && kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), 100, 100 ) == false )
        {
            kwadrat1.Move( - 0.2, 0 );
            x1 -= 0.2;
           
        }
        if( sterowanie.IsKeyDown( Key::Right ) && kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), 100, 100 ) == false )
        {
            kwadrat1.Move( 0.2, 0 );
            x1 += 0.2;
        }
        if( sterowanie.IsKeyDown( Key::Down ) && kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), 100, 100 ) == false )
        {
            kwadrat1.Move( 0, 0.2 );
            y1 += 0.2;
           
        }
        if( sterowanie.IsKeyDown( Key::Up ) && kolizja( x1, y1, 100, 100,( i * s2 ),( j * w2 ), 100, 100 ) == false )
        {
            kwadrat1.Move( 0, - 0.2 );
            y1 -= 0.2;
        }
       
    }
}


A tu funkcja:


C/C++
bool kolizja( double x1, double y1, double s1, double w1, double x2, double y2, double s2, double 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;
   
};

Ale program nie działa tak jak założyłem że po wykryciu kolizji z obojetnie jakims kaflem
kwadrat1 nie moze sie ruszyc.
P-74306
Berux
» 2013-01-18 20:03:47
Wstaw kod w
[cpp] [/cpp]
P-74307
SeaMonster131
» 2013-01-18 21:20:33
Pozycję kafelka, na którym aktualnie znajduje się obiekt możesz sobie wyliczyć tak:
C/C++
int kafX = obiekt.x / szerokosc_kafelka;
int kafY = obiekt.y / wysokosc_kafelka;

if( mapa[ kafX ][ kafY ] == 1 ) { }
Wziąłem pod uwagę lewy górny wierzchołek obiektu, dla pozostałych po prostu dodajesz szerokość / wysokość obiektu.
P-74314
« 1 » 2
  Strona 1 z 2 Następna strona