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

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