Skocz do zawartości
Chell

Temat zbiorczy na drobnostki

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ą. 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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.

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
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;    
                            }
                        }
                    }
                }

 

Udostępnij tego posta


Odnośnik do posta
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dzięki Threef, znowu zrobiłem sobie pod górkę, kombinowaniem, wyjdę z roboty, będę testował 😁 Pozdrawiam. 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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
	}

 

Udostępnij tego posta


Odnośnik do posta
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
);

 

  • Super (+1) 1
  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jutro po robocie (po 20) obczaję, jak coś napisze, czy pykło, pozdrówki 😁

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ja wyraźnie widzę odczytywanie stringa z ini.

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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).

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gdzieś wydybałem jak gnysek pisał o plikach ini, że lepiej sprawuje się string jak real, dodałem linijkę real() i jest gitara 😁

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Też wszędzie jak potrzebuję ini to wszystko trzymam jako string. Jest to też łatwiejsze do edycji gdy każda wartość to string.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Czemu 15*room_speed daje mi 10s zamiast 15, a 30*room_speed 20s 😳

PS. Napisałem swój zegar ale ciekawi mnie to (gra ustawiona na 60fps)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Opcje są 3:
- Albo źle liczysz
- Albo roisz 15*room_speed przed zmianą room_speed
- Albo masz lagi w grze i nie masz pełnych 60FPS

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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? :(

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chyba chodzi ci o to:

draw_sprite_part(sStamina_bar, 0, 0, _h -(stamina/100)*_h, _w, _h, 15, room_height/2 - _h/2)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dziwne, bo dodanie tego minusa nie zmieniło działania. Generalnie już nie trzeba, bo się przyzwyczaiłem, ale pamiętam, że często nad tym kminiłem :/

Udostępnij tego posta


Odnośnik do posta
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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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ąć ?

Udostępnij tego posta


Odnośnik do posta
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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.

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ę.

×