Czy dodać animacje?

Czy dodać animacje?
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 597
1

Planuję dodać więcej animacji w moim programie do tworzenia gier RPG 2D.
Jak uważacie - program wygląda lepiej z animacjami obiektów, czy bez nich?
Chętnie poznam Waszą opinię :-)

Mapa z animacjami:
Mapa bez animacji:

Michał_Stankiewicz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 167
2

W/g mnie obowiązkowe. Kwestia optymalizacji i dla słabszych komputerów z możliwością wyłączenia.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
6

Proponuję coś pomiędzy tymi dwoma, w tym pierwszym dosłownie wszystko się rusza, odwraca uwagę od ważnych elementów, wrogów itp. Na drugim jest zbyt statycznie. Proponuję bardziej subtelne wolniejsze animacje dla elementów dekoracyjnych.

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9214
1

Chciałem napisać dosłownie to samo, co @obscurity powyżej.
Animacje dodają życia grze, ale w obecnej postaci, jak pół planszy się rusza, mocno jest to rozpraszające/odciąga uwagę od tych diznoarłów co po planszy biegają. Jak będzie więcej postaci/jakaś walka z wrogiem czy co tam masz w planach to będzie jeszcze trudniej.
Także - w ankiecie nie odpowiedziałem, bo z żadną opcją się nie zgadzam. Ale uważam, że animacje są spoko i powinny zostać, tylko delikatniejsze.

Z moich rad:

  • nie musi się wszystko zawsze ruszać, może być albo tak, że mamy wiatr i co jakiś czas nastąpi podmuch, wszystko się ruszy, a potem cisza
  • albo że każda roślinka ma jakąś random (3,60) przerwę w ruchu, potem chwile się poruszy i znowu delay. W ten sposób nie ma sytuacji że wszystko jednocześnie biega, tylko w danym momencie ruszają się pojedyncze elementy. Aczkolwiek też nie jestem do końca przekonany czy to będzie fajny efekt, czy raczej jakieś losowe ruchy losowych elementów, albo czy nie będzie wyglądać dziwnie że jest kilka drzew/krzaków obok siebie, a rusza się tylko jeden z nich
  • możesz animować nie tylko sam ruch, ale też lekko kolor - trochę podobnie do tego, co ma woda. W sensie - jak drzewko się rusza to może sie robić delikatnie jaśniejsze/ciemniejsze. Ale jak poprzedni punkt - to jest pomysł, który warto sprawdzić, ale może się okazać totalnie beznadziejny ;)
Korges
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 629
1

Podobne gierki - tibijka nie mają takich bajerów a sobie radzą.
Raczej kwestia konwencji. Zawsze możesz dodać jakieś ustawienia do wyboru.
Dla mnie osobiście jest tego za dużo.
I pytanie dlaczego te drzewa się mają ruszać? Aż tak tam wieje? :D

bakunet
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 1756
1

Jak przedmówcy fajnie, ale wolniej

Michał_Stankiewicz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 167
2

Dla spójności całego projektu poza wiatrem można dodać różne warunki pogodowe.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
1

Statyczne światy to domena lat 80' i 90', wynikające głównie z ograniczeń sprzętowych, nie z konieczności. Dziś ograniczenia sprzętowe — szczególnie, jeśli brać pod uwagę typ projektu jaki tworzysz — w praktyce nie istnieją, dlatego nie ma powodu, aby animacji unikać. Inaczej pisząc, animacje to obowiązek.

Zasada jest prosta — jeśli masz w grze obiekt, który istnieje w prawdziwym świecie, to powinien wyglądać podobnie i zachowywać się podobnie. Jeśli tę zasadę złamiesz, to gracz nieświadomie skupiać będzie uwagę na tym, dlaczego coś co zna, wygląda i/lub zachowuje się niezgodnie z tym, co przecież dobrze zna. I to jest problem, dlatego że uwagę powinien skupić na rozgrywce, nie na rozgryzaniu intencji dewelopera. Ogólnie mowa tutaj o afordancjach, choć to pojęcie jest znacznie szersze i dotyczy również interakcji z obiektami.

Każdy w życiu nie raz widział drzewo, a także wie czym jest wiatr — ty masz drzewka, które wyglądają jak drzewka, a także się poruszają, więc raczej jest w porządku. Choć zaznaczam, że nie podobają mi się takie stale zapętlone animacje (bo są dość prymitywne), ale bardzo wielu deweloperów korzysta z nich, więc to już kwestia gustu czy stylu artystycznego. Ich zaletą natomiast jest to, że umysł szybko je przyswaja i ignoruje — w końcu animacja jest krótka i zapętlona w nieskończoność, więc po chwili przestaje intrygować.

Przykład zapętlonych animacji roślinności znajdziesz np. w grze Sea of Stars:

Ta gra jest niezłym przykładem tego, jak zrobić w miarę żywy świat, ale który nie przytłacza. Mnóstwo obiektów scenerii jest animowanych, ale te animacje są na tyle subtelne, że całość prezentuje się wspaniale.

Tak więc te twoje drzewka nie odstają od normy, a co najwyżej mogłyby wyglądać lepiej. Ale biorę pod uwagę to, że pracujesz nad edytorem, nie nad samą grą, stąd od bardzo dawna używasz tych samych sprajtów, być może na razie jako placeholderów. Natomiast to co bym zmienił to wygląd wody, bo wygląda bardziej jak jakaś magiczna zupa. 😉


Korges napisał(a):

Podobne gierki - tibijka nie mają takich bajerów a sobie radzą.

Tibia ma bardzo wiele animowanych elementów — woda, kałóżne, fontanny, pochodnie, niektóre typy płytek na posadzkach czy nawet przedmioty w zasobniku. Świat ogólnie jest w miarę statyczny/martwy, ale sporo się w nim rusza. Tutaj przykład i przy okazji inspiracja dotycząca tego jak zrobić prostą acz przyzwoitą animację wody:

PS: Tutaj link bezpośredni do filmu, bo odtwarzacz w poście nie działa.

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 597
0

U mnie animacja działa w ten sposób, że animatorowi podaję _interval - czyli wartość czasu po której upłynięciu zmienia się klatka. Za Waszą radę zwiększyłem _interval dla niektórych obiektów i takie są tego efektu. Chyba wygląda trochę lepiej, jak uważacie?

Kopiuj
float animationInterval = 0.2f; // dla pozosotałych obiektów
if (_prefab.lock()->getName() == L"tree_1") animationInterval = 0.6f; // drzewo
if (_prefab.lock()->getName() == L"bush") animationInterval = 0.7f; // krzak
if (_prefab.lock()->getName() == L"reed_1") animationInterval = 0.4f; // trzcina 1
if (_prefab.lock()->getName() == L"reed_2") animationInterval = 0.4f; // trzcina 2

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

A jak obsługujesz te intervale? Chyba nie robisz osobnych timerów dla każdego obiektu?

Wygląda dużo lepiej, już sie wszystko nie buja jak w kreskówkach disneya sprzed 100 lat

4d0df7f9f991e08f508bbce93173b29d.gif

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 597
0

@obscurity no właśnie tak robię :-)

Kopiuj
void Animator::update() {
	if (!_isPlaying) return;
	if (_animations.expired()) return;

	_timer += deltaTime.asSeconds();

	if (_timer >= _interval) {

		_timer -= _interval;
		_frame++;

		if (_frame >= _animations.lock()->_framesCount) {
			_frame = 0;
		}
	}
}
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
0

Umm to nie tak źle bo masz swój minimalistyczny timer a nie systemowy ale i tak można dużo prościej bez obciążania dodatkowo pamięci. Wystarczy obliczyć klatke przy rysowaniu

Kopiuj
draw(sprite, (totalGameTime / frameDuration) % totalFrames);

Jeśli masz shadery to może sie nawet dziać na gpu bez angażowania cpu, i nie musisz iterować i zarządzać "animatorami" ani trzymać osobnego licznika dla każdego obiektu. No z tym że tych obiektów nie ma aż tak dużo i osobne zarządzanie daje większą swobode, np można pauzować, spowalniać i cofać niezależnie animacje - pytanie czy to potrzebne.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
0
tBane napisał(a):

@obscurity no właśnie tak robię :-)

Bardzo dobrze, że tak robisz — w przeciwnym razie nie będzie się dało mieć w grze kilku animowanych obiektów tego samego typu, ale z animacjami o przesuniętych w czasie cyklach. Tym bardziej, że pracujesz nad edytorem gier, a nie nad konkretną grą.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
0
flowCRANE napisał(a):

Bardzo dobrze, że tak robisz — w przeciwnym razie nie będzie się dało mieć w grze kilku animowanych obiektów tego samego typu, ale z animacjami o przesuniętych w czasie cyklach. Tym bardziej, że pracujesz nad edytorem gier, a nie nad konkretną grą.

Co nie zmienia tego że można trzymać sam licznik animacji (startu animacji) per instancja a nawet w tym samym obiekcie który jest odpowiedzialny za rysowanie sprite, bez dodatkowej pętli po animacjach i klatka wyliczana jest tylko podczas rysowania, bez potrzeby dodatkowego sprawdzania czy obiekt jest w zasięgu rysowania ani bez zbędnego zwiększania licznika obiektów poza ekranem. Tak samo jak tworząc "stoper" nie aktualizujemy jego stanu tak często jak się da tylko wyliczamy obecny czas w momencie zapytania o upłynięty czas, "stoper" tak naprawdę nic nie robi w tle tylko trzyma jedną / dwie wartości liczbowe, które się nie zmieniają, chyba że go zapauzujemy/wznowimy.

No ale to mikrooptymalizacje, tak naprawdę dodatkowe 100 czy nawet 10000 zbędnych inkrementacji zmiennych w pamięci na klatkę nic nie zmienia na współczesnym sprzęcie. Tak jak napisałem - jest ok, bałem się że odpala do tego np QTimer czy steady_timer.

Michał_Stankiewicz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 167
1

@tBane Co do pogody IMHO
Trudno mi coś sensownego podpowiedzieć, spróbuj zainteresować się tematem filtrów, może to co coś da. (możliwe, że trzeba będzie zainteresować się tematem grafiki proceduralnej)
Jakiś czas temu bawiłem się fizyczno-chemicznymi oddziaływaniami cząsteczek i w pewnym momencie pomyślałem, kurde fajnie by było gdyby to wszystko co do tej pory zrobiłem wyglądało, jak byś patrzył przez mikroskop. Musiał bym cały projekt zaczynać od nowa.
Dzięki filtrom można wszystko zmienić jednym kliknięciem.
Na screenie pierwszym masz widok standardowy a pozostałe to rodzaje filtrów i ten sam widok tylko po zastosowaniu ich.
Może ktoś kto jest bardziej w temacie podpowie i rozwinie.
Dzięki temu można zrobić: pory roku, cykl dnia i nocy, pogodę

Zwykły widok
screenshot-20260710093741.png

Rodzaje filtrów
screenshot-20260710093814.png

Po zastosowaniu filtra:
screenshot-20260710093839.png

Inne mieszanki filtrów
screenshot-20260710093913.png

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.