Skocz do zawartości
LolikZabijaka

Przesiadka na GMS - Spadek jakości

Rekomendowane odpowiedzi

Cześć, pisałem już wcześniej o tym, ale odpowiedzi nie uzyskałem. Jakiś czas temu zrobiłem konwersję silnika gry z gm8 na gms 1.4, poprawiłem drobne błędy, aby gra chciała się uruchomić, niestety, po uruchomieniu produkcja mocno straciła wizualnie, zrobiła się pikseloza, pełno różnych "wtrąceń" i ogólnie dziwne rozmycie, co może być przyczyną, gdzie szukać problemu? Pokazuję screeny:

Gra na GM8

Gra na GMS1.4

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

OK sporo widzę już.

  1. Zobacz swoje fonty. Musisz dodać brakujące znaki.
  2. Rozpixelowane sprite mogą być z wielu powodów.
    Albo są za duże i musiały być zeskalowane w dól by texturepage mieścił się w rozmarze.
    Albo masz jakiś dziwny rozmiar okna/view.
    Albo zapisujesz je na surface i tu problemów moze być jeszcze więcej (np rozmiar nie 2^x)
    Albo masz po prostu wygładzanie krawędzi

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Skalowanie ustawiłem na MAX, 8192x8192, jeśli chodzi o surface, to nie używam, poza tym problem dotyczy też titlesów, rozmiar okna i view tak jak w oryginale, rozmiar okna 1280x720, taki sam obszar widzenia. Antyaliasing włączony, ale gdy nie jest aktywny, to wygląda to jeszcze gorzej.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

8192x8192 to trochę brzmi jak problem. Przez takie ustawienie pewnie większość tekstur leci na ten texturepage... a twoja karta graficzna nie może go obsłużyć i skaluje go wewnętrznie. Gdzieś tam masz przycisk w ustawieniach projektu by podejrzeć texturepage. Zobacz czy wszystkie zdeformowane grafiki nie są przypadkiem na jednym wspólnym

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Znalazłem(częściowe) źródło problemu. Miałem wgrane stare Pole Tekstowe, które kiedyś zrobił Gnysek, to ono pierdzieliło mi całą grafikę, usunąłem dziadostwo i wygląda okej, jednak niektóre spritesy nadal mają jakieś wtrącenia innych kolorów, np. krew ma zielone piksele, a drzewa niebieską obwódkę, ogólnie obiekty, których image_angle jest zmiennie, te krzaczą się najczęściej(nie wszystkie) Gdzie szukać rozwiązania ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Pre-multilpy alpha zrób na każdym sprite.

Przesiadanie się dziś z GM 8 na GMS 1.4 jest jak przesiadanie się z Windowsa XP na 7.

 

I nie rób grafik większych, niż rozmiar tekstury, albo je podziel wtedy na szerokość tekstury właśnie. To wygląda też, jakbyś jakiś tryb na GPU włączył z kodu. Przejrzyj dobrze, czy gdzieś takich rzeczy nie robisz (ustawiani interpolacji, blendingu itp.)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Te pre-multiply robi się jakimś kodem, czy w ustawieniach sprite'a ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ostatni przycisk w okienku z miniaturkami sprite: https://docs.yoyogames.com/source/dadiospice/001_advanced use/more about sprites/editing sprites.html

 

Generalnie, nie ma takiej opcji, żeby był spadek wydajności w GMS 1.4, jeśli gra jest dobrze zrobiona. Za dużo rzeczy tam robiłem, żeby nie stwierdzić, że od GM 8.1 jest wszystko kilka razy szybsze i bardziej zoptymalizowane.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ok, znalezione, teraz pytanie, każdy jeden sprite muszę osobno tak dobijać ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli to pomogło to tak.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Będę pisać w tym wątku, nie ma sensu robić nowego, temat "wizualny" niemal rozwiązany, dalsze pytanie będzie już stricte optymalizacyjne:

1. Jest sobie taki oto kodzik:

if wyg2<5{
s_lydka1=s_wer_lyda_pr1
}
if wyg4<5{
s_lydka2=s_wer_lyda_pr1
}

}

Generalnie kod działa poprawnie, ale zamiast robić s_lydka1=sprite_bla_bla, chcę zrobić, żeby s_lydka1=drugi subimage sprite_bla_bla. Nie wiedziałem, jak to napisać :D Mam nadzieję, że rozumiecie xd Nie mam pojęcia w jakiej funkcji to zawrzeć, próbowałem sprite_get_texture, ale wychodziły jakieś niestworzone rzeczy xd

 

2. W grze jest kilka rodzajów pocisków, załóżmy, że 3. Pistoletowy, karabinowy, pośredni, wszystkie są dziećmi obiektu "Parent pocisków" Niestety problem pojawia się przy ustawianiu parametru wroga, ponieważ oberwanie z każdego rodzaju pocisku przynosi inne skutki(takie było założenie) - zadaje inne obrażenia, a w przypadku zejścia - inny rodzaj obiektu ciała. Jest to o tyle upierdliwe, że z każdym rodzajem pocisku muszę robić osobną kolizję. Pytanie brzmi: Czy można ustawić kolizję z "Parentem pocisków" i potem w kodzie ustawić, że jeśli trzepnie go pośredni, to dzieje się jedno, a jak dostanie z karabinowego,  to drugie?

Podziękował :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

1. CO? Subimage to subimage. Wykorzystujesz go przy samym rysowaniu.

 

Jeżeli chciałbyś jakość łatwo wskazać na inny sprite który jest po kolei to dam fajny tip:

Jak masz w drzewku po sobie sprite: s_wer_lyda_pr1 i s_wer_lyda_pr2 to do tego drugiego możesz się odnosić jako

 var sprite = s_wer_lyda_pr1 +1

Bo tak na prawdę nazwy assetów to też zmienne trzymające ID w kolejności z drzewka

 

2. Najlepiej jest sprawić że tworzony pocisk będzie miał w sobie zmienną z typem. Więc w createpocisku pistoletowego dajesz "type = 0", dla karabinowego "type = 1", etc.
Potem w kolizji sprawdzasz zwyczajnie

if(other.type == 0) {
	//Jestem pistoletowy
}

if(other.type == 1) {
	//Jestem karabinowy
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

s_lydka2=s_wer_lyda_pr1;
s_lydka2_sub = 2;
 

/// draw

draw_sprite(s_lydka2, s_lydka2_sub, x, y);

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Temat ze spritesami załatwiony. Następne zagadnienie dotyczy AI, jest mały problem, mianowicie mamy taki kodzik:

 

STEP przeciwnika:

pocisk.direction = point_direction(x,y,gracz_par.x,gracz_par.y);

Pocisk tworzy się w taki sposób, że przeciwnik w ułamku sekundy(jeden step) obraca się w stronę gracza i niemal zawsze we mnie trafia, mimo że unikam strzałów. Trafia mnie średnio 9 na 10 razy, nie sposób tego uniknąć i teraz:

Załóżmy, że dam mu w create zmienną maksymalnego kąta obrotu na jeden STEP, dajmy na to 0.25 stopnia.

Jak zaimplementować w kodzie, aby w momencie interakcji z graczem przeciwnik obrócił się płynnie i celował we mnie z pewnym błędem(załóżmy 15 stopni) i przede wszystkim, żeby nie robił tego tak szybko, tylko najpierw we mnie "wymierzył" pozdrawiam.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Najprzyjemniejszy sposób jaki ja znalazłem to:

rotspeed = 8
direction += angle_difference( direction, point_direction(x,y,gracz_par.x,gracz_par.y) ) / rotspeed

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Wymierzanie, to zabawa alarmami/zmiennymi które je zastąpią.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×