Forum Polskiego Kursu Blendera

Kurs Blendera dla wszystkich Polaków!

Opóźnienie ruchu przy animacji postaci w grze

Autor Wątek: Opóźnienie ruchu przy animacji postaci w grze  (Przeczytany 1919 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Zuuja

  • Nowy użytkownik
  • *
  • Wiadomości: 5
  • Reputacja +1/-0
  • Płeć: Kobieta
  • jestem tu nowy!
    • Zobacz profil
Opóźnienie ruchu przy animacji postaci w grze
« dnia: 20150426, 10:54:55 »
Witam,
ogólnie rzecz biorąc jestem nowa w robieniu gier, a wcześniej, głównie dzięki PKB (choć na forum byłam raczej martwym użytkownikiem i w sumie regularnie zaczęłam zaglądać tu niedawno, aczkolwiek i tak zawsze gdy wchodziłam na jakiś temat już padła w nim odpowiedź, więc nie miałam okazji nikomu pomóc), zajmowałam się raczej mniej lub bardziej sensownie modelowaniem i animacją.

Teraz próbuję zrobić prostą grę i jak na razie udało mi się zrobić radośnie biegający sześcianik z dwoma (złożonymi z prostopadłościanów) nogami. Wszystko wygląda pięknie i płynnie dopóki nie spróbuje się go przemieścić przy pomocy jednego kliknięcia, kiedy to mój charakter najpierw się przesuwa, a dopiero potem podskakuje co wygląda zupełnie bezsensownie. Stąd moje pytanie o sposób na to by po kliknięciu przycisku opóźnić ruch o kilka klatek.

Offline Piotr

  • Administrator
  • Ekspert
  • *
  • Wiadomości: 3903
  • Reputacja +190/-8
  • Płeć: Mężczyzna
  • BFCT
    • Zobacz profil
    • Polski Kurs Blendera
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #1 dnia: 20150427, 14:24:47 »
Masz na to generalnie kilka sposobów, ale dwa wydają się dość proste.

1. Przygotuj odpowiednią "spowolnioną" na początku animację i użyj takiej - to rozwiązanie wbrew pozorom bardzo proste i daje najlepsze efekty.

2. Użyj swojej starej animacji, ale wprowadź opóźnienie w logick bricks za pomocą kostki delay. Też proste, ale wymaga dodania nowej logiki do gry i po pewnym czasie jest trudniejsze do opanowania, zwłaszcza, gdy masz ochotę w ten sposób sterować animacjami.

3. Inne sposoby: przychodzi mi na myśl wprowadzenie pętli opóźniających w pythonie, ale wtedy trzeba pisać własny kod i przejmować funkcje kontrolera, a potem wywoływać ręcznie całą animację. Skomplikowane i niepotrzebne w sumie - skoro wystarczy zrobić łatwo i szybko pkt.1
-piotr-

Offline Zuuja

  • Nowy użytkownik
  • *
  • Wiadomości: 5
  • Reputacja +1/-0
  • Płeć: Kobieta
  • jestem tu nowy!
    • Zobacz profil
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #2 dnia: 20150428, 19:30:29 »
Hmmmm... Mam wrażenie, że nie o to chodziło lub nie zrozumiałam rozwiązania.

Rzecz w tym, że używam dwóch kostek logiki naraz - jednej do ruchu (motion) i jednej do animacji (action). Przy pojedynczym kliknięciu obie te akcje zaczynają się razem, a jako że przesunięcie obiektu z pomocą kostki motion następuje prawie natychmiast to animacja działa zbyt wolno, więc jej opóźnienie nic nie da, a tylko pogorszy całość. Chodziło mi o opóźnienie kostki ruchu, więc punkt pierwszy odpada. Co do drugiej rady to czy delay nie definiuje opóźnienia od uruchomienia gry (nie mam pomysłu gdzie można by to przestawić)? Jeśli tak to również nie jest dobre rozwiązanie gdyż chcę opóźnić zaczęcie się ruchu, który następuje po kliknięciu, a nie tylko raz po określonym czasie od uruchomienia gry.

Offline zuber

  • Przybysz
  • *
  • Wiadomości: 1
  • Reputacja +0/-0
  • jestem tu nowy!
    • Zobacz profil
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #3 dnia: 20150504, 01:00:34 »
Znam jedną w miarę prostą metodę synchronizacji animacji z ruchem.
W skrócie: Należałoby wykorzystać aktualnie wyświetlanej klatki danej animacji. Dla przykładu: jeżeli postać biegnąc odbija się od podłoża w klatkach od 10 do 15, to trzeba wykonać ruch tylko i wyłacznie podczas trwania tych klatek.

Krótka instrukcja, jak stworzyć prostą konfigurację:
1. Do kości dodajesz property (najlepiej typu Int) i dowolnie je nazywasz (np. "klatka_animacji")
2. W actuatorze action (tym co powoduje animację) ustawiasz "property frame" na wczęsniej dodaną proporcję.
(Teraz property "klatka_animacji" będzie przybierać wartość aktualnie wyświetlanej klatki wybranej animacji)
3. Jeżeli szkielet jest połączony z innym obiektem, który nim porusza: Przechodzimy do tego obiektu i dodajemy mu nowe property (można je nazwać tak samo jak w punkcie pierwszym) a następnie dodajesz kostki logiki: ALWAYS->AND->PROPERTY. W actuatorze property zmieniamy "mode" na copy i ustawiamy tak, aby kopiowało wartość "klatka_animacji" z kości do obiektu sterującego. (alternatywną opcją jest wysłanie wiadomości do obiektu za pomocą actuatora "message", a w punkcie czwartym zamienienie kostki property na message)
4. W obiekcie sterującym ustawiamy kostki: PROPERTY->AND->MOTION. W sensorze property wybieramy proporcję "klatka_animacji", a wartość ustawiamy na klatkę (lub przedział), w której postać ma się poruszyć.

Offline stolarz9316

  • Użytkownik
  • *
  • Wiadomości: 136
  • Reputacja +0/-0
  • Płeć: Mężczyzna
  • I think, therefore I am
    • Zobacz profil
    • Youtube
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #4 dnia: 20150507, 17:13:06 »
Daj jakieś fotki z "BGE" 8)

Offline Piotr

  • Administrator
  • Ekspert
  • *
  • Wiadomości: 3903
  • Reputacja +190/-8
  • Płeć: Mężczyzna
  • BFCT
    • Zobacz profil
    • Polski Kurs Blendera
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #5 dnia: 20150507, 23:31:47 »
Zrozumiałem o co Ci chodzi dopiero po odpowiedzi zubera. Mówiąc to po swojemu, chcesz zrobić jednoczesną aktywację ruchu i animacji, ale tak, aby animacja była nieco później niż zaczyna się ruch, right? Zuber zaproponował Ci wprowadzenie pętli opóźniającej. Klocki logiczne przetworzą całość kolejkując wykonania i w efekcie animację uruchomisz później bo ścieżka dojścia do niej będzie dłuższa (tylko niestety wykona się przejście przez kolejny sensor). Można tak zrobić, tylko musisz naustawiać klocków. Szybko stracisz czytelność w takim systemie, no ale to jest workaround.
Prościej, gdybyś miał niestety takich przypadków więcej jest chyba odpowiednio przesunąć animację - wystarczy że odpowiedzialne za nią klatki kluczowe przesuniesz w Edytorze Akcji nieco w prawo, o parę klatek, i zostawisz z przodu nieruchomy model... Może to być szybszy i prostszy sposób, o ile animacji nie wykorzystujesz w paru różnych miejscach.
-piotr-

Offline Zuuja

  • Nowy użytkownik
  • *
  • Wiadomości: 5
  • Reputacja +1/-0
  • Płeć: Kobieta
  • jestem tu nowy!
    • Zobacz profil
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #6 dnia: 20150519, 17:51:37 »
Bardzo dziękuję, opóźniająca pętla pomogła i to było dokładnie to o co mi chodziło. Niżej wstawiam poustawiane kostki (nie jestem pewna do kogo była kierowana prośba o screen, więc wrzucam). Co do przesuwania animacji (czyli de facto jej opóźniania) to wciąż nie do końca rozumiem w jaki sposób mogłoby to pomóc.

Offline stolarz9316

  • Użytkownik
  • *
  • Wiadomości: 136
  • Reputacja +0/-0
  • Płeć: Mężczyzna
  • I think, therefore I am
    • Zobacz profil
    • Youtube
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #7 dnia: 20150520, 17:22:13 »
Nie wiem o jakie opóźnienie ci chodzi ale np jeśli mam dwie animacje  zaczynające się od 0 i chcę by ta druga
odtwarzała się jako pierwsza, to przesuwam start pierwszej animacji w  "Graph editor" z 0k na np. 20k, po to by ją opóźnić a w "Logic editor" , w akcji ustawiam tylko koniec tej animacji nie ruszając startu. :-\

Offline Zuuja

  • Nowy użytkownik
  • *
  • Wiadomości: 5
  • Reputacja +1/-0
  • Płeć: Kobieta
  • jestem tu nowy!
    • Zobacz profil
Odp: Opóźnienie ruchu przy animacji postaci w grze
« Odpowiedź #8 dnia: 20150522, 18:45:41 »
Jak pisałam wyżej, już wszystko działa, a moim problemem nie było opóźnienie animacji tylko przesunięcia, które wykonuje się za pomocą kostki motion i przez to opóźnienie animacji nic nie daje, a nawet pogarsza sytuację. Za to pętla opóźniająca działa. Przepraszam, że nie do końca umiem sprecyzować o co mi chodzi i jeszcze raz dziękuję za pomoc.

 

© Polski Kurs Blendera, CC-BY, 2014