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: 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. |
|
pekfos |
» 2014-04-01 15:46:56 Poczytaj o działaniu move() i setPosition(). |
|
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 void Move( sf::Time elapsed ) { shape.move( velocity.x * elapsed.asSeconds(), velocity.y * elapsed.asSeconds() ); }
void SetVelocity( int velocityX, int velocityY ) { velocity.x = velocityX; velocity.y = velocityY; }
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: 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 ;) |
|
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. |
|
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 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) 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. |
|
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 |
|
« 1 » |