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

[SFML]Poruszanie się postacią

Ostatnio zmodyfikowano 2014-05-03 13:35
Autor Wiadomość
GGG205
Temat założony przez niniejszego użytkownika
[SFML]Poruszanie się postacią
» 2014-04-01 14:58:18
Cześć! Moja postać się porusza, ale w zły sposób. Kiedy trzymam klawisz idzie do przodu i przyśpiesza, a następnie jak zmieniam klawisz ciągle idzie w tą samą stronę.

Kod klasy:

C/C++
enum DIRECTIONS { DOWN = 0, LEFT, RIGHT, UP };

class Character
{
private:
    int hp;
    int maxhp;
    int mp;
    int maxmp;
    int frame;
    float speed;
    bool walk;
    Texture texture;
    Sprite sprite;
    DIRECTIONS DIR;
    Clock nextFrame;
public:
   
    int x, y;
   
    Character()
    {
        hp = 100;
        maxhp = 100;
       
        mp = 100;
        maxmp = 100;
       
        texture.loadFromFile( "Admin.png" );
        sprite.setTexture( texture );
       
        DIR = DOWN;
        frame = 0;
        speed = 0.2;
        x = 10;
        y = 10;
        sprite.setPosition( x, y );
    }
   
    Character( int h, int mh, int m, int mm, string name )
        : hp( h )
        , maxhp( mh )
        , mp( m )
        , maxmp( mm )
    {
        if( !texture.loadFromFile( name ) )
             cout << "Sorry, but we no found image" << endl;
        else sprite.setTexture( texture );
       
        DIR = DOWN;
        frame = 0;
        speed = 0.2;
        x = 10;
        y = 10;
        sprite.setPosition( x, y );
    }
   
    void Draw( RenderWindow & wnd )
    {
        sprite.setTextureRect( IntRect( frame * 32, DIR * 48, 32, 48 ) );
        wnd.draw( sprite );
    }
   
    void Walking()
    {
        if( nextFrame.getElapsedTime().asSeconds() > speed )
        {
            nextFrame.restart();
           
            if( Keyboard::isKeyPressed( Keyboard::Up ) )
            {
                DIR = UP;
                frame += 1;
                walk = true;
                sprite.move( 0, y++ );
            }
            else if( Keyboard::isKeyPressed( Keyboard::Down ) )
            {
                DIR = DOWN;
                frame += 1;
                walk = true;
                sprite.move( 0, y-- );
            }
            else if( Keyboard::isKeyPressed( Keyboard::Right ) )
            {
                DIR = RIGHT;
                frame += 1;
                walk = true;
                sprite.move( x++, 0 );
            }
            else if( Keyboard::isKeyPressed( Keyboard::Left ) )
            {
                DIR = LEFT;
                frame += 1;
                walk = true;
                sprite.move( x--, 0 );
            }
            else walk = false;
           
        }
        if( frame >= 4 || walk == false )
             frame = 0;
       
        cout << "Frame: " << frame << "Player x: " << x << " y: " << y << endl;
    }
   
};

Mógłby ktoś mi jeszcze podać wskazówki jak mam nie pisać programów ? Założę się nawet, że napisalibyście o 10 linijek mniej.
P-107561
pekfos
» 2014-04-01 15:46:56
Poczytaj o działaniu move() i setPosition().
P-107562
colorgreen19
» 2014-04-01 20:02:04
Układ współrzędnych w sfml-u masz od górnego lewego narożnika, więc masz złe poruszanie wertykalne postacią (przy up, x powinien malec.
Poza tym u ciebie szybkosc chodu zależy od szybkosci procesora, a że sa one różne to bedziesz miał różne szybkości chodu przy różnych komputerach.
Osobiście polecam ci system "sterowania" ruchem za pomoca prędkości. Jakkolwiek to brzmi
C/C++
void Move( sf::Time elapsed )
{
    shape.move( velocity.x * elapsed.asSeconds(), velocity.y * elapsed.asSeconds() ); //shape-textura posataci
}

void SetVelocity( int velocityX, int velocityY )
{
    velocity.x = velocityX; //Vector2f velocity
    velocity.y = velocityY;
}
C/C++
if( Keyboard::isKeyPressed( Keyboard::Left ) )
{
    player->SetVelocity( - 25, player->GetVelocity().y );
}
else if( Keyboard::isKeyPressed( Keyboard::Right ) )
{
    player->SetVelocity( 25, player->GetVelocity().y );
}
u mnie np. tak całość wygląda
potem łatwo zaimplementować grawitacje, np:
C/C++
void Archer::Update( sf::Time elapsed )
{
    velocity.y += 1;
   
    Move( elapsed );
}
itd, itd...   Takie rozwiązanie daje dużo więcej możliwości i jest łatwiejsze (moim zdaniem) w uzyciu/operowaniu. Jak teraz nie widzisz, zrozumiesz przy poźniejszych trudnościach ;)
P-107585
GGG205
Temat założony przez niniejszego użytkownika
» 2014-04-02 09:29:43
Dzięki colorgreen, rozjaśniłeś mi tą mózgownice.
P-107606
GGG205
Temat założony przez niniejszego użytkownika
Wolno chodzi.
» 2014-05-03 13:08:37
Moja postać chodzi strasznie wolno. Starałem się zrobić coś jak tłumaczył colorgreen, ale źle chyba jest obliczany czas. Czy tutaj jest źle obliczany jest czas ? Próbowałem uzyskać informacje o Real Time, ale w postach użytkowników było coś o tym, aby nie robić ruchu w eventach. ;/. Właśnie zacząłem czytaj o Handling TIme na stronie SFML, może coś załapię.

Main.cpp

C/C++
int main()
{
   
    RenderWindow Window( VideoMode( 640, 420, 32 ), "Spartan" );
   
    Event zdarzenie;
   
    Clock c;
   
   
    Hero test( "test", "Admin.png", 0, 0, 100 );
   
    while( Window.isOpen() )
    {
        Time t = c.getElapsedTime();
       
        while( Window.pollEvent( zdarzenie ) )
        {
            switch( zdarzenie.type )
            {
            case Event::Closed: Window.close(); break;
            }
        }
        cout << t.asSeconds() << endl;
        Window.clear( Color::Blue );
        test.update( t );
        test.move( t );
        test.draw( Window );
        Window.display();
        c.restart();
    }
    return 0;
}

Character.cpp (część kodu)

C/C++
void Character::SetPosition( float x, float y )
{
    velocity.x = x;
    velocity.y = y;
}

Position Character::GetPosition()
{
    return GetPosition();
}

void Character::move( Time elapsed )
{
    DIRECTIONS DIR = DOWN;
   
    SPRplayer.setTextureRect( IntRect(( frame * 32 ) * elapsed.asSeconds(), DIR * 48, 32, 48 ) );
    SPRplayer.move( velocity.x * elapsed.asSeconds(), velocity.y * elapsed.asSeconds() );
}

Gracz porusza się z prędkością wartości = 25.
P-109153
colorgreen19
» 2014-05-03 13:35:36
Zapoznaj się z tym tematem, (przeczytaj całość a nie porzucaj ze względu na jego tytuł) + pętla stałokrokowa
http://cpp0x.pl/forum/temat/?id=15168
P-109159
« 1 »
  Strona 1 z 1