Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

Jak rozmyślać nad problemem szyfrowania plików zapisu? i czy w ogóle rozmyślać. Gnysek na gmclanie opisał metode z przekształcaniem tekstu z pomocą ASCII i XOR ale to było w 2005r. W dokumentacji natknąłem się na coś takiego jak "ds_map_secure_save", ktoś miał z tym jakiś bliższy kontakt i mógłby wyjaśnić jaśniej co i jak? 

edit: zacząłem coś w tym grzebać i po zapisaniu jednego klucza: score; value: 1 wynikiem w saves.dat jest ciąg literek i cyferek. Chyba pasuje.

Myślałem też nad zapisami w chmurze ale to chyba będzie przerost formy nad treścią. 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Generalnie każde szyfrowanie jest spoko, dopóki ktoś w kodzie gry nie wykryje jakie ono jest (wtedy nawet SHA 512 nie pomoże, jak klucz prywatny znajdą). Wiele razy pisaliśmy w różnych tematach, że ja ktoś się uprze, to znajdzie sposób na obejście gry. Pytanie, czy warto jest poświęcać na to czas? Przecież taki gracz psuje grę głównie sobie, także w singlu nie ma to aż takiego znaczenia, a w grach online najważniejsze dane powinien przetwarzać serwer, żeby gracz nie mógł ich nadpisać łatwo.

Odnośnik do komentarza
Udostępnij na innych stronach

Wróciłem i jak zwykle mam pytanie. Otóż wiem jak się liczy procenty ale nie wiem jak mam to wykorzystać.

Jak napisać kod, który daje mi np 100-90% szans, że trafię w głowę, 90-75 % szans, że trafię w tors, 75-45% szans, że trafię w rękę, 45-20% szans, że trafię w nogę i 20-0%, że nie trafię w ogóle. Napisałem coś takiego bez procentów, ale nie działa poprawnie, bo losowanie liczby to dalej losowanie :/ 



step postaci:

if imwalk == true{ // jeżeli idę
        maxhead = 100;
        minhead = 90;
        maxtorso = 90;
        mintorso = 30;
        maxarm = 30;
        minarm = 25;
        maxleg = 25;
        minleg = 10;
        maxmiss = 10;
        minmiss = 0;
    }



create pocisku:

var tt = irandom(1.1);
procent = lerp(0,100,tt);



step pocisku:

                if procent > minhead && procent < maxhead{
                    bodyshot = 0;
                } else {
                    if procent > mintorso && procent < maxtorso{
                        bodyshot = 1;    
                    } else {
                        if procent > minarm && procent < maxarm{
                            bodyshot = round(irandom_range(2,3));    
                        } else {
                            if procent > minleg && procent < maxleg{
                                bodyshot = round(irandom_range(4,5));    
                            } else {
                                if procent > minmiss && procent < maxmiss{
                                    bodyshot = 6;    
                            }
                        }
                    }
                }

 

Odnośnik do komentarza
Udostępnij na innych stronach

Ten element jest dla mnie zupełnie nie zrozumiały. Nie możesz zwyczajnie zrobić procent = irandom(100)

11 godzin temu, H2S04 napisał:

var tt = irandom(1.1); procent = lerp(0,100,tt);

 

Ogólnie nie wiem w czym masz problem. Nie zadałeś konkretnego pytania. ;) Jedyny potencjalny problem jaki widzę to że gdy twój random trafi dla przykładu idealne 25.0 to nie spełni się żaden warunek bo masz sprawdzanie "<" i ">" a nie "<=" i ">="

 

A same procenty będzie ci lepiej określać nie przez takie ify a dzieki nadpisywaniu wartości wynikowej:

randomize() // upewniamy się że seed będzie losowy i da losowe wyniki
procent = irandom(100)

//Zawsze domyślnie nie trafisz
bodyshot = 6

//Ale jesli procent bedzie dobry to trafisz przynajmniej to
if procent > minleg { //wieksze od 10
	bodyshot = round(irandom_range(4,5))
}

//A jak bedzie lepszy to już to trafisz.
if procent > minarm { //wieksze od 25
	bodyshot = round(irandom_range(2,3))
	//Ten warunek jak się spełni to nadpisze poprzednią zmianę "bodyshot" więc nie musisz się martwić o sprawdzanie Min-max
}

if procent > mintorso { //wieksze od 30
	bodyshot = 1
}

if procent > minhead { //wieksze od 90
	bodyshot = 0
}

Ważne tylko by te sprawdzanie było wg kolejności szans jak dałem w przykładzie. 10, 25, 30, 90

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

Mam taki fajny error. Czemu nie chce mi zmienić wielkości surface? Jak wpiszę liczby 1920 i 1080, odczytuje normalnie i działa, a jak chce odczytać z ini, to nie chce, nawet jak próbuję odczytać ini inną zmienną. OCB? Znalazłem, że multiplikacja ale dalej nie wiem ocb.


___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Create Event
for object o_controller:

DoMul :: Execution Error
 at gml_Script_scr_camera (line 20) - surface_resize(application_surface,view_width*window_scale,view_height*window_scale);
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_scr_camera (line 20)
called from - gml_Object_o_controller_Create_0 (line 6) - scr_camera();
Kod Kamery:
ini_open("GameOptions.ini");
view_width = ini_read_string("Resolution", "Width", 1920);
view_height= ini_read_string("Resolution", "Height", 1080);
ini_close(); //// TAK NIE DZIAŁA

//view_width = 1920;   //// TAK DZIAŁA NORMALNIE
//view_height = 1080;
window_scale = 3;

window_set_size(view_width,view_height);



surface_resize(application_surface,view_width*window_scale,view_height*window_scale);
if moenter = 3{ // Jak najedzimy na back button
	if mouse_check_button_pressed(mb_left){
		// ini file save
		if resolution = 1{ // jeżeli wybrana jest 1 rozdzielczość
			roomwid = 1920;
			roomhei = 1080;
		} else {
			if resolution = 2{ // etc
			roomwid = 1280;
			roomhei = 720;
		} else {
			if resolution = 3{ // etc
			roomwid = 1366;
			roomhei = 768;
		} else {
			if resolution = 4{ // itp itd
			roomwid = 1280;
			roomhei = 960;
		} else {
			if resolution = 5{
			roomwid = 1024;
			roomhei = 768;
		} else {
			if resolution = 6{
			roomwid = 800;
			roomhei = 600;
		}
		}
		}
		}
		}
		}
		
		ini_open("GameOptions.ini");
	//Keys
		ini_write_string("Keys", "KeyUp", upkey); // nadpisujemy sobie keye
		ini_write_string("Keys", "KeyDown", downkey);
		ini_write_string("Keys", "KeyLeft", leftkey);
		ini_write_string("Keys", "KeyRight", rightkey);
		ini_write_string("Keys", "KeyDrop", dropkey);
		ini_write_string("Keys", "KeyUse", usekey);
		ini_write_string("Keys", "KeyGrenade", grenkey);
		ini_write_string("Keys", "KeyExpMenu", expmenukey);
		ini_write_string("Keys", "KeySprint", sprintkey);
		ini_write_string("Keys", "KeyWalk", walkkey);
	//Resolution
		ini_write_string("Resolution", "Width", roomwid); // ustalam szerokośc room (w tym wypadku na resloution 1 czyli 1920x1080)
		ini_write_string("Resolution", "Height", roomhei); // to samo z wysokością
		ini_write_string("Resolution", "FullScreen", fullscreen); // i czy gra ma być odpalona w full screen
		ini_close();
		
		options = false; // wyłączam rysowanie opcji
	}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Możliwe, że ma to związek z aktualizacją GMS 2.2, mnożenie łańcucha znaków przez liczbę nie działa. Jak zrobisz rzutowanie funkcją real(str) powinno zadziałać, albo odwróć kolejność mnożenia:

surface_resize(
  application_surface,
  window_scale*view_width,
  window_scale*view_height
);

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

O ile zgodzę się, że do zapisania liczby czasem ini_write_string jest lepszy (sam tak robię, bo dla liczb całkowitych wtedy nie zapisuje się .00000), to do wczytania musi być ini_read_real (GM sobie świetnie radzi z ich odczytaniem, mimo, że jak zapisuje liczby to dodaje cudzysłów - przy odczycie nie musi go być, to jest pewnie dla zapewnienia kompatybilności).

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Witam, 
Z racji, że jestem noga z matmy, proszę o pomoc.
Mam pasek wytrzymałości na bazie sprite'ów. Zależnie ile punktów wytrzymałości bohater posiada, tyle sprite'a rysuje. Tylko rysuje mi go od góry, a ja na przekór losu chciałbym, aby rysował mi go od dołu. Kolega nie znający się na programowaniu powiedział, że mam napisać kod odwrotnie :D no coś w tym jest ale nie mogę dojść do ładu.

Create:

stamina = 0; //ilość wytrzymałości (max 100)


Draw:

var _h = sprite_get_height(sStamina_bar) + 10; // +10 - bo ramka tyle ma
var _w = sprite_get_width(sStamina_bar);

				//  (stamina/max_stamina)*wysokość_sprite'u
draw_sprite_part(sStamina_bar, 0, 0, 0, _w, (stamina/100)*_h, 15, room_height/2 - _h/2) // wypełnienie

draw_sprite(sStamina_bar, 1, 15, room_height/2 - _h/2); // ramka


Wynik:
Stamina = 20;
Max_stamina = 100;
image.png.2b65673a45f279f88faaaf1cc0e67d9a.png

Więc generalnie chciałbym aby rysował wypełnienie od dołu w górę. Jakieś wskazówki? :(

Odnośnik do komentarza
Udostępnij na innych stronach

Pytanko: w jednym obiekcie mam surface wielkości całego roomu. Inne obiekty normalnie się w nim nie wyświetlają, a chciałbym, żeby rysowały się w tym surface. Dlatego obiektom, które chcę rysować w tamtym surface odznaczam "visible", a potem w step daję:

 

     surface_set_target(core.target_surface);
     draw_self();
     surface_reset_target();

Czy to normalna metoda czy powinienem to robić inaczej?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

1) Surface nie powinien przekraczać wielkości ekranu.

2) pamiętaj, że po surface_set_target rysujesz względem piksela 0,0 tego surface, wiec jak są w grze "views", to trzeba o tyle odjąć obecną pozycję rysowania, żeby było widać

3) a nie potrzebujesz czasem tutaj application_surface, zamiast z każdego obiektu rysowanie na surface włącząć ?

Odnośnik do komentarza
Udostępnij na innych stronach

Nie do końca mam pojęcie jak zastosować tutaj application_surface :(

 

Kombinuję i niewiele wychodzi. Chciałbym na tym surface rysować większość obiektów w grze (poza chociażby interfejsem). Ale tak czy siak natknąłem się na inny problem - przy rysowaniu na surface wartość depth nie ma żadnego znaczenia. Wcześniej stworzony obiekt zawsze rysuje się wyżej, a chciałbym, żeby to było zależne od pozycji Y.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Przykład sortowania obiektów jest wśród oficjalnych tutoriali do GMS2. Jeśli chodzi o GMS1 - no to musisz kombinować, ale rysując na surface trzeba by je dodać do jakiejś listy i rysować wg. Y.

 

application_surface powinno łapać wszystko co jest rysowane w grze (poza gui), więc wydaje się lepsze, bo wtedy nie musisz zmieniać nic w kodzie i depth będzie działał jak trzeba.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Depth przy rysowaniu application_surface działa jak należy i wydawało się wszystko być ok, problem pojawił się gdzieś indziej. Używam shadera, który po dłuższej chwili na urządzeniu z Androidem zaczyna "lagować". FPS-y nie spadają, natomiast efekt shadera zaczyna jakby klatkować. Czy to normalne na Androidzie? Nigdy wcześniej nie używałem shaderów.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jeśli FPSy nie spadają, to shader powinien się wykonać co klatkę jeśli kod jest dobrze napisany, gdyż one nie są asynchroniczne - musiała by cała gra zwolnić razem z nim. Może nie czyścisz surface i zostają w nim rzeczy z poprzednich klatek i stąd dziwy efekt?

Odnośnik do komentarza
Udostępnij na innych stronach

Czy korzystając z application_surface też muszę go czyścić? Bo w sumie tylko rysowałem w "draw gui begin" przed  "shader_reset();"
 

Ale nawet jakbym stworzył najprostszy surface:

     surface_set_target(target_surface);    
     draw_sprite(backg,0,x,y)
     surface_reset_target();

 

To i tak po chwili zaczyna klatkować. Co ciekawe - sprawdzam i na P9 i na P30 i zaczyna klatkować mniej więcej w tym samym czasie. Więc to chyba nie sprzętowo. Chyba po prostu spróbuję z innym shaderem...

 

Inne pytanie: dlaczego w GM2 potrzebne są takie tutoriale jak poniższy:

 

https://www.youtube.com/watch?v=rcMHwdvEDy0&feature=emb_logo

 

Czym to się różni od zwykłego "depth"?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

W GMS2 nie powinno się używać depth, gdyż są layery i wtedy każdy obiekt trafia na wirtualne layery, oraz kłóci się z tym co jest na layerach (bo one już mają narzucony depth). Depth został dla kompatybilności, ale jego status to "deprecated" i w GMS3 zniknie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Niestety, też mam ten problem. Ale przełączanie layerów trwa tak krótko, że w mojej grze teraz zrobiłem po prostu kodem jeden layer na każe 25 pikseli i jakoś to nawet działa - aczkolwiek to się sprawdzi tylko w grach jak stare RPG, gdzie postaci są wyrównywane do siatki.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Przez nowy super, hiper świetny GM2 straciłem projekt. Straciłem na chwilę prąd podczas pracy (ale pisałem kod i nie zapisywałem nic), a po ponownym włączeniu komputera już nie mogę go załadować. Wyskakuje "this project is an older format and will need to be converted" (xD), a potem "Project load failed". Unable to load" XD

Jedyne co widzę, że da się jeszcze zrobić to utworzyć zasoby o tych samych nazwach, a potem przeciągać pliki GML z poprzednich zasobów. W jaki sposób naprawić poprzednią wersję? Gdzie GMS2 robi backupy? Czy przy ogólnej biedzie opcji i tego już nie ma?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jak na moje, to zaktualizowałeś GMa przy okazji :) A backupy to się robi samemu, korzystając z gita (poza GMS). Spróbuj też na najnowszej becie, albo wywalając katalog options.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Jedynie 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ę poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...