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

[SFML, C++] Problem z kafelkami i zapisywanie koordów obiektów

Ostatnio zmodyfikowano 2011-08-19 11:31
Autor Wiadomość
Dark
Temat założony przez niniejszego użytkownika
[SFML, C++] Problem z kafelkami i zapisywanie koordów obiektów
» 2011-08-18 15:28:36
Mam problem z mapa kafelkowa ponieważ jak próbuję ją wyświetlić to między spritami pokazuje mi się 1 pixelowa przestrzeń jak na tym zrzucie, wszystkie kafelki mam umieszczone w tablicy więc powinno nie być tej przestrzeni :\:

http://ifotos.pl/zobacz/zrzut_hahpheh.PNG/

Co mogę zrobić aby takie coś nie następowało? Kod:
C/C++
#include "head.h"

int main()
{
    int map[ 10 ][ 20 ] =
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 1
        { 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 2
        { 1, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 3, 3, 1 }, // 3
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 1 }, // 4
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1 }, // 5
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 1 }, // 6
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 1 }, // 7
        { 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 1 }, // 8
        { 1, 4, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 }, // 9
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 10
    };
    sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Crion" );
    okno.SetFramerateLimit( 60 ); // ustawienie limitu 60 klatek na sekundę
    sf::Event Event;
   
    sf::Image ziemia1;
    ziemia1.LoadFromFile( "kamien1.png" );
    sf::Sprite grounds;
    grounds.SetImage( ziemia1 );
   
    sf::Image _box;
    _box.LoadFromFile( "ludz1.png" );
    _box.CreateMaskFromColor( sf::Color::Black, 0 );
    sf::Sprite box;
    box.SetImage( _box );
   
   
    sf::String text;
    text.SetText( "Skok" );
    text.SetPosition( 400, 50 );
   
    int klatka = 0;
    short int szerokosc_kafel_1 = ziemia1.GetWidth();
    short int dlugosc_kafel_1 = ziemia1.GetHeight();
   
    double a = 800; // wartość przyspieszenia ziemskiego m/s^2
    double v = 0; // prędkość początkowa
    double dt = 0; //inicjalizacja czasu jednej klatki
   
    double vx = 0; // inicjalizacja zmiennej prędkości w trakcie ruchu
    double ax = 1000; // przyspieszenie obiektu m/s^2
    double vx_max = 350; // prędkość maksymalna
    bool jump = true;
   
    for( int y = 0; y < 10; y++ )
    {
        for( int x = 0; x < 20; x++ )
        {
            if( map[ y ][ x ] == 4 )
            {
                box.SetPosition( x * szerokosc_kafel_1, y * dlugosc_kafel_1 );
            }
        }
    }
   
   
    while( okno.IsOpened() )
    {
        for( int y = 0; y < 10; y++ )
        {
            for( int x = 0; x < 20; x++ )
            {
                if( map[ y ][ x ] == 1 )
                {
                    grounds.SetPosition( x * szerokosc_kafel_1, y * dlugosc_kafel_1 );
                    okno.Draw( grounds );
                }
            }
        }
       
        if( klatka <= 30 )
        {
            if( klatka < 15 )
                 box.SetSubRect( sf::IntRect( 0, 0, 40, 40 ) );
           
            else
                 box.SetSubRect( sf::IntRect( 0, 40, 40, 80 ) );
           
            klatka++;
        }
        else
             klatka = 0;
       
        const sf::Input & Input = okno.GetInput();
       
        bool left = Input.IsKeyDown( sf::Key::Left );
        bool right = Input.IsKeyDown( sf::Key::Right );
        bool up = Input.IsKeyDown( sf::Key::Up );
        bool down = Input.IsKeyDown( sf::Key::Down );
       
        dt = double( okno.GetFrameTime() );
       
        v += a * dt;
       
        if( left )
        {
            if( vx - ax * dt > - vx_max )
                 vx -= ax * dt;
           
        }
        else if( right )
        {
            if( vx + ax * dt < vx_max )
                 vx += ax * dt;
           
        }
       
        else
        {
            if( jump )
            {
                if( vx > 0 )
                     vx -= ax * dt / 10;
               
                if( vx < 0 )
                     vx += ax * dt / 10;
               
                if( box.GetPosition().y < 400 )
                     v -= v * dt / 1.5;
               
                if( v <= - 55000 * dt )
                     v = - 55000 * dt;
               
            }
            else
            {
                if( vx > 0 )
                     vx -= ax * dt / 1.5;
               
                if( vx < 0 )
                     vx += ax * dt / 1.5;
               
            }
            if( vx <= vx_max / 10 && vx >= 0 )
                 vx = 0;
           
            if( vx >= - vx_max / 10 && vx <= 0 )
                 vx = 0;
           
        }
       
        box.Move( vx * dt, v * dt );
       
       
        if( box.GetPosition().y >= 400 )
        {
            box.SetY( 400 );
            jump = false;
        }
        else
             jump = true;
       
        if( box.GetPosition().y <= 0 )
             box.SetY( 0 );
       
        if( box.GetPosition().x <= 0 )
             box.SetX( 0 );
       
        if( box.GetPosition().x >= 750 )
             box.SetX( 750 );
       
        if( jump )
             okno.Draw( text );
       
        while( okno.GetEvent( Event ) )
        {
            if( Event.Type == sf::Event::Closed )
                 okno.Close();
           
            if(( Event.Type == sf::Event::KeyPressed ) &&( Event.Key.Code == sf::Key::Escape ) )
                 okno.Close();
           
            if( up && !jump )
                 v -= 55000 * dt;
           
        }
       
       
        okno.Draw( box );
        okno.Display();
        okno.Clear();
    }
   
    return 0;
}

Jak mogę zapisać koordy obiektów? W klasie, strukturze?
P-39421
Thud
» 2011-08-18 16:36:03
Masz poknoconą funkcję rysującą. Innego wytłumaczenia nie widzę. Być może chodzi o reprezentację wysokości i długości pojedyńczej kafelki, funkcja zwracająca wielkość może zwracać dla obrazka np. wartość 800 wysokości (whatever), co jest nieprzydatne, bo komputer liczy od 0. Musisz odjąć 1 od czegoś ale nie wiem od czego, bo nie mamy kodu.

//Edit:
W czymkolwiek co będzie miało zdefiniowane zmienne położenia na siatce kartezjańskiej.
P-39423
Thud
» 2011-08-18 16:41:27
Patrzę na oko i widzę żebyś od GetHeight i Width Sprite'a odjął jeden. Daj znać o rezultatach.
P-39424
Dark
Temat założony przez niniejszego użytkownika
» 2011-08-18 16:44:59
W czymkolwiek co będzie miało zdefiniowane zmienne położenia na siatce kartezjańskiej.

Czyli na przykład robiąc strukturę?:
C/C++
struct Obj
{
    int LG, RG // lewy górny róg, prawy górny róg
    int LD, RD // lewy dolny róg, prawy dolny róg
};
później robiąc obiekt struktury tablicy
C/C++
Obj tablica[ 10 ][ 20 ];
Czy myślę dobrze?

@edit w rogach nachodzą na siebie http://ifotos.pl/zobacz/zrzut_hahpean.PNG/
P-39425
Thud
» 2011-08-18 16:53:47
Jest kilka sposobów (chodź i tak SFML ma swoją obsługę chyba tego dziadostwa? Zapewne tak, lepiej jej użyć):
C/C++
#include <iostream>
struct Point
{
    int X, Y;
};
struct Coordinates
{
    Point LUPoint, LDPoint;
    Point RUPoint, RDPoint;
};
struct Coordinate
{
    Point ObjectPoint;
    int Width;
    int Height;
};
int main()
{
    Coordinates First[ 200 ];
    Coordinate Second[ 200 ];
    std::cout << sizeof( Coordinates ) << " " << sizeof( Coordinate ) << "\n" << sizeof( Point ) << std::endl;
}
P-39426
Gabes
» 2011-08-18 16:59:14
Kafelki masz 39x39 pikseli + 1 piksel ramka.
Zmień kafelki na 40x40 albo zmniejsz wyświetlanie na 39x39.
Ramka w innym kolorze niz tło może to kolor przezroczystości w kafelku.
P-39427
Dark
Temat założony przez niniejszego użytkownika
» 2011-08-18 17:00:06
@ Thud A jak dodać do tego obiekt?
P-39428
Dark
Temat założony przez niniejszego użytkownika
» 2011-08-18 17:01:34
Nie mam żadnej ramki w kafelku, mam cały kafelek 40x40 wypełniony tym kamieniem
P-39429
« 1 » 2 3
  Strona 1 z 3 Następna strona