Skocz do zawartości

gnysek

Administratorzy
  • Postów

    9 825
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    144

Odpowiedzi opublikowane przez gnysek

  1. @I am Lord Widziałem wczoraj dokładnie ten sam błąd opisany na angielskim discordzie gamemakerowym i wygląda, że to nie był przypadek - aktualizuje się sprite, ale nie tileset. Rozwiązaniem jest podobno zaznaczenie checkboxa w tilesecie (disable sprite export) i potem ponowne zaznaczenie.

    Błąd jest zgłoszony, ale stabilna dostaje chyba wydanie we wtorek/środę, więc może być ciężko z naprawieniem tego przed 2022.8, trafi pewnie do bety za tydzień i do 2022.9 oraz LTS.

  2. Jak rozumiem, chcesz wycentrowany tekst, ale chcesz też, aby wyświetlał się tak, jakby brakujące litery były nieczytelne.

     

    To w sumie nie jest takie trudne, trzeba pobrać szerokość pełnego tekstu, podzielić go na dwa (czyli wziąć połowę) i zacząć rysować tekst wyrównany do lewej, na pozycji gdzie ma być środek, minus właśnie ta połowa. Czyli np.:

     

    var w = string_width(pelny_tekst);
    
    draw_set_halign(fa_left);
    draw_text(x - w/2, y, krotszy_tekst);

     

    image.png

  3. Przeszukałem sieć, ale jedyny wynik na ten temat to... ten temat w którym teraz odpisuję. Wygląda, ze nikt nie miał takiego problemu.

    Spróbowałbym po prostu wszystkich standardowych rozwiązań na znikające centrum powiadomień. Raczej nie winiłbym za to GameMakera, ale bardzo możliwe, że winny jest np. .NET, który przy okazji jest instalowany. Wejdź w "Dodań i usuń programy" i posortuj je po dacie, może spróbuj przeinstalować .NET.

     

    Btw., doinstalowałeś wszystkie aktualizacje z Windows Update dla .NET?

  4. Świetnie to wygląda, jak typowa nie-disneyowa bajka z lat '90. W sumie jedyne co mi się nie podoba, to font, ale fanów visual novelek kreską na bank ta gra przyciągnie.

    Zauważyłem też na ostatnim screenie, że pojawiają się dialogi dwóch postaci na raz - bardzo fajnie, np. Cinders i Solstice od TeeGee takiego czegoś nie miały, a mogłoby to zwiększyć immersję (tam zamiast tego, postać która mówiła była rozjaśniana).

  5. Zakładając, że A to ilość sekund, przez którą gracz może jeszcze grać, np. 8520 sekund:

    liczba godzin: A div 3600

    liczba minut: A div 60 mod 60

    liczba sekund: A mod 60

     

    I możesz wywalić prawie połowę kodu i ifów.

     

    Natomiast rysowanie wygląda wtedy tak:

    function draw_remaining_time(seconds) {
    	
    	_s = "";
    
    	if (seconds >= 3600) {
    		_s += string(seconds div 3600) + " hours, ";
    	}
    	
    	if (seconds >= 60) {
    		_s += string((seconds div 60) mod 60) + " minutes, ";
    	}
    	
    	return _s + string(seconds % 60) + " seconds";
    
    }

     

  6. Już nie chciałem na to zwracać uwagi, ale ja też bym zamienił ghost_x z x. Dla kolizji ważniejsza będzie pozycja gdzie jest cień, mniej ważne rysowanie. Ewentualnie przy kolizjach będzie trzeba sprawdzać offset jako wysokość, ale wciąż zamiana tych zmiennych ułatwia całość, bo można skorzystać z wbudowanych kolizji, zamiast rzeźbić własny kod.

  7. A załączałeś profilowanie w debuggerze? Ono całkiem sporo mówi:

    obraz.png

     

    I teraz najśmieszniej, bo jak zmieniłem draw_rectangle na draw_sprite, to udało mi się uzyskać 60 FPS, ale to wciąż słabiutko. To by trzeba jakoś zoptymalizować, na zasadzie sprawdzania całych stref gdzie ta mgła jest, a gdzie jej nie ma (np. obszar 128x128px) i wtedy malować za jednym zamachem większe czarne prostokąty. No i nie aktualizować co klatkę wszystkich pozycji. Albo zwiększyć rozdzielczość mgły, żeby nie było aż 8000 komórek na raz na ekranie.

  8. 8 godzin temu, Adriann napisał:
    with(objUnit){
    		gpu_set_blendmode(bm_subtract)
    		draw_set_color(c_black)
    		draw_circle(x-camera_get_view_x(view_camera[0]),y-camera_get_view_y(view_camera[0]),200,0)
    		gpu_set_blendmode(bm_normal)
    		}

    Ja bym zrobił:

     

    gpu_set_blendmode(bm_subtract);
    draw_set_color(c_black);
    
    with(objUnit){
    	draw_circle(x-camera_get_view_x(view_camera[0]),y-camera_get_view_y(view_camera[0]),200,0);
    }
    
    gpu_set_blendmode(bm_normal);

     

    Wtedy blend mode nie będzie tyle razy zmieniany.

  9. Dlaczego generujesz tyle nowych sprite w locie? Pamięć zapełni się szybko i jest to mega niewydajne, bowiem GM każdy sprite generuje jako osobną teksturę jeśli go tworzysz w grze, do tego trzyma dwie kopie do normalnego rysowania i blendingu, co daje WYSOKOŚĆ * SZEROKOŚĆ * 4 bajty. Obrazek 512x512px to jest 2 MB.

     

    Z tego kodu widać też, że faktycznie, nie usuwasz starych sprite'ów, wiec one faktycznie zostają w pamięci - GM nie zwalnia automatycznie zasobów jeśli nie są używane, robi to tylko ze strukturami i z tablicami, resztę trzeba usuwać ręcznie.

×
×
  • Dodaj nową pozycję...