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

[SFML 2.0] Mapa kafelkowa

Ostatnio zmodyfikowano 2013-01-19 23:12
Autor Wiadomość
Kopczak1995
Temat założony przez niniejszego użytkownika
[SFML 2.0] Mapa kafelkowa
» 2013-01-19 19:36:50
Witam. Szukam od jakiegoś sposobu na wyświetlanie mapy kafelkowej w SFML'u.
Oczywiście wpadłem na pomysł takiego oto wynalazku:
C/C++
sf::Texture obrazek1;
obrazek1.loadFromFile( "obrazek1.jpg" );
Sprite sprajt1;
sprajt1.setTexture( obrazek1 );

sf::Texture obrazek2;
obrazek2.loadFromFile( "obrazek2.jpg" );
Sprite sprajt2;
sprajt2.setTexture( obrazek2 );

Sprite mapa[ 4 ][ 4 ] = {
    { sprajt1, sprajt1, sprajt1, sprajt1 },
    { sprajt1, sprajt1, sprajt1, sprajt1 },
    { sprajt1, sprajt1, sprajt1, sprajt1 },
    { sprajt2, sprajt2, sprajt2, sprajt2 }
};

///i na samym końcu powinno być wyświetlanie no i... jak?
///bo wiadomo to nie zadziała:
oknoAplikacji.draw( mapa );
oknoAplikacji.display();
Ktoś może mi w tym pomóc? Nie mam pomysłu jak to rozwiązać :(
P-74422
Wasilek
» 2013-01-19 19:48:37
Najzwyklejsza podwójna pętla :)

C/C++
for( int i = 0; i < szerokosc_mapy; i++ )
{
    for( int j = 0; j < wysokosc_mapy; j++ )
    {
        oknoAplikacji.draw( mapa[ i ][ j ] );
    }
}
P-74423
Kopczak1995
Temat założony przez niniejszego użytkownika
» 2013-01-19 20:01:39
@Up
Hmmm... To po prostu trza to pętlą wyświetlać?! Ja (!@#$%^&*)! Nie wpadłem na to :D Myślałem, że to będzie jakaś funkcja cudowna SFML'a albo inne "wygibasy" związane z konstrukcją tejże biblioteki... Fail :P
Tak czy inaczej dzięki...

Choć z drugiej strony... To nie miałem okazji wyprodukować bardziej złożonych pętli i pewnie i tak bym tego nie zrobił...
P-74425
Kopczak1995
Temat założony przez niniejszego użytkownika
» 2013-01-19 21:22:33
A więc jednak tu wracam... Coś mi nie chce działać i pytanie co? Tutaj kod:
C/C++
#include <SFML/Graphics.hpp>

using namespace sf;

int main()
{
    RenderWindow oknoAplikacji( VideoMode( 800, 600, 32 ), "Plansza" );
    oknoAplikacji.setFramerateLimit( 60 );
   
    sf::Texture cegly;
    cegly.loadFromFile( "bricks.png" );
    Sprite spr0;
    spr0.setTexture( cegly );
   
    sf::Texture chmurka_1;
    chmurka_1.loadFromFile( "1.png" );
    Sprite spr1;
    spr1.setTexture( chmurka_1 );
   
    sf::Texture chmurka_2;
    chmurka_2.loadFromFile( "2.png" );
    Sprite spr2;
    spr2.setTexture( chmurka_2 );
   
    sf::Texture chmurka_3;
    chmurka_3.loadFromFile( "3.png" );
    Sprite spr3;
    spr3.setTexture( chmurka_3 );
   
    sf::Texture chmurka_4;
    chmurka_4.loadFromFile( "4.png" );
    Sprite spr4;
    spr4.setTexture( chmurka_4 );
   
    sf::Texture puste_pole;
    puste_pole.loadFromFile( "X.png" );
    Sprite sprX;
    sprX.setTexture( puste_pole );
   
    Sprite mapa[ 15 ][ 20 ] =
    {
        { spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2 },
        { spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4 },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { sprX, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1 },
        { sprX, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3 },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2, spr1, spr2 },
        { spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4, spr3, spr4 },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX, sprX },
        { spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0 },
        { spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0, spr0 },
    };
   
    while( oknoAplikacji.isOpen() )
    {
        Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == Event::Closed )
                 oknoAplikacji.close();
           
        }
    }
    oknoAplikacji.clear( sf::Color::Blue );
    for( int i = 0; i < 15; i++ )
    {
        for( int j = 0; j < 20; j++ )
        {
            oknoAplikacji.draw( mapa[ i ][ j ] );
        }
    }
    oknoAplikacji.display();
}
Gdzie się pomyliłem?
Kod się kompiluje i aplikacja mi się włącza ale nie chce mi poprawnie wyświetlić. Ba! Wogóle mi nie wyświetla niczego...
P-74430
killjoy
» 2013-01-19 21:57:01
Tak na moje oko nie podajesz położenia konkretnego kafla, a co za tym idzie, one się rysują gdzie im sie żywnie podoba :P
Kolega @Wasilek podał ci dobre rozwiązanie, ale nie pełne powinno to wyglądać mniej więcej tak:

C/C++
for( int i = 0; i < 15; i++ )
{
    for( int j = 0; j < 20; j++ )
    {
        mapa[ i ][ j ].setPosition( i * szerkosc_kafla, j * wysokosc_kafla );
        oknoAplikacji.draw( mapa[ i ][ j ] );
    }
}
 
P-74431
Kopczak1995
Temat założony przez niniejszego użytkownika
» 2013-01-19 22:33:47
@Up
Dzięki :) Ale pojawił się nowy problem... Może nawet pokażę na obrazku co skopałem (to chyba nadaje się do działu śmieszne):
Epic fail :)
Epic fail :)

No cóż... Chyba mi odwrotnie powstawiało obrazki :) Nie po tych osiach co trza było :P
Niemniej jednak jestem wdzięczny za pomoc.

@Edit
Poprawa tego zajmuje mi dłużej niż się początkowo spodziewałem...
P-74433
killjoy
» 2013-01-19 22:41:47
Z tego co widze to kafle nie mają tej samej wys i szer, więc mogłem dać na odwrót mnożenie w pętli i wyszły takie cuda :) Spróbuj zmienić na takie coś:
mapa[ i ][ j ].setPosition( i * wysokosc_kafla, j * szerkosc_kafla );

Jak to nic nie da, to znaczy, że błąd jest gdzie indziej.
P-74434
Kopczak1995
Temat założony przez niniejszego użytkownika
» 2013-01-19 22:50:31
Kafelki są tej samej wysokości (wszystkie 40x40 px) ale jak mi już wyświetla to "z góry na dół", a nie "z lewa na prawo" po czym kolejny wiersz. Tutaj przykład, który by wyjaśnił moje zawiłe poniekąd rozumowanie :)  
C/C++
tabela[ 5 ][ 5 ] =
{ { 1, 1, 1, 1, 1 },
    { 2, 2, 2, 2, 2 },
    { 3, 3, 3, 3, 3 },
    { 4, 4, 4, 4, 4 },
    { 5, 5, 5, 5, 5 } };
I jak mam coś takiego to mi wyświetla:
12345
12345
12345
12345
12345
A ja chciałem wyświetlać odwrotnie czyli tak:
11111
22222
33333
44444
55555
Mam nadzieję, że zrozumiale wyjaśniłem bo jakoś nie wiedziałem jak to powiedzieć :P
P-74435
« 1 » 2
  Strona 1 z 2 Następna strona