Odtwarzanie animacji skryptem

Problemy ze skryptami w BGE.
Awatar użytkownika
Karricjusz
Posty: 54
Rejestracja: 22 lip 2012, 18:41

Odtwarzanie animacji skryptem

Postautor: Karricjusz » 10 mar 2013, 17:47

Witam! Tym razem chciałem Pythonem odtworzyć pewną animację w taki sposób, aby była odtwarzana od pierwszej klatki do określonej zmienną. Czyli np. w grze jak ta zmienna jest równa 5, to po naciśnięciu entera grana jest animacja od 1 klatki do 5, a jak jest równa 20, to od 1 do 20. Niestety, ten język programowania jest dla mnie zbyt skomplikowany i najprawdopodobniej w końcu sobie go daruję :/ Ale może chociaż zrobię do końca to, co akurat robię.
Obrazek

Awatar użytkownika
Dagon
Posty: 94
Rejestracja: 21 lip 2012, 15:30

Re: Odtwarzanie animacji skryptem

Postautor: Dagon » 10 mar 2013, 19:28

Za pomocą playAction. Używasz jej tak:

Kod: Zaznacz cały

cont = logic.getCurrentController()
own = cont.owner

start=1
end=20
predkosc=1.0

own.playAction("nazwa_animacji", start, end, 0, 0, 0, 0, 0.0, 0, predkosc)

Pozostałe parametry opisane są w dokumentacji - każdy język będzie trudny dopóki nie zaczniesz z niej korzystać.

Awatar użytkownika
pawianek
Posty: 61
Rejestracja: 03 sty 2013, 21:20

Re: Odtwarzanie animacji skryptem

Postautor: pawianek » 11 mar 2013, 18:15

Jeśli chodzi o mnie to dla mnie python to jeden z prostszych języków programowania, nie znaczy to że jest przez to gorszy, a wręcz przeciwnie. Porównując z C++ to python to bajka :), ale szkoda że jest interpretowany.
Jeśli zechcemy możemy stworzyć wiele wspaniałych i dobrych rzeczy :)

Awatar użytkownika
pawianek
Posty: 61
Rejestracja: 03 sty 2013, 21:20

Re: Odtwarzanie animacji skryptem

Postautor: pawianek » 29 gru 2013, 20:49

Tak dla ścisłości bo właśnie bawię się animacją, co do powyższego kodu, to own musi być obiektem typu "Armatura" czyli kości, czyli ten kontroler musi obsługiwać kości. :)

Zmieniłem treść tego postu bo uznałem że jest głupi, to czytają poważni ludzie a ja wypisuje głupoty. I own wcale nie musi być obiektem Armatura, bo nie tylko armaturę możną animować. Widać że jeszcze wiele muszę się nauczyć o blenderze, no ale kto nic nie robi nie popełnia błędów :)
Jeśli zechcemy możemy stworzyć wiele wspaniałych i dobrych rzeczy :)

Nersael
Posty: 34
Rejestracja: 10 sty 2014, 16:56

Re: Odtwarzanie animacji skryptem

Postautor: Nersael » 12 sty 2014, 1:48

Nie wiem czy to pomorze, ale kto wie...

Przy pisaniu skryptów w pythonie długo nie zauważałem ważnej rzeczy, mianowicie, że na jedną klatkę prędkości gry obliczany jest nasz skrypt (60 klatek na sekundę - 60 razy na sekundę wykonywany jest skrypt).

A więc przydatna jest wiadomość o:
playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0)

Strasznie to wygląda, przynajmniej dla mnie z początku wyglądało, w sumie to nadal strasznie wygląda. Ale pokarzę jak radzę sobie z tematem animacji.

Dla animacji postaci co przykładowo stoi, porusza się to ważne jest priority i blendin.
Dwie animacje(albo więcej) różnią się czasem znaczącą, a nie chcemy skoku z klatki np biegu do postoju postaci, za płynność przejścia będzie odpowiadać blendin.
Natomiast priority będzie odpowiadać za to, która akcja ma być wykonywana najpierw w sytuacji gdzie:
np:
player.playAction("stoj",0,200,0,1,5)
if keyboard.events[bge.events.WKEY] == active:
player.playAction("idz",0,30,0,0,5)
więc to co ma mniejszą wartość priority będzie najpierw brane pod uwagę.

Ale jeśli chodzi o na przykład przesuwanie jakiejś rzeczy za pomocą akcji czy ruch np windy albo co tam kto woli i chce to kontrolować skryptem to robię to tak:

#mamy obiekt obj
obj = scene.objects["obj"]
#obj ma property np ruch=0 i jakaś zmienna=0
ruch = obj['ruch']
zmienna = obj['zmienna']
# i teraz zrobił bym to tak

if zmienna == 1: # jesli zmienna równa 1
if ruch < 5: # jeśli ruch mniejszy od 5
obj['ruch']+=1 # dodaje do wartości property 1
obj.playAction('ruch',obj['ruch'],obj['ruch'])

# jesli chcemy aby ruch się powtarzał
if ruch == 5: # jeśli ruch jest równy 5
obj['ruch']=0 # ustawia property ruch na 0

if zmienna == 2: # jesli zmienna równa 2
if ruch < 20: # jeśli ruch mniejszy od 20
obj['ruch']+=1 # dodaje do wartości property 1
obj.playAction('ruch',obj['ruch'],obj['ruch'])

# jesli chcemy aby ruch się powtarzał
if ruch == 20: # jeśli ruch jest równy 20
obj['ruch']=0 # ustawia property ruch na 0, chyba że chcemy aby grał od innej klatki to wpisujemy klatkę nam pasującą.

trochę jest już późno to jeszcze z rana sprawdzę czy błędu gdzieś nie popełniłem, ale myślę, że sposób jaki przedstawiłem jest dość prosty i można to wykorzystać na wiele sposobów.


Wróć do „Python”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość