Jak skalować piksele bez rozmycia w GM Studio?


9

Tworzę grę w Game Maker Studio, która wykorzystuje piksele. Kiedy uruchamiam grę, wszystkie skalowane tekstury są naprawdę rozmyte. (Nie zdarza się to małym).

Na przykład ten obraz

miły :)

renderuje się w grze w ten sposób:

niewyraźne :(

Czy istnieje możliwość zmiany rozmiaru małych pikseli na duże zamiast rozmytych ?


nie używaj kompresji stratnej dla tekstur, zamiast tego używaj bmp, gif lub png, wszystkie obsługują bezstratne przechowywanie
maniak ratchet

Kiedy masz grafikę pikselową, zwykle chcesz uniknąć zmiany rozmiaru, ponieważ grafika pikselowa zawsze cierpi z tego powodu. Gdy nie można uniknąć zmiany rozmiaru, należy użyć interpolacji najbliższego sąsiada, aby zachować chrupiący wygląd. Jeśli chcesz zmienić rozmiar, użyj grafiki wektorowej zamiast grafiki rastrowej. Niestety nie mogę ci w tym pomóc, ponieważ nie znam GMStudio.
Philipp

przykłady dodane.
mpower

Nie znam możliwości twórców gier, ale chciałbyś wyłączyć wszystkie filtrowanie skali i włączyć skalowanie najbliższego sąsiada.
Jabłczany

1
Jeśli dobrze pamiętam, oryginalny Spelunky (stworzony w Game Maker) miał bibliotekę DLL, która umożliwiała skalowanie liniowe. Źródło jest dostępne pod tym linkiem; Spójrz.
Anko,

Odpowiedzi:


13

Znaleziono rozwiązanie z jakiegoś zasobu. Przejdź do Globalnych ustawień gry, a następnie przejdź do dowolnego spoilera platformy (na przykład „Windows” lub „Android”), wybierz spoiler zatytułowany „Grafika” i wyłącz „Interpoluj kolory między pikselami”. Baw się dobrze :)


To technicznie działa, choć grafika pikselowa może ulec zmianie ze względu na skalowanie przy użyciu współczynnika niecałkowitego (np. 2,5x)
liggiorgio

Masz na myśli, że nie zadali sobie trudu, aby ustawić to jako domyślne?!? Właśnie sprawdziłem i że domyślnie jest inaczej w Game Maker 8.0. To tylko orzechy ... Świetna odpowiedź btw.
user64742,

5

Nikt nie chce radzić sobie z koniecznością ręcznego skalowania każdego duszka; nie tylko jest to niechlujny obszar roboczy, ale sprawia, że ​​jest bardzo nieprofesjonalny. Znalazłem rozwiązanie, gdy wyłączenie interpolacji w globalnych ustawieniach gry nie działało.

texture_set_interpolation(false);

:) Mam nadzieję, że to pomoże ci w twoich przyszłych staraniach.


Jest to najlepsze rozwiązanie, jeśli kierujesz reklamy na wiele platform, nie musisz klikać opcji „Interpoluj kolory między pikselami” dla każdej platformy! Dokładnie tego szukałem.
Logan Pickup

1

Generalnie robię to za pomocą Photoshopa lub GIMP (skala / Najbliższy sąsiad)

Ale aby to zrobić w samym edytorze sprite'a GM: S, używam polecenia Rozciągnij zamiast skalowania i ustawiam go na ZŁĄ jakość. To sprawi, że Blocky poczuje się jak w domuPo wyłączeniu z gry, w której pracuję na bankomacie, duszek jest powiększony w samej GM: S

Powyżej jest gra, w której pracuję w bankomatach, właśnie to zrobiłem!


Mimo że działa to w przypadku skalowania w górę niektórych rozdzielczości, nie w przypadku wszystkich z nich, GM ma również zwyczaj domyślnie kompresować tekstury. Spowodowałoby to również inne skalowanie w różnych rozdzielczościach podczas korzystania z funkcji rozciągania, spowoduje to rozmycie, którego próbujemy uniknąć. Jednak +1 za wzmiankę (Skala / Najbliższy sąsiad).
Tom 'Blue' Piddock

1

Wyłącz funkcję skalowania na karcie tła na mapie. Jeśli wydaje się, że jest poza skalą, upewnij się, że twoja tekstura tła jest tego samego rozmiaru co pomieszczenie / mapa, w której się znajdujesz.

Możesz również użyć tego postu tutaj, aby utworzyć skrypt w tle, który zwiększy skalę tła z (miejmy nadzieję) wyraźnymi wynikami.

Wykorzystuje to powierzchnie, więc jeśli potrzebujesz dodatkowej pomocy w tym temacie - ten post zawiera wiele informacji.


EDYTOWAĆ:

Wracając do moich odpowiedzi, zdałem sobie sprawę, że to nie do zera i potrzebuje treści samouczka. Oto on:

KROK 1 : Wybierz żądaną skalę. Użyj widoku dla każdego pokoju i odpowiednio skaluj port W i port H. Na przykład, jeśli używasz skali 2 ... wyglądałoby to tak w edytorze pokoi GM.

Ważne jest, aby było to spójne we wszystkich pokojach. Jeśli masz dużo pokoi, może to być łatwiejsze za pomocą kodu *. Wolę robić to w ten sposób, ponieważ wtedy wartości nie są stałe i mogę obsługiwać wiele różnych skal.

KROK 2 : Utwórz 3 skrypty, screen_init, screen_begin i screen_end. Oto, co wchodzi w skład każdego ze skryptów ...

Cytat z: screen_init

// screen base(view_wview and view_hview)
screen_x = 0;
screen_y = 0;
screen_w = 320;
screen_h = 240;
screen_scale = 2;

// create a surface for the whole screen to be drawn on
screen = surface_create(screen_w,screen_h);

// this will destroy the screen object if surfaces are not supported on the graphics card, reverting to the viewport method
if screen = -1{instance_destroy();}

Cytat z: screen_begin

// this draws the surface on the screen
surface_reset_target();
draw_clear(0);
draw_set_blend_mode_ext(bm_one, bm_zero);
draw_surface_stretched(screen,screen_x,screen_y,screen_w*screen_scale,screen_h*screen_scale);
draw_set_blend_mode(bm_normal);
screen_refresh();

Cytat z: screen_end

// this sets surface 'screen' as the drawing target for everything in the game, so all drawing will be done on this surface and not on the game screen
surface_set_target(screen);

KROK 3 : Teraz mamy skrypty, ale dokąd one idą? Utwórz obiekt. Podobnie jak obj_screen, objScreen, o_screen lub cokolwiek innego, i wykonaj następujące czynności:

  • A) umieść screen_initscript w zdarzeniu Create.
  • B) umieść skrypt screen_begin w zdarzeniu Rozpocznij krok.
  • C) umieść skrypt screen_end w zdarzeniu End Step.

I umieść ten obiekt w pierwszym i najważniejszym pokoju w grze, zaznacz go jako trwały i upewnij się, że nie ma jego duplikatów.

Skończyłeś, a teraz masz ładne, wyraźne skalowanie = D


Chcę skalować bez rozmycia, ponieważ uwielbiam grafiki pikselowe, więc to nie odpowiada na moje pytanie. Czy to możliwe?
mpower

Nie jest prawdopodobne, że Game Maker Studio wykonuje skalowanie przy użyciu algorytmu skalowania w górę, co często powoduje niepożądane rozmycie skalowania. Skorzystaj z samouczka, który właśnie edytowałem w odpowiedzi, aby wypróbować wyraźne tło ze skalowaniem.
Tom „Blue” Piddock

Czy rozważałeś wstępne skalowanie tekstury tła w programie graficznym?
Philipp

Dobre są dwa sposoby. Po pierwsze połączenie niektórych skryptów tutaj. Druga to wstępne skalowanie obrazów przed ich użyciem.
mpower

Wspaniale, cieszę się, że to pomogło.
Tom 'Blue' Piddock

-2

Użyj, texture_set_interpolation(false)aby narysować je takimi, jakie są.


Może to być poprawne, ale czy mógłbyś przejść do bardziej szczegółowych informacji? W naszych odpowiedziach zwykle szukamy nieco więcej szczegółów.
Gnemlock
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.