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

[SFML 1.6] Wyświetlanie fragmętu Mapy Kafelkowej

Ostatnio zmodyfikowano 2013-02-28 18:02
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML 1.6] Wyświetlanie fragmętu Mapy Kafelkowej
» 2013-02-21 15:07:46
Mam mapę kafelkową o wymiarach 160x160 i chciałbym wyświetlić fragment tej mapy o wymiarach powiedzmy 40x40 Tylko problem w tym że nie wiem jak to zrobić? Czy ktoś mógłby podać kawałek gotowego kodu ilustrującego to zagadnienie? Dodam jeszcze że wyświetlanie całej mapy o wymiarach np.60x60 mam opanowane. Tą mapę wyświetlam poniższym fragmentem kodu:

C/C++
for( int y = 0; y < 4; y++ )
{
    for( int x = 0; x < 4; x++ )
    {
        if( mapa[ y ][ x ] == 1 )
             sprajt1.SetPosition( szer * x, wys * y );
       
        aplikacja.Draw( sprajt1 );
    }
}
 
P-76613
SeaMonster131
» 2013-02-21 16:33:24
Najlepiej zmodyfikować zmienne tworzone w pętli for.
C/C++
for( int y = 0; y < 4; y++ )
{
    for( int x = 0; x < 4; x++ )
    ...

Wyświetlasz mapę od 0 do 4, gdy zmodyfikujesz wartość początkową x/y i końcową, to wyświetlisz inny fragment mapy.
P-76621
RazzorFlame
» 2013-02-21 19:12:27
Chyba chodziło mu o wycięcie fragmentu obrazka:
sprajt1.SetSubRect( sf::IntRect( odX, odY, doX, doY ) );
Ta metoda ustawia prostokąt który będzie wyświetlany (ten prostokąt to część mapy bitowej), gdzie odX i odY to pozycje początkowego wierzchołka prostokąta, a doX i doY to pozycje końcowego wierzchołka.
P-76650
wojownik266
Temat założony przez niniejszego użytkownika
» 2013-02-22 11:26:10
Trochę pokracznie napisałem to o co mi chodzi.... Chodzi mi o takie wyświetlanie mapy jak w tym tutorialu easykodera, którego nie rozumiem: http://www.easykoder.vot.pl/arty/wyswietlanie_mapy
P-76700
RazzorFlame
» 2013-02-22 11:32:17
Czy chodzi o to żeby wyświetlać dany kawałek mapy którą masz powiedzmy zapisaną tak:
C/C++
int mapka[][]
{
    .....
}
Więc mamy np pozycje mapy: mX, i mY
wtedy wyświetlasz ileś kafelków (np 5) tak: for(int x = mX; x < mX + 5; x++) analogicznie z mY.
P-76702
Gabes
» 2013-02-22 11:39:33
Załóżmy że mamy tablice mape kafli, ekran 800x600:
C/C++
int Tab[ 15 ][ 20 ] =
{
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 2, 1, 3 },
    { 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 },
    { 2, 1, 2, 2, 1, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 0 },
    { 2, 1, 2, 2, 1, 2, 0, 2, 0, 1, 1, 1, 0, 2, 0, 0, 0, 0, 2, 2 },
    { 1, 1, 1, 2, 1, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 1, 0, 2 },
    { 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2 },
    { 2, 1, 1, 1, 1, 2, 1, 1, 1, 0, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2 },
    { 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 0, 1, 2, 1, 2, 2, 1, 2, 2 },
    { 1, 2, 2, 1, 1, 0, 1, 1, 0, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, 2 },
    { 1, 1, 2, 1, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2 },
    { 2, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
    { 1, 1, 2, 2, 2, 2, 1, 2, 0, 2, 2, 2, 2, 2, 1, 2, 2, 2, 0, 2 },
    { 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 1, 1, 0, 0, 0 },
    { 2, 1, 2, 2, 0, 2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 0, 2 },
    { 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 1, 0, 0, 3 }
};
Bitmapa 160x160, jeden fragment 40x40 pikseli(4x4).
C/C++
#include <SFML/Graphics.hpp>
#include"tab.h" // tablica w  pliku tab.h
using namespace sf;
bool Smooth = false;
int szer = 40, wys = 40;
int main()
{
    RenderWindow program( VideoMode( 800, 600, 32 ), "Mapa" );
    Image obrazek;
    obrazek.SetSmooth( Smooth );
    obrazek.LoadFromFile( "mapa.png" );
    Sprite sprite;
    sprite.SetImage( obrazek );
    while( program.IsOpened() )
    {
        Event zdarzenie;
        while( program.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed ) program.Close();
           
        }
        program.Clear( Color( 160, 160, 160, 0 ) );
        for( int y = 0; y < 15; y++ ) {
            for( int x = 0; x < 20; x++ ) {
               
                sprite.SetSubRect( IntRect( Tab[ y ][ x ] % 4 * szer, Tab[ y ][ x ] / 4 * wys,
                Tab[ y ][ x ] * szer + szer, Tab[ y ][ x ] * wys + wys ) );
                sprite.SetPosition( szer * x, wys * y );
                program.Draw( sprite );
            }
        };
        program.Display();
    }
    return 0;
}

Bitmapa 640x40, jeden fragment 40x40 pikseli(16x1).
fragment:
C/C++
program.Clear( Color( 160, 160, 160, 0 ) );
for( int y = 0; y < 15; y++ ) {
    for( int x = 0; x < 20; x++ ) {
       
        sprite.SetSubRect( IntRect( Tab[ y ][ x ] * szer, 0, Tab[ y ][ x ] * szer + szer, wys ) );
        sprite.SetPosition( szer * x, wys * y );
        program.Draw( sprite );
    }
};
mam nadzieje że nie przekombinowałem.
P-76703
polkom21
» 2013-02-22 11:41:16
C/C++
void DrawMap( sf::RenderWindow & window, int map[][ 100 ], int mapSizeX, int mapSizeY, sf::Texture texture, int positionX, int positionY )
{
    int klatkaX, klatkaY, objectID;
    klatkaX = positionX / 30; // 30 to szerokość klatki
    klatkaY = positionY / 30; // 30 to wysokość klatki
    sf::Vector2i StartDraw( klatkaX - 15, klatkaY - 11 ); // tu musisz ustawić sobie ile klatek ma się wyświetlać. Ustawić to musisz w zależności od rozdzielczości jaką masz ustawioną w grze i jakie duże klatki ma grafika.
    sf::Vector2i EndDraw( klatkaX + 15, klatkaY + 12 );
   
    sf::Sprite obj( texture );
   
    for( int x = StartDraw.x; x < EndDraw.x; x++ )
    {
        for( int y = StartDraw.y; y < EndDraw.y; y++ )
        {
            if( x < 0 ) objectID = 1;
            else if( y < 0 ) objectID = 1;
            else objectID = map[ x ][ y ];
            // Tu już masz wyświetlanie odpowiednich elementów grafiki. Możesz sobie to przebudować tak aby Tobie pasowało.
            if( objectID >= 10 ) obj.setTextureRect( sf::IntRect(( objectID - 10 ) * 30, 30, 30, 30 ) );
           
            if( objectID >= 20 ) obj.setTextureRect( sf::IntRect(( objectID - 20 ) * 30, 60, 30, 30 ) );
           
            if( objectID >= 30 ) obj.setTextureRect( sf::IntRect(( objectID - 30 ) * 30, 90, 30, 30 ) );
           
            if( objectID >= 40 ) obj.setTextureRect( sf::IntRect(( objectID - 40 ) * 30, 120, 30, 30 ) );
           
            if( objectID >= 50 ) obj.setTextureRect( sf::IntRect(( objectID - 50 ) * 30, 150, 30, 30 ) );
           
            if( objectID < 10 ) obj.setTextureRect( sf::IntRect( 30 * objectID, 0, 30, 30 ) );
           
            obj.setPosition( x * 30, y * 30 );
            window.draw( obj );
        }
    }
}
To działa na podstawie pozycji gracza ale tylko w centrum. Jak byś chciał jakieś ograniczenia albo coś to musisz sobie wprowadzić kilka warunków i będzie działało. Jest to pisane na SFML 2.0 ale nie powinieneś mieć problemu żeby przepisać to na SFML 1.6.
P-76705
wojownik266
Temat założony przez niniejszego użytkownika
» 2013-02-22 14:14:32
To co przeczytałem powyżej tego postu, przerosło moje najśmielsze oczekiwania... Tak ze nie pozostaje mi nic innego jak powiedzieć wszystkim: Bardzo, bardzo dziękuję!!! I życzę miłego dnia!!!
P-76707
« 1 » 2
  Strona 1 z 2 Następna strona