Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

  • Administratorzy

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

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Nie wiem jak o to zapytać w googlach po angielsku, więc zapytam na gmclanie po polsku.
Jak przesłać odwołanie do adresu zmiennej w pamięci a nie przypisanej wartości do funkcji.

np. mam w obiekcie
create: sndPlayer = 1; //to ma robić coś w deseń Sound Instance ID
step: play_sound(sndSound1, 1, 1, sndPlayer);

a w funkcji:

function play_sound(snd, gain = 1, pitch = 1, sound_player = -1)
{
	if(sound_player != -1) if(!audio_is_playing(sound_player)) {sound_player = audio_play_sound(snd, 1, false, gain,0, pitch); return true;}
}
	


No to i tak odtwarza dźwięk co klatkę, zamiast czekać aż się zakończy, bo pewnie przesyła wartość zmiennej czyli 1. Jak zrobię na sztywno, czyli tak:

function play_sound(snd, gain = 1, pitch = 1)
{
	if(!audio_is_playing(sndPlayer)) {sndPlayer = audio_play_sound(snd, 1, false, gain,0, pitch); return true;}
}
	


No to działa elegancko.
Chyba, że gmlu czegoś takiego nie ma, bo z tego co kojarzę to jakieś pointery to w c++ są
Nie chce robić zmiennych globalnych, bo wiele obiektów ma zmienną sndPlayer. Szukam czegoś w stylu get_variable_address(sndPlayer)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nie bardzo rozumiem co to ma do rzeczy ze wskaźnikami :)

audio_is_playing przyjmuje albo ID dźwięku, albo id instancji dźwięku, zwróconej przez audio_play_sound.

W twoim (pierwszym) kodzie:

snd => id assetu dźwięku

sound_player => id instancji odtwarzania dźwięku

 

Może chodzi Ci o efekt, który uzyskasz pisząc:

 

if(!audio_is_playing(sound_player) and !audio_is_playing(snd))

 

Btw. domyślnie nie zalecam ustawiania wartości 1. Najlepiej "undefined".

Odnośnik do komentarza
Udostępnij na innych stronach

Jak dla mnie wygląda to na shadowing zmiennych, puszczasz wartość `-1` w argumentach:

function play_sound(snd, gain = 1, pitch = 1, sound_player = -1) <--- tutaj

 

Definiujesz to jako zmienną lokalną funkcji (nie instancji), a potem zamieniasz jej wartość tutaj:

sound_player = audio_play_sound

 

Wygląda mi to na zwyczajny shadowing, a ta zmienna ma scope funkcji a nie instancji w której ta funkcja jest odtwarzana, zwyczajnie `sound_player` zawsze jest `-1` (zakładając, że podstawiasz do niej wartość -1 z innej zmiennej podczas jej wywołania, bądź pozostawiasz argument "pusty", który jest zastępowany wartością domyślną, `-1`).

 

Pewnie szukasz czegoś w rodzaju:
variable_instance_set (yoyogames.com)

variable_instance_get (yoyogames.com)

 

Ewentualnie po prostu zwracaj ID (wartość po wywołaniu audio_play_sound) odtworzonego dżwięku zamiast posiłkować się taką "adresacją".

Odnośnik do komentarza
Udostępnij na innych stronach

Cytat


O! Bardzo prawdopodobnie, że tego właśnie szukałem. Robiłem też return sound_player zamiast true, ale to nic nie dało. Na razie zrobiłem to po normalnemu, czyli tak jak Gnysek napisał, ale chciałem to sobie zrobić bardziej elastycznie. Prościej mówiąc, chcę uniknąć pisania za każdym razem if(!audio_is_playing(sndPlayer)) a dodatkowo kiedyś też miałem problem właśnie z tym przesyłaniem zmiennych, gdzie zmienna w funkcji i instancji miała być tą samą.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale jak każda instancja ma inny dźwięk, to jego id w zmiennej zupełnie wystarczy - wywołując skrypt np. za pomocą with() możesz ustawić kontekst instancji z której kod się wykona i wtedy "widzi" jej lokalne zmienne, nie trzeba ich przekazać w argumencie.

Odnośnik do komentarza
Udostępnij na innych stronach

tak tak, problem mam z tym, że ja w funkcji nie wiem jaka jest nazwa tej zmiennej w instancji. Niektóre mają sndPlayer a inne inaczej, dlatego chciałbym przesyłać odwołanie do zmiennej. Odwołanie, a nie przypisanie, bo chciałby też wiedzieć kiedy ta zmienna jest wykorzystywana (audio_is_playing).
No nie potrafię tłumaczyć :D albo za dużo wymyślam :D

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Dobra, teraz zrozumiałem. Np. obj_a ma zmienną sndPlayer, a obj_b ma zmienną sndEnemy i chcesz odtwarzać właśnie je, ale zawsze mają inne nazwy.
Tyle, że tę nazwę też gdzieś musisz przetrzymywać (np. sndVariabke = "sndEnemy"), więc chyba lepiej po prostu ujednolicić nazwę zmiennej :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • 7 miesięcy temu...

Mam pytanie z innej beczki, otóż posiadam kod ekwipunku, czyli rysowanie slotów, oraz przenoszenie przedmiotów, łączenie ich itp. Jednak napisałem kod w DrawGui zamiast step, jak bardzo może wpłynąć to na grę? Oczywiście kod działa tylko po kliknięciu myszą oraz gdy EQ jest włączone. Pozdrawiam :D

 

PS. Tak wiem, że kod powinienem przenieść do stepa, bo on obsługuje logikę gry i jest wykonywany co ilość klatek, a Draw jest do rysowania, bo wykonywany jest ciągle, jednak ciekawi mnie to, zanim napiszę kod od nowa przenosząc do StepEvent :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
12 godzin temu, H2S04 napisał(a):

Jednak napisałem kod w DrawGui zamiast step

 

Ja zazwyczaj też tak robię, chociaż faktycznie logikę lepiej byłoby mieć w Step. Z mojego jednak doświadczenia, skoro nie masz tego kodu w step, to even step wykona się o tyle szybciej, a draw o tyle samo dłużej :) Możesz użyć profilera w debuggerze, albo zwykłego show_debug_overlay, żeby zobaczyć jaki to ma wpływ na FPS - może się okaże, że masz całkiem spory zapas (spory zapas przy grze 60FPS to znaczy, że wspomniana funkcja pokazuje tak z 300-400FPS).

 

Tak naprawdę, w najnowszych wersjach języka GML, zamiast rozdzielać kod na step/draw, lepiej już napisać strukturę-konstruktor, która ma w sobie statyczne funkcje draw/step i je wywoływać w jakiejś instancji. Zaletą tego rozwiązania jest, że można sobie wtedy różne własności GUI (jak wybrany element, pozycję kursora/obwódki, podświetlenia elementów itp.) zapisać w takiej strukturze jako wewnętrzne zmienne, które nie przeszkadzają instancji (można użyć tych samych nazw) i które wtedy łatwiej używać (step wylicza zmienne dla draw).

12 godzin temu, H2S04 napisał(a):

Tak wiem, że kod powinienem przenieść do stepa, bo on obsługuje logikę gry i jest wykonywany co ilość klatek, a Draw jest do rysowania, bo wykonywany jest ciągle

Nie do końca prawda. Jeśli gra ma 60 FPS, to znaczy, że masz 60 razy wykonany event step a po nim event draw. Oba są wykonane 60 razy, w GM nie ma tak, że przeskakuje klatki i wtedy będzie więcej stepów. Dlatego tak niepopularny w GM jest delta timing, bo gdyby ten rozjazd był z automatu, trzeba by w każdej grze go używać, nawet w Catch the Clown.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
2 godziny temu, gnysek napisał(a):

Jeśli gra ma 60 FPS, to znaczy, że masz 60 razy wykonany event step a po nim event draw. Oba są wykonane 60 razy, w GM nie ma tak, że przeskakuje klatki i wtedy będzie więcej stepów. Dlatego tak niepopularny w GM jest delta timing, bo gdyby ten rozjazd był z automatu, trzeba by w każdej grze go używać, nawet w Catch the Clown.

 

delta timing rozwiązuje też inny problem - jeżeli Twoja gra ma chodzić w 60 fpsach, a komputer gracza faktycznie doi 15 klatek na sekunde, i nie masz poprawki na delta timing, to gracz gra w slow mo - pocisk wroga który leciałby 1s leci 4s itd

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...
  • Administratorzy
12 minut temu, I am Lord napisał(a):

Nie ma już funkcji która zwracała ilość dotknięć ekranu? 

W jakim sensie dotknięć? Ile obecnie miejsc jest wciśnięte? Obstawiam takie coś:

 

var _cnt = 0;
for(var i = 0; i < 5; i++){
    if (device_mouse_check_button(i, mb_left)) _cnt++;
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 9 miesięcy temu...

EDIT 2: Ogólnie, kamera się popsuła i zaczęła mi wywalać czarne pasy po bokach ekranu, więc po prostu zmodyfikowałem End Stepa, by przy wykryciu zmiany rozmiaru okna zmienił wielkość kamery oraz zmienił rozmiar, app_surface. Wszystko działa poprawnie, jednak dalej trzeba zmaksymalizować okno (GM na to nie pozwala, trzeba dodać plik dll który by to wykonał)

 

EDIT: Dobra... Widzę gdzie jest problem... Gra uruchamia się w oknie, ale jest nie dopasowane do ekranu, po wciśnięciu dopasowania (wypełnienia jak kto woli :P) do ekranu (kwadracik), wszystko się naprawia -.-. Matko, a ja już 3 kamerę piszę... przynajmniej ją skróciłem o 3/4 :)

z funkcją window_set_showborder(false); też wszystko się naprawia 😪

 

Witajcie, mam problem z GUI, a mianowicie skalowanie... Otóż, na fullscreenie koordynaty rysowania oraz myszy się zgadzają, po wyłączeniu fullscreena pozycja myszy z GUI się nie zgadza... Nie ważne jakiej funkcji do ustalania wielkości Gui użyję, koordy się nie zgadzają.. (Próbowałem display_set_gui_size(Window_Width, Window_Height); // display_set_gui_size(window_get_width(),window_get_height()); // display_set_gui_size(view_wport[0], view_hport[0]); // teraz pytanie gdzie jest problem, szukam w google i nie mogę ogarnąć problemu)

 

Kamerę tworzę bezpośrednio w roomie i w alarmie skaluję GUI.

 

// create 
Window_Width = 1920;
Window_Height = 1080;
Cam_Scale = 1;
Cam_W = Window_Width / Cam_Scale;
Cam_H = Window_Height / Cam_Scale;
FullScreen = false;

move = true;
alarm[0] = 1;
surface_resize(application_surface,Window_Width,Window_Height);
window_set_size(Window_Width,Window_Height);
window_center();
view_enabled = true;
view_visible[0] = true;

view_xport[0] = 0;
view_yport[0] = 0;
view_wport[0] = Cam_W;
view_hport[0] = Cam_H;

view_camera[0] = camera_create_view(0, 0, view_wport[0], view_hport[0], 0, o_Player, -1, -1, Cam_W/2, Cam_H/2);
camera_set_view_pos(view_camera[0],o_Player.x - (Cam_W/2),o_Player.y - (Cam_H / 2));




alarm[0] = 1;





//alarm 0
x = o_Player.x;
y = o_Player.y;
if move{
	if alarm[0] < 0{
		alarm[0] = 1*room_speed;	
	}
}

if FullScreen{
	display_set_gui_maximize();
	window_set_fullscreen(true);
} else {
	display_set_gui_size(view_wport[0], view_hport[0]);
	window_set_fullscreen(false);
}


//clean up

camera_destroy(view_camera[0]);




 

Mysz jest na górze czerwonego kwadratu...

1.png

2.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • 7 miesięcy temu...

A teraz mam pierdołę. Mam taki kod

 

var _inst = instance_create([reszta kodu]);

with(_inst) {

  Direction = _Direction

Damage = _Damage

Head_Shot = true

Oczywiście wszystko leci w instancje tylko ta jedna się nie zmienia i jest to Head_Shot, badałem sprawę za pomocą show_debug_msg. Ale jedyne co wychodzi ze nie chce tylko tej zmiennej przenieść, wszystkie inne zmienia normalnie. Dziwne 😅

 

EDIT: znalazłem odpowiedź grzebiąc w necie, ten typ tak ma 🤷🏻‍♂️ dlatego na końcu instancji wprowadzono możliwość tworzenia struktur, by tworzyć zmienne przed stworzeniem obiektu. 👌

Edytowane przez H2S04
Znalezienie rozwiązania
Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
W dniu 8.11.2024 o 00:30, H2S04 napisał(a):

dlatego na końcu instancji wprowadzono

 

Ja tu doprecyzuję, że w najnowszych wersjach GM wygląda to tak:

- utworzenie instancji

- ustawienie zmiennych z Variable Definitions (w object properties)

- ustawienie zmiennych z Structa przekazanego w instance_create_... (tylko instancja z kodu)

- ustawienie zmiennych z create

- ustawienie zmiennych z instance creation code (tylko instancja z rooma)

- reszta kodu

 

Dodaktowo, mamy jeszcze operator ??=, dzięki któremu można w create obejść problem, że zmienna została ustawiona przez structa i go nadpiszemy, ale warunkiem jest, żeby w Variable Definitions dać zmiennej wartość "undefined".

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