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

[SFML] ruch postaci i zmiana texturki

Ostatnio zmodyfikowano 2012-04-28 20:43
Autor Wiadomość
ksry
Temat założony przez niniejszego użytkownika
[SFML] ruch postaci i zmiana texturki
» 2012-04-26 21:19:41
Witam. Korzystam z SFML 2.0 i mam pewien problem. Mianowicie chciałbym zrobić, aby podczas ruchu wraz ze zmianą pozycji przechodziły klatki tej postaci. Zastanawia mnie czy zrobić to za pomocą .move(), czy może też stworzyć własną funkcję i operować na .setPosition(). Czy używać do tego getElapsedTime, czy może jakichś innych metod.
Byłbym wdzięczny gdybyście poparli swoje wypowiedzi przykładami
P-55461
fensz
» 2012-04-26 22:34:59
U mnie jest to tak, że jeżeli idę, animacja działa, jeżeli nie to ją stopuję

C/C++
//Ruch sprajtem
if( App.GetInput().IsKeyDown( sf::Key::A ) || App.GetInput().IsKeyDown( sf::Key::D ) || App.GetInput().IsKeyDown( sf::Key::W ) || App.GetInput().IsKeyDown( sf::Key::S ) )
{
    Andrzejanim.Play();
}
else
{
    Andrzejanim.Stop();
}
if( App.GetInput().IsKeyDown( sf::Key::A ) ) Andrzejanim.Move( - speed * ElapsedTime, 0 ), Andrzejanim.SetRotation( 90 ), View.Move( - speed * ElapsedTime, 0 );

if( App.GetInput().IsKeyDown( sf::Key::D ) ) Andrzejanim.Move( speed * ElapsedTime, 0 ), Andrzejanim.SetRotation( - 90 ), View.Move( + speed * ElapsedTime, 0 );

if( App.GetInput().IsKeyDown( sf::Key::W ) ) Andrzejanim.Move( 0, - speed * ElapsedTime ), Andrzejanim.SetRotation( 360 ), View.Move( 0, - speed * ElapsedTime );

if( App.GetInput().IsKeyDown( sf::Key::S ) ) Andrzejanim.Move( 0, speed * ElapsedTime ), Andrzejanim.SetRotation( 180 ), View.Move( 0, + speed * ElapsedTime );


taki przykładzik
P-55464
ksry
Temat założony przez niniejszego użytkownika
» 2012-04-27 00:42:14
W moim przypadku sprowadza się to i tak do jednego, do tworzenia funkcji z przenoszeniem postaci. Dlaczego? Bo u mnie postać przesuwa się w 4 strony (nie wiem jak u Ciebie), więc animacja dla każdej z nich musi być inna, co za tym idzie do funkcji z animacją trzeba przesłać argument który klawisz wciśnięto, aby odróżnić te animacje. No i idąc dalej musimy osobno sprawdzać klawisze, więc można tą funkcję z animacją umieścić w bloku z poruszaniem. Więc czemu nie wpakować do jednej funkcji...?

lub po prostu nie rozumiem Twojego przykładu
mógłbyś mnie wesprzeć podglądem na tą funkcję animującą?
P-55466
fensz
» 2012-04-27 08:40:38
zobacz, to ci Ci napisałem wcześniej (oczywiście z klasami animującymi) u mnie wygląda tak:
C/C++
//Ruch sprajtem
if( App.GetInput().IsKeyDown( sf::Key::A ) || App.GetInput().IsKeyDown( sf::Key::D ) || App.GetInput().IsKeyDown( sf::Key::W ) || App.GetInput().IsKeyDown( sf::Key::S ) ) //Jeżeli klikniesz A lub S lub D lub W to animacja zaczyna działać
{
    Andrzejanim.Play();
}
else //jeżeli nic nie wciskasz, Andrzejanim się nie animuje
{
    Andrzejanim.Stop();
}
if( App.GetInput().IsKeyDown( sf::Key::A ) ) Andrzejanim.Move( - speed * ElapsedTime, 0 ), Andrzejanim.SetRotation( 90 ), View.Move( - speed * ElapsedTime, 0 ); //Jeżeli klikasz A Andrzejanim idzie w lewo, obraca się o 90 stopni i kamera rusza się razem z Andrzejanim (sf::Viev)

if( App.GetInput().IsKeyDown( sf::Key::D ) ) Andrzejanim.Move( speed * ElapsedTime, 0 ), Andrzejanim.SetRotation( - 90 ), View.Move( + speed * ElapsedTime, 0 );

if( App.GetInput().IsKeyDown( sf::Key::W ) ) Andrzejanim.Move( 0, - speed * ElapsedTime ), Andrzejanim.SetRotation( 360 ), View.Move( 0, - speed * ElapsedTime );

if( App.GetInput().IsKeyDown( sf::Key::S ) ) Andrzejanim.Move( 0, speed * ElapsedTime ), Andrzejanim.SetRotation( 180 ), View.Move( 0, + speed * ElapsedTime );


Mój sprite jest na tej samej zasadzie co ten:
http://iv.pl/images/36137991717513984512.png

I to powinieneś zrozumieć. Sprite animujący się, obraca się rotacją wokół własnej osi.

Sądze jednak, że ty masz sprite podobnego do tego:
http://iv.pl/images/55170543917485384173.jpg

Nie wiem jak u ciebie z klasą animacji, ale podpowiem, że może to wyglądać tak

C/C++
if( TWOJSPRITE jest w ruchu )
{
    TWOJSPRITE.Play();
}
else TWOJSPRITE.Stop();


C/C++
if( App.GetInput().IsKeyDown( sf::Key::Up ) ) TWOJSPRITE.Move( 0, - speed * ElapsedTime ), TWOJSPRITE.SetCurrentFrame( NUMERRAMKI );

P-55470
ksry
Temat założony przez niniejszego użytkownika
» 2012-04-28 20:28:39
Coś napisanie takiej funkcji mi nie wychodzi. Bo użycie funkcji z taką animacją nie spowoduje jej działania "w trayu", najpierw nastąpi animacja, potem ruch. A nie obie rzeczy jednocześnie.
Myślałem więc nad czymś jak javascriptowy setTimeout, gdzie zmieni animację, ruszy się o ułamek odległości ze zmiennej i tak aż do dojścia do celu.
P-55567
hincu
» 2012-04-28 20:43:07
P-55568
« 1 »
  Strona 1 z 1