Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

Nie. Działało jak używałem if(keyboard_check_pressed(vk_left)). Tylko vk_left o ile się nie mylę przechowuje tylko id przycisku(int). Dlaczego więc nie działa po mojemu?

 

 

Owszem przechowuje tylko, że w device keyboard w systemie operacyjnym i tylko stamtąd pobiera tę zmienną jako rezultat odczytu i/o device.

Właśnie dlatego ma funkcję co się nazywa oddzielnie, inaczej byś mógł po prostu zadać variable_N = vk_left i też by grało :)

 

Właśnie dlatego jest keyboard_key_press(key);

 

Podejrzewam, że chciałeś przypisać własną tablice konfigurowania znaków.

 

To niestety musisz stworzyć tablicę wczytującą z klawiatury do Twojej array[key], a później z tej macierzy pobierać rezultat.

Właściwie to tak działają przyciski joysticków, pady, więc tam znajdziesz rozwiązania lepsiejsze i gorsiejsze.

 

Na szczęście klawiatura podaje znaki właśnie jako int, więc w ds_list możesz sobie wrzucić w pola wartość jest/nie ma, i przypisać rezultaty do innej ds_list z której czytasz wejście dla fizyki gry.

Odnośnik do komentarza
Udostępnij na innych stronach

utwórz ten sam obiekt od nowa (w sensie new object, i wklej to samo), wylacz i wlacz jeszcze raz gma

 

Wczoraj miałem taki problem :D ale ze skryptem, widział jakiś błąd w składni którego nie było. crtl+A kopiuj, wklej do nowego skrytpu i już błędu nie miałem. Magia GMa.

Odnośnik do komentarza
Udostępnij na innych stronach

Wracając do optymalizacji - czy rozciągnięcie obiektu (mam na myśli teraz "gotową" fizykę w GM) nie wpływa na kolizje z tym obiektem?Chyba "collision box" trochę nie nadąża za takimi zmianami, w każdym razie jak rozciągnąłem prostokąt x10 to jego kolizje były totalnie nie pasujące do realnego rozmiaru (coś tam się zwiększyło ale mniej niż powinno)Jak to ominąć?

Odnośnik do komentarza
Udostępnij na innych stronach

Wracając do optymalizacji - czy rozciągnięcie obiektu (mam na myśli teraz "gotową" fizykę w GM) nie wpływa na kolizje z tym obiektem?Chyba "collision box" trochę nie nadąża za takimi zmianami, w każdym razie jak rozciągnąłem prostokąt x10 to jego kolizje były totalnie nie pasujące do realnego rozmiaru (coś tam się zwiększyło ale mniej niż powinno)Jak to ominąć?

 

Poziom rozciągnięcia maski nie ma wpływu na optymalizację. w sumie xscale i yscale to tylko wartość przez którą mnoży wymiary boxa, anwet z xscale i yscale = 1 będzie mnożyć...przez 1.

Odnośnik do komentarza
Udostępnij na innych stronach

Poziom rozciągnięcia maski nie ma wpływu na optymalizację. w sumie xscale i yscale to tylko wartość przez którą mnoży wymiary boxa, anwet z xscale i yscale = 1 będzie mnożyć...przez 1.

 

Tyle że mnożenie *1 jest bardzo szybkie, *2 *4 itd całkiem szybkie, a mnożenie *math.pi *cos *tan bardzo nieszybkie.

Odnośnik do komentarza
Udostępnij na innych stronach

Owszem przechowuje tylko, że w device keyboard w systemie operacyjnym i tylko stamtąd pobiera tę zmienną jako rezultat odczytu i/o device.

Właśnie dlatego ma funkcję co się nazywa oddzielnie, inaczej byś mógł po prostu zadać variable_N = vk_left i też by grało :)

 

Właśnie dlatego jest keyboard_key_press(key);

 

Podejrzewam, że chciałeś przypisać własną tablice konfigurowania znaków.

 

To niestety musisz stworzyć tablicę wczytującą z klawiatury do Twojej array[key], a później z tej macierzy pobierać rezultat.

Właściwie to tak działają przyciski joysticków, pady, więc tam znajdziesz rozwiązania lepsiejsze i gorsiejsze.

 

Na szczęście klawiatura podaje znaki właśnie jako int, więc w ds_list możesz sobie wrzucić w pola wartość jest/nie ma, i przypisać rezultaty do innej ds_list z której czytasz wejście dla fizyki gry.

 

Czyli co, mam co włączenie wczytywać wszystkie klawisze?

Nie rozumiem o co chodzi trochę :/ Może daj przykład jak będzie działało :/

Ale dla mnie to jest proste skoro vk_left dajmy na to załóżmy że to liczba 36, i nic innego. To co za różnica jak wpiszę 36 osobno? :/

Odnośnik do komentarza
Udostępnij na innych stronach

@3r3se7ven: nie w Gamemakerze, tutaj każda liczba jest traktowana jako liczba 64-bitowa, więc nieważne, co przez co mnożysz.

Nawet gdyby mnożenie przez 1 było szybsze niż 1,61803..., to zmniejszenie dzięki temu liczby obiektów będzie nieporównywalnie bardziej optymalne.

 

Ale procek nie mnoży ich softwearowo, ma wbudowany moduł sine, square, add. Dlatego takie krzaczki jak x2 idą szybko, a pi czy sine nie.

Przetestuj wydajność i zobaczysz.

 

Nawet bez obiektów ^^

 

 

Czyli co, mam co włączenie wczytywać wszystkie klawisze?

Nie rozumiem o co chodzi trochę :/ Może daj przykład jak będzie działało :/

Ale dla mnie to jest proste skoro vk_left dajmy na to załóżmy że to liczba 36, i nic innego. To co za różnica jak wpiszę 36 osobno? :/

 

Dobrze kombinujesz.

 

Tworzysz sobie wirtualną klawiaturę/pada.

key_detected[num] i przypisujesz kolejnym komórką rezultat dla wybranego klawisza.

 

To odwołanie keyboardc_cokolwiek jest odwołaniem do urządzenia.

 

Odwołuj się później do swojego array key_detected[num].

Tak jakbyś czytał klawisze pada do array.

Odnośnik do komentarza
Udostępnij na innych stronach

@3r3se7ven: już sprawdziłem, wydajność jest identyczna

@MaxGaming: to co miałeś było od początku dobrze, coś innego powoduje, że kod nie działa.

Zamiast:

GML
globalvar a,b;

a[0] = liczba

b[0] = liczba

spróbuj:

GML
global.a = 0

global.a[0] = liczba

global.b = 0

global.b[0] = liczba

i zamiast keyboard_check_pressed(b[0]), keyboard_check_pressed(global.b[0]), może teraz zadziała

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem tak:

GML
globalvar KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT;

KEY_LEFT=0; KEY_UP=0; KEY_DOWN=0; KEY_RIGHT=0;

 

KEY_LEFT[0]=vk_left;

KEY_UP[0]=vk_up;

KEY_DOWN[0]=vk_down;

KEY_RIGHT[0]=vk_right;

To samo. A global. działa tak samo jak globalvar :/

 

@seven - nie rozumiem wgl o co Ci chodzi, daj może przykład. Sprawdzam i vk_left/right itp ZAWSZE mają tą samą wartość, nie możliwe, żeby wczytywało coś tam z klawiatury. Co zawierają te zmienne?

8ef50f6e9880.png

 

W ostatniej sekcji odczytuje mi. Co włączenie jest tak samo, więc to są stałe, a nie zmienne ustalane na podstawie jakiegoś układu wejścia :/

Odnośnik do komentarza
Udostępnij na innych stronach

Uzyskany rezultat jest stałą, podaną z klawiatury.

Gdyby to było pudełko ze zmiennymi to byś się dowoływał do nie go pudełko_ze_zmiennymi.vk_left

 

Ale nie jest, jest urządzeniem i dlatego ma taką funkcję device/keyboard/mouse. Z musu.

 

robisz tak...

 

tworzysz array pełen zer o rozmiarze tablicy znaków przy użyciu for

 

używasz for na keyboard_check(i) i przypisujesz true/false do swojej tablicy(i)

 

odwołujesz się do swojej tablicy

 

dla każdego rezultatu z klawiatury przypisujesz w swojej array w numeze dla znaku wartość wciśnięty/niewciśnięty

 

I co step jedziesz przez tablicę.

Zresztą i tak jest to jechane, więc nie zaboli.

Odnośnik do komentarza
Udostępnij na innych stronach

@MaxGaming: czasem, jak nie wiem, co jest nie tak, używam show_message tuż przed niedziałającym kodem, aby sprawdzić, jaką wartość ma zmienna tuż przed wykonaniem kodu

walnij show_message(KEY_LEFT[argument0])) tuż przed ifem, który z tego korzysta i sprawdź, co wychodzi

Wychodzi to co na SSie. Wiem ja też często tak robię, ale tym razem taki mini silniczek do debugu mam i mi pokazuje wszystkie ważne dla mnie aktualnie zmienne ;p Zrobiłem jeszcze tak:

GML
if(keyboard_check_pressed(38)) i niestety nie działa, czyli jakoś inaczej trzeba :/ Nikt nigdy nie robił key mappingu w gierce w GMie?

 

@e: Już wiem. Wszystko było ok tylko źle inicjowałem skrypt(jeden if zły) i skrypt w ogóle nie sprawdzał xDD

Odnośnik do komentarza
Udostępnij na innych stronach

Wychodzi to co na SSie. Wiem ja też często tak robię, ale tym razem taki mini silniczek do debugu mam i mi pokazuje wszystkie ważne dla mnie aktualnie zmienne ;p Zrobiłem jeszcze tak:

GML
if(keyboard_check_pressed(38)) i niestety nie działa, czyli jakoś inaczej trzeba :/ Nikt nigdy nie robił key mappingu w gierce w GMie?

 

@e: Już wiem. Wszystko było ok tylko źle inicjowałem skrypt(jeden if zły) i skrypt w ogóle nie sprawdzał xDD

 

Przecież klawiatura w GMS jest wirtualna ^^

Jeśli Ci wczytuje poprawne wartości to masz szczęście, mi z kilku klawiatur tylko jenda na ps2 tak robi.

Odnośnik do komentarza
Udostępnij na innych stronach

Przecież klawiatura w GMS jest wirtualna ^^

Jeśli Ci wczytuje poprawne wartości to masz szczęście, mi z kilku klawiatur tylko jenda na ps2 tak robi.

ALE MÓWIMY CAŁY CZAS O GAME MAKERZE xDDDDDD

Tak podejrzewałem, że Twoje informację mają się ni jak do GMSa :P

Odnośnik do komentarza
Udostępnij na innych stronach

To sprawdź jak to działa na kilku klawiaturach z różnymi sterownikami.

Teraz jest dużo egzotyki.

W GMSie działa tak samo... Nie wiem jak GMS sobie sam odczytuje, ale vk_left działa zawsze jako w lewo, na każdej klawiaturze..

Brakuje tu Gnyska, bo on by Ci to potłumaczył jak działa od kuchni pewnie ;p Ja nie wiem jak, wiem, że GMS zawsze ma te same ID ;)

Odnośnik do komentarza
Udostępnij na innych stronach

W GMSie działa tak samo... Nie wiem jak GMS sobie sam odczytuje, ale vk_left działa zawsze jako w lewo, na każdej klawiaturze..

Brakuje tu Gnyska, bo on by Ci to potłumaczył jak działa od kuchni pewnie ;p Ja nie wiem jak, wiem, że GMS zawsze ma te same ID ;)

 

Nocturne mi to przetłumaczył jak kilka lat temu chciałem klawisze zmapować kiedy jeszcze z windy w global_key były wczytywane :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jak najszybciej sprawdzić w debugerze co pobiera najwięcej zasobów?
Nie potrafię łatwo wytłumaczyć. Musisz gdzieś kliknać prawym przyciskiem na okienko i wybrać Profiler. Wtedy klikasz czerwoną kropkę nagrywania i grasz element w grze którzy chcesz zbadać. Lista pokarze Ci wszystkie funkcje jakie się. przez ten czas i ile zabrały czasu.

 

 

Tyle że mnożenie *1 jest bardzo szybkie, *2 *4 itd całkiem szybkie, a mnożenie *math.pi *cos *tan bardzo nieszybkie.
@3r3se7ven: nie w Gamemakerze, tutaj każda liczba jest traktowana jako liczba 64-bitowa, więc nieważne, co przez co mnożysz.

Nawet gdyby mnożenie przez 1 było szybsze niż 1,61803..., to zmniejszenie dzięki temu liczby obiektów będzie nieporównywalnie bardziej optymalne.

Dyskusja jest bezsensowna bo samo sprawdzenie kolizji jest funkcją o wiele bardziej wymagającą obliczeniowo od obliczeń arytmetycznych. A to nie są najcięższe akcje GMa.

 

 

To sprawdź jak to działa na kilku klawiaturach z różnymi sterownikami.

Teraz jest dużo egzotyki.

Nie ma najmniejszej różnicy. GM jest silnikiem wysokiego poziomu. Nie ma żadnej funkcji która odnosi się do sprzętu. Wszystkie informacje są odczytywane ze stanów systemu operacyjnego.

Edit: Moze shadery? Bo nawet bufory są obsługiwane przez system.

 

 

Wytłumaczył by mi ktoś mod i div proszę? Niebyt rozumiem zastosowanie.

5 / 2 = 2.5

5 div 2 = 2

5 mod 2 = 0.5

 

A mod Q = (A / Q) - (A div Q)

Wzór w rzeczywistości jest zupełnie inny ale tak zrozumiesz. Div to dzielenie bez ułamków, mod to reszta z dzielenia.

Odnośnik do komentarza
Udostępnij na innych stronach

A jak się używa || ? Zapomniałem co oznacza :c

to jest OR. AND to &&. Skoro jesteśmy przy temacie to zwrócę uwagę że teraz w Global Game Settings jest opcja włączenia w grze testu Short Circuit Evaluation. Dzięki temu warunki przestają się wykonywać gdy już jest wiadome że jeden z warunków oznacza nie wykonanie. Czyli:

 

if(vspeed>0 and place_free(x,y+1)){}

Ten kod optymalizuje się. Drugi warunek będzie sprawdzony tylko gdy pierwszy będzie miał true.

 

if(instance_exists(gracz) && gracz.hp<0){}

To jest proste zapobieganie błędów. Nawet nie będzie w room instance gracz (bo np został zniszczony) to nie wyskoczy błąd o odniesienie się do nie istniejącego obiektu bo pierw nie udał się test czy ten obiekt istnieje.

 

if(godmode || (jakieś skomplikowane obliczenia)){}

Tutaj dzięki ustawieniu godmode=true reszta obliczeń nie będzie musiała być brana pod uwagę.

Odnośnik do komentarza
Udostępnij na innych stronach

Witam. Mam problem ze skalowaniem obiektu. Mój pocisk jest długości 256 pixeli i chciał bym go zmniejszyć do 0 gdy zbliży się do obiektu o_Zombie ponieważ punkt x na tym spricie jest równy 0 by podczas tworzenia nie przechodził przez postać.

 

GML (End Step)
var near;

near = instance_nearest(x,y,o_Zombie)

 

if collision_line(x,y,xprevious,yprevious,o_Zombie,0,1){

near.hp -= global.dm[o_Player.wm];

image_xscale = point_distance(x, y, o_Zombie.x, o_Zombie.y) / 256 // <<<<<<<< Próbowałem tak ale nie działa :/

repeat(5 + random(30)) with (instance_create(near.x,near.y,o_bloodhit)){

direction = (other.image_angle) - 15 + random(30)

}

instance_destroy();

}

Odnośnik do komentarza
Udostępnij na innych stronach

Witam. Mam problem ze skalowaniem obiektu. Mój pocisk jest długości 256 pixeli i chciał bym go zmniejszyć do 0 gdy zbliży się do obiektu o_Zombie ponieważ punkt x na tym spricie jest równy 0 by podczas tworzenia nie przechodził przez postać.

 

GML (End Step)
var near;

near = instance_nearest(x,y,o_Zombie)

 

if collision_line(x,y,xprevious,yprevious,o_Zombie,0,1){

near.hp -= global.dm[o_Player.wm];

image_xscale = point_distance(x, y, o_Zombie.x, o_Zombie.y) / 256 // <<<<<<<< Próbowałem tak ale nie działa :/

repeat(5 + random(30)) with (instance_create(near.x,near.y,o_bloodhit)){

direction = (other.image_angle) - 15 + random(30)

}

instance_destroy();

}

 

Możęsz użyć draw_sprite_part lub draw_sprite_part_ext aby rysować tylko część sprite'a której Ci trzeba.

 

Długość sprite ustaw na: "min(256,point_distance(x,y,x_celu,y_celu);"

Min wybierze mniejszą wartość, jeżeli pocisk jest ponad 256 pikseli od celu narysuje całego sprite'a, a jeżeli jest bliżej tylko tyle ile trzeba.

 

Zastanawiają mnie motywy tego, co robisz, ale nie będę krytykował.

Odnośnik do komentarza
Udostępnij na innych stronach

Możęsz użyć draw_sprite_part lub draw_sprite_part_ext aby rysować tylko część sprite'a której Ci trzeba.

 

Długość sprite ustaw na: "min(256,point_distance(x,y,x_celu,y_celu);"

Min wybierze mniejszą wartość, jeżeli pocisk jest ponad 256 pikseli od celu narysuje całego sprite'a, a jeżeli jest bliżej tylko tyle ile trzeba.

 

Zastanawiają mnie motywy tego, co robisz, ale nie będę krytykował.

Jak Cię zastanawiają to już daję odpowiedź :) Jest to pocisk, chodzi tylko o wizualizację. Po co mi mały pixel lecący do celu. Jak dla mnie lepiej wygląda lecąca taka jak by smuga, lecz nie chcę by ta smuga przechodziła też przez zombiaka :) Robiłem wcześniej to na draw_line lecz efekt był mizerny :) Zabieram się do pracy nad tym i idę spać bo nie spałem od... wczoraj.. GameMaker jakoś mnie pochłonął :D

 

PS. Coś nie idzie :/ draw_sprite_part_ext nie ma rotacji i jest to problem. Kle lecą poziomo zamiast pionowo do celu oraz zauważyłem, że nie bardzo to idzie. Idę spać bo już padam przed lapkiem. Może jak ktoś będzie miał chwilę to jakoś lepiej wytłumaczyć to się na przyszłość nauczę lecz teraz jestem wrakiem i niczego nie zrobię w GMie :D Pozdrawiam.

 

GML (Draw)
var ps;

if instance_exists(o_Zombie){

ps = min(256,point_distance(x,y,o_Zombie.x,o_Zombie.y));

draw_set_blend_mode(bm_add);

draw_sprite_part_ext(sprite_index,sprite_index,sprite_index,sprite_index,ps,sprite_index,x,y,1,2,c_yellow,0.5)

draw_set_blend_mode(bm_normal);

}

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