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

SFML - poruszanie się postacią.

Ostatnio zmodyfikowano 2015-07-16 20:41
Autor Wiadomość
executor1909
Temat założony przez niniejszego użytkownika
SFML - poruszanie się postacią.
» 2015-07-16 17:55:01
Na podstawie kursu "Wytwarzanie gier 2D" stworzyłem takie coś:
C/C++
#include <SFML/Graphics.hpp>

struct RObiekt
{
    double x;
    double y;
    double velocity;
   
    double ruchX;
    double ruchY;
   
    RObiekt( double f_x = 0.0, double f_y = 0.0, double f_velocity = 1.0 )
        : x( f_x )
         , y( f_y )
         , velocity( f_velocity )
    { }
   
    void aktualizujpolozenie()
    {
        if( ruchX > velocity )
             ruchX = velocity;
       
        if( ruchX <- velocity )
             ruchX = - velocity;
       
        if( ruchY > velocity )
             ruchY = velocity;
       
        if( ruchY <- velocity )
             ruchY = - velocity;
       
        x += ruchX;
        y += ruchY;
       
        ruchX = 0;
        ruchY = 0;
    }
   
    void Przesun( int deltaX, int deltaY )
    {
        ruchX = deltaX;
        ruchY = deltaY;
    }
   
};

int main()
{
    sf::RenderWindow okienko( sf::VideoMode( 1366, 768, 32 ), "JAROCK - Shadow of GrabaGra", sf::Style::Fullscreen );
   
    RObiekt Gracz1( 0, 0, 5.0 );
   
    sf::Texture tekstura;
    tekstura.loadFromFile( "tekstura.png" );
   
    sf::Sprite Postac1;
    Postac1.setTexture( tekstura );
    Postac1.setScale( 0.5, 0.5 );
   
    while( okienko.isOpen() )
    {
        sf::Event zdarzenie;
        while( okienko.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 okienko.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 okienko.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
            {
                Postac1.setOrigin( 0, 0 );
                Postac1.setScale( 0.5, 0.5 );
               
                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::LShift )
                     Gracz1.Przesun( 0.5, 0.0 );
                else
                     Gracz1.Przesun( 0.2, 0.0 );
               
            }
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
            {
                Postac1.setOrigin( 118, 0 );
                Postac1.setScale( - 0.5, 0.5 );
               
                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::LShift )
                     Gracz1.Przesun( - 0.5, 0.0 );
                else
                     Gracz1.Przesun( - 0.2, 0.0 );
               
            }
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )
            {
                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::LShift )
                     Gracz1.Przesun( 0.0, 0.5 );
                else
                     Gracz1.Przesun( 0.0, 0.2 );
               
            }
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )
            {
                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::LShift )
                     Gracz1.Przesun( 0.0, - 0.5 );
                else
                     Gracz1.Przesun( 0.0, - 0.2 );
               
            }
        }
       
        okienko.clear( sf::Color::Green );
        Gracz1.aktualizujpolozenie();
        Postac1.setPosition( Gracz1.x, Gracz1.y );
        okienko.draw( Postac1 );
        okienko.display();
       
    }
   
   
    return 0;
   
}
Tekstura działa ładnie, przy naciskaniu strzałek zmienia się jej kierunek. Problem polega na tym, że się nie porusza. Co robię źle?
P-134768
Patrycjerz
» 2015-07-16 18:22:00
Próbuję zanalizować twój kod i jedno mi się nie podoba, a rzecz jasna konstruktor. Dlaczego w jego deklaracji masz już wpisane wartości argumentów. Przecież podajesz je w trakcie tworzenia obiektu tej twojej struktury. A tak poza tym, to powinieneś tworzyć klasy, a nie struktury, gdy mówimy o programowaniu obiektowym, gdyż one pochodzą z języka C.

EDIT: Moja gafa, rzeczywiście ten konstruktor może tak wyglądać :)
P-134769
executor1909
Temat założony przez niniejszego użytkownika
» 2015-07-16 18:36:48
Co do klas to jestem tego świadomy, na razie analizowałem tylko ten poradnik i tam właśnie był podobny kod z konstruktorem. Kod oczywiście wymaga "paru" zmian, na tą chwilę jest to tylko testowy, do mojej gry zrobię zupełnie inny. Chcę sobie na nim popróbować różne rzeczy. Wygląda, jakby funkcja aktualizujpozycje() nie spełniała swojego zadania. Mam w niej jakiś błąd? A może w złej kolejności ustawiłem funkcje na końcu pętli gry?
P-134771
Patrycjerz
» 2015-07-16 19:00:06
Skompilowałem ten twój kod i doszedłem do wniosku, że powinieneś zamienić te zmienne z double na float. Dlatego, ponieważ metoda setPosition ma floaty w swojej definicji (w argumentach). Stosując inny typ ryzykujesz nieprzewidzianym zachowaniem programu. Także zmienne ruchX i ruchY zainicjuj w konstruktorze na wartość 0, ponieważ mogą one mieć jakąkolwiek początkową wartość i zrujnuje ci to twoją mechanikę. Tak to kod działa dobrze. Jak jeszcze coś wymyślę, to napiszę :D
P-134772
Patrycjerz
» 2015-07-16 19:03:12
I jeszcze jedno. Nie wrzucaj do metody setPosition ułamkowych wartości. Jeśli chcesz już takie mieć, to przynajmniej je zaokrąglij do wartości całkowitych, np. poprzez funkcję round.
P-134773
executor1909
Temat założony przez niniejszego użytkownika
» 2015-07-16 19:04:49
Ale ja jestem głupi! Drugi raz ten sam błąd! Już wiem, stworzyłem funkcję Przesun( int, int), a w danych wpisałem 0.5... Po zmianie tego na float i innych double na float działa dobrze :D Dziękuję za pomoc!
P-134774
Patrycjerz
» 2015-07-16 19:05:52
Mam jeszcze pytanie. Czy masz zamiar uzależnić w przyszłych swoich grach ruch od czasu?
P-134775
executor1909
Temat założony przez niniejszego użytkownika
» 2015-07-16 19:08:03
Chętnie bym to zrobił, byłoby ciekawie. :D Na razie niestety nie za bardzo wiem jak :/
P-134776
« 1 » 2
  Strona 1 z 2 Następna strona