Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

Nie używam nigdzie draw

 

Poza tym skoro to działa bez zarzutu

GML
with obj_mobile parent

if (distance_to_object(obj_eye)<100){visible=0}

else visible=1

 

To dlaczego przy tym jest 0 reakcji

 

 

GML
with obj_mobile parent

if (distance_to_object(obj_eye)<100){image_alpha=0}

else image_alpha=1

Odnośnik do komentarza
Udostępnij na innych stronach

Bo nie ma. Nie ma ani słowa kluczowego parent, ani przypisanie jakiejś wartości do zmiennej parent nic nie da. To powinno zwracać błąd. Ale ja rozumiem że to skrót myślowy i ty ustawiasz u góry okienka kodu że ma się wykonywać w innym obiekcie. Jeżeli tak to nigdy tego nie rób. Jest to dziwny feature w GM którego się nie używa bo powoduje on masę chaosu. Jeżeli chciałbyś wykonać jakiś kod z innego obiektu to powinieneś go wykonać w tamtym obiekcie żebyś potem nie szukał danego kawałka kodu.

 

Jeszcze raz dokładnie opisz sytuację. Chcesz sprawdzać czy dystans pomiędzy czym a obiektem obj_eye jest mniejszy, a na podstawie tego zmieniać image_alpha dla wszystkich jakiś obiektów?

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz rozumiem,zapewne chodzi wam o to że napisałem z błędem, nie chodziło o

GML
obj_mobile parent
tylko o
GML
obj_mobile_parent
- to tylko nazwa własne parenta obiektów w grze które się poruszają.

 

Kod który zastosowałem działa w każdym przypadku (testowałem sporo różnych rozwiązań od instance_destroy aż po image_x_scale)- i działa wszystko poza image_alpha.

 

 

Cel jest prosty - kiedy dany obiekt zbliża się do obiektu obj_eye staje się niewidzialny- po odejściu znów go widać.Efekt osiągnąłem (poprzez użycie visible) ale wolałbym żeby pojawiał się płynnie(czyli zmniejszanie alpha)

 

A kod tej zmiany chcę umieścić w obiekcie który to wywołuje (czyli obj_eye) dlatego że taka akcja może się pojawić dopiero w dosłownie 100 planszy- i nie widzę powodu żeby zaśmiecać kod wszystkich obiektów w grze wcześniej

Odnośnik do komentarza
Udostępnij na innych stronach

W takim razie:

 

Ustawić obj_mobile_parent jako parent każdego obiektu który ma znikać. W obj_mobile_parent w step dać:

GML
image_alpha=clamp((100+distance_to_object(obj_eye))/100,0,1)

 

W obiektach dzieciach w step dodać event_inherited()

 

Oczywiście sposoby na zmianę alpha możesz sobie zmienić.

GML
if(distance_to_object(obj_eye)<100){image_alpha=max(0,image_alpha-0.01)}else{image_alpha=min(1,image_alpha+0.01)}
Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Problem wygląda następująco i pierwszy raz coś nie chce działać :/ Zawsze problemów nie było... Przy strzale odejmuje wartość ammo o jeden i w tym przypadku jest 14 ale zaraz zmienia się na 15 ;o skąd i jak?

 

 

GML
Information about object: o_player

Sprite: s_playerpistol

Solid: false

Visible: true

Depth: 0

Persistent: false

Parent:

Children:

Mask:

 

No Physics Object

Create Event:

 

execute code:

 

instance_create(x,y,o_playerlegs);

move = false;

sprint = false;

cshot = true;

reload = false;

lspeed = 0;

mspeed = 4;

 

ammo = 0;

maxammo = 0;

mag = 0;

maxmag = 0;

shottime = 0;

reloadtime = 0;

mindmg = 0;

maxdmg =0;

weaponname = 0;

 

 

weapon[0,0] = 1;

weapon[0,1] = 15; // ammo

weapon[0,2] = 15; // max ammo

weapon[0,3] = 1; // mag

weapon[0,4] = 5; // max mag

weapon[0,5] = 15;// shoot time

weapon[0,6] = 60; // reload time

weapon[0,7] = 5; // min dmg

weapon[0,8] = 15; // max dmg

weapon[0,9] = "Glock";

 

Alarm Event for alarm 0:

 

execute code:

 

realod = false;

cshoot = true;

ammo = maxammo;

mag -= 1;

 

Alarm Event for alarm 1:

 

execute code:

 

cshot = true;

 

Step Event:

 

execute code:

 

image_angle = direction;

direction = point_direction(x,y,mouse_x,mouse_y);

 

weaponn = 0;

ammo = weapon[weaponn,1];

maxammo = weapon[weaponn,2];

mag = weapon[weaponn,3];

maxmag = weapon[weaponn,4];

shottime = weapon[weaponn,5];

reloadtime = weapon[weaponn,6];

mindmg = weapon[weaponn,7];

maxdmg = weapon[weaponn,8];

weaponname = weapon[weaponn,9];

 

dmg = round(random_range(mindmg,maxdmg));

 

if keyboard_check_pressed(ord("R")){

if mag > 0{

if ammo < maxammo{

if reload = false{

alarm[0] = realodtime;

reload = true;

cshoot = false;

}

}

}

}

 

if mouse_check_button(mb_left){

if cshot = true && reload = false{

if ammo > 0{

ammo -= 1;

cshot = false;

alarm[1] = shottime;

}

}

}

 

 

 

if keyboard_check(vk_shift){

sprint = true;

} else {

sprint = false;

}

 

if sprint = true{

mspeed = 6;

} else {

mspeed = 4;

}

 

if keyboard_check(ord("W")) or keyboard_check(ord("S")) or keyboard_check(ord("A")) or keyboard_check(ord("D")){

move = true;

} else {

move = false;

}

if move = true{

if sprint = false{

lspeed = 0.5;

} else {

lspeed = 0.8;

}

} else {

lspeed = 0;

}

 

if keyboard_check(ord("W")) && place_free(x,y-mspeed){

y -= mspeed;

}

if keyboard_check(ord("S")) && place_free(x,y+mspeed){

y += mspeed;

}

if keyboard_check(ord("A")) && place_free(x-mspeed,y){

x -= mspeed;

}

if keyboard_check(ord("D")) && place_free(x+mspeed,y){

x += mspeed;

}

 

Draw Event:

 

execute code:

 

draw_self();

 

 

 

 

// pistol bullet

draw_set_color(c_green);

draw_line(x,y,x + lengthdir_x(50,direction-20) ,y + lengthdir_y(50,direction-20));

draw_set_color(c_white);

 

 

//// laser

draw_set_color(c_red);

draw_line(x + lengthdir_x(50,direction-20) ,y + lengthdir_y(50,direction-20),x + lengthdir_x(500,direction) ,y + lengthdir_y(500,direction));

draw_set_color(c_white);

 

/*

// rifle bullet

draw_set_color(c_green);

draw_line(x,y,x + lengthdir_x(80,direction-14) ,y + lengthdir_y(80,direction-14));

draw_set_color(c_white);

 

draw_set_color(c_red);

draw_line(x + lengthdir_x(80,direction-14) ,y + lengthdir_y(80,direction-14),x + lengthdir_x(500,direction-1) ,y + lengthdir_y(500,direction-1));

draw_set_color(c_white);

 

 

 

Draw GUI Event:

 

execute code:

 

draw_text(0,0,ammo)

draw_text(64,0,mag)

draw_text(128,0,weaponname)

/*

weapon = 0;

ammo = weapon[weapon,1];

maxammo = weapon[weapon,2];

mag = weapon[weapon,3];

maxmag = weapon[weapon,4];

shottime = weapon[weapon,5];

reloadtime = weapon[weapon,6];

mindmg = weapon[weapon,7];

maxdmg = weapon[weapon,8];

weaponname = weapon[weapon,9];

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli się nie mylę chodzi o to, że operację -1 dla amunicji (i wszystkie inne też) robisz na zmiennej ammo (podobnie z mag). Natomiast co step aktualizujesz wszystkie zmienne (ammo itp.) danymi z tablicy weapon[x,y] utworzonymi na początku - a tam zawsze masz 15.

 

wywalenie ze stepu linijek:

 

GML
weaponn = 0;

ammo = weapon[weaponn,1];

maxammo = weapon[weaponn,2];

mag = weapon[weaponn,3];

maxmag = weapon[weaponn,4];

shottime = weapon[weaponn,5];

reloadtime = weapon[weaponn,6];

mindmg = weapon[weaponn,7];

maxdmg = weapon[weaponn,8];

weaponname = weapon[weaponn,9];

 

chyba rozwiąże problem. Musisz tylko dać te linijki np. w create albo jakoś wywołać, ale tylko raz na początku (na końcu postu sugeruję też inne rozwiązanie).

 

 

Oczywiście, gdy dodasz nową broń to przy ich zmienianiu musisz pamiętać żeby zaktualizować to co trzymasz w tablicy. Bo inaczej zmiana broni będzie przywracać pociski i magazynki.

 

Ja bym sobie napisał dwa skrypty: pobierz_bron(tu_numer_broni) i aktualizuj_bron(tu_numer_broni). I przy zmianie np. z 1 na 2 dajesz:

 

 

GML
aktualizuj_bron(1)

pobierz_bron(2)

 

Możesz też mieć oczywiście jeden skrypt zmien_bron(stara_bron,nowa_bron), ale może wczytywanie danych określonej broni gdzieś Ci się przyda? Może planujesz np. sklep (ale wtedy tablica weapon raczej powinna być globalna).

 

Ponadto ja bym też cały kod odpowiedzialny za utworzenie statystyk broni (czyli całą tablicę weapon) dał w innym obiekcie na początku gry a nie w create obiektu gracza.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli się nie mylę chodzi o to, że operację -1 dla amunicji (i wszystkie inne też) robisz na zmiennej ammo (podobnie z mag). Natomiast co step aktualizujesz wszystkie zmienne (ammo itp.) danymi z tablicy weapon[x,y] utworzonymi na początku - a tam zawsze masz 15.

 

wywalenie ze stepu linijek:

 

GML
weaponn = 0;

ammo = weapon[weaponn,1];

maxammo = weapon[weaponn,2];

mag = weapon[weaponn,3];

maxmag = weapon[weaponn,4];

shottime = weapon[weaponn,5];

reloadtime = weapon[weaponn,6];

mindmg = weapon[weaponn,7];

maxdmg = weapon[weaponn,8];

weaponname = weapon[weaponn,9];

 

chyba rozwiąże problem. Musisz tylko dać te linijki np. w create albo jakoś wywołać, ale tylko raz na początku (na końcu postu sugeruję też inne rozwiązanie).

 

 

Oczywiście, gdy dodasz nową broń to przy ich zmienianiu musisz pamiętać żeby zaktualizować to co trzymasz w tablicy. Bo inaczej zmiana broni będzie przywracać pociski i magazynki.

 

Ja bym sobie napisał dwa skrypty: pobierz_bron(tu_numer_broni) i aktualizuj_bron(tu_numer_broni). I przy zmianie np. z 1 na 2 dajesz:

 

 

GML
aktualizuj_bron(1)

pobierz_bron(2)

 

Możesz też mieć oczywiście jeden skrypt zmien_bron(stara_bron,nowa_bron), ale może wczytywanie danych określonej broni gdzieś Ci się przyda? Może planujesz np. sklep (ale wtedy tablica weapon raczej powinna być globalna).

 

Ponadto ja bym też cały kod odpowiedzialny za utworzenie statystyk broni (czyli całą tablicę weapon) dał w innym obiekcie na początku gry a nie w create obiektu gracza.

 

Zaraz sprawdzę jak coś edytuję... Dziwne jest to że w stepie wszystko działało w innych projektach :/ Nie na darmo też mam zmienną "weaponn" W niej będę zmieniał wartoś "x" tablicy :D

 

Odnośnik do komentarza
Udostępnij na innych stronach

BloodDzioch:

 

Całość okazała się bardziej zabawna niż mogłoby się wydawać.

 

Najpierw zrobiłem proste rozwiązanie, w którym obiekt pojawiał się przy jednej krawędzi, ale szybko uświadomiłem sobie, że to nie uwzględnia małych prostokątnych przestrzeni przy rogach.

 

 

Takie coś wymyśliłem, ale może jest jakiś prostszy dużo sposób (poza oczywiście losowaniem tak długo aż obiekt będzie poza ekranem - uznałem to za zbyt zasobożerne)

 

 

najpierw stałe:

 

szerokosc - szerokosc okna

wysokosc - wysokosc okna

krawedzx - jaka jest szerokość "paska" po bokach ekranu, w którym może pojawić się obiekt

krawedzy - jaka jest szerokość "paska" na dole i górze ekranu, w którym może pojawić się obiekt

obiektszer-szerokosc obiektu //potrzebne aby mieć pewność, że cały obiekt jest poza ekranem.

obiektwys-szerokosc obiektu

 

 

I teraz kod (aby zrozumieć dlaczego trzeba sobie narysować to na kartce - no dobra ja sobie musiałem narysować:).

GML
pasek=4*krawedzx+2*szerokosc+2*wysokosc-obiektszer //najpierw wybieramy, w którym "polu" pojawi się obiekt.

xpoz=random_range(0, pasek);

 

//Teraz ify. Tu trochę na logikę a trochę metodą prób i błędów

if xpoz<=2*krawedzx+szerokosc-obiektszer {xost=xpoz-(krawedzx); yost=0-random_range(obiektwys, krawedzy);}

 

if xpoz>2*krawedzx+szerokosc-obiektszer and xpoz<=2*(2*krawedzx+szerokosc-obiektszer) {xost=xpoz-(3*krawedzx+szerokosc)+obiektszer; yost=wysokosc-obiektwys+random_range(obiektwys, (krawedzy));}

 

if xpoz>2*(2*krawedzx+szerokosc-obiektszer) and xpoz<=2*(2*krawedzx+szerokosc-obiektszer)+wysokosc+obiektwys {xost=0-random_range(obiektszer, krawedzx); yost=xpoz-2*(2*krawedzx+szerokosc-obiektszer)-obiektwys;}

 

if xpoz>2*(2*krawedzx+szerokosc-obiektszer)+wysokosc+obiektwys {xost=szerokosc-obiektszer+random_range(obiektszer, krawedzx); yost=xpoz-2*(2*krawedzx+szerokosc-obiektszer)-wysokosc-2*obiektwys}

 

 

instance_create(xost,yost,object1)

 

 

Przygotowałem plik testowy. Wyłaczając ify fajnie widać, które obszary są zapełniane:

 

https://www.dropbox.com/s/1kpmc6ntbyhkm2v/t...andom2.gmz?dl=0

 

I teraz tak, naprawdę nie wiem czy jest dobrze. Wygląda, że tak, ale nie dam sobie uciąć głowy.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak zrobić żeby obiekty losowo tworzyły się poza roomem? Najlepiej zaraz za krawędziami albo załóżmy 10-20 px za nimi.

Najszybsze rozwiązanie to tworzenie obiektów przy pomocy lenghtdira od środka ekranu o długości room

GML
instance_create(room_width/2+ lenghtdir_x(random(360), room_width/2), room_height/2+ lenghtdir_y(random(360), room_height/2), o_enemy)

//Pisane z głowy. Penwie pomyliłem argumenty

Odnośnik do komentarza
Udostępnij na innych stronach

Odnośnie tego sposobu, który podałem wcześniej - wydaje mi się, że jest w nim pewna słabość.

 

krawedzx i krawedzy powinny być takie same bo inaczej gęstość umieszczenia obiektów po bokach oraz na górze i dole będzie zaburzona.

 

Odnośnik do komentarza
Udostępnij na innych stronach

hgter@

Ło kurde, szczerze powiedziawszy to byłem pewien że jest jakaś prosta funkcja na tworzenie poza ekranem o której zapomniałem i ktoś przypomni :P No jak widać niekoniecznie, dlatego tym bardziej dziękuje za pomoc i Tobie i Threefowi.

Spróbuje jednak na początku z patentem Threefa.

Odnośnik do komentarza
Udostępnij na innych stronach

Sposób Threefa jest w miarę dobry, ale jego słabością jest to, że obiekty nie będą pojawiać się w tej samej odległości od krawędzi rooma. Natomiast "gęstość" pojawiających się obiektów będzie stała, co jest plusem.

Metoda hgtera jest bardziej wiarygodna (obiekty pojawiają się zawsze w tej samej odległości od krawędzi), ale im bliżej rogów ekranu, tym więcej będzie stamtąd pojawiać się obiektów.

Swoją drogą, tę metodę można skrócić:

GML
if(random(room_width+room_height)<room_width) instance_create(random(room_width),-20+(room_height+2*20)*choose(0,1),obiekt)

else instance_create(-20+(room_width+2*20)*choose(0,1),random(room_height),obiekt)

Liczba 20 oznacza liczbę pikseli od krawędzi, można ją przypisać do zmiennej i dowolnie zmieniać.

Odnośnik do komentarza
Udostępnij na innych stronach

Bardziej zależy mi na równomierności niż na tym żeby tworzyły się koniecznie 20px od krawędzi. Po prostu nie chciałem żeby latały mi jakieś obiekty dziesiątki pikseli poza roomem.

 

Obczaiłem sposób Threefa, była literówka :P ale poza tym obiekty tworzyły się po parędziesiąt pix od środka czyli mniej więcej w połowie rooma (obstawiam że trzeba było zmienić dzielnik, czy coś takiego). Nie rozkminiałem tego bo obczaiłem sposób Amaterasu. Tutaj działa, jednak nie jest równomiernie. Większość obiektów tworzy się w rogach (oczywiście plus minus). Rzuca się w oczy.

Odnośnik do komentarza
Udostępnij na innych stronach

if(random(room_width+room_height)<room_width) instance_create(random(room_width),-20+(room_height+2*20)*choose(0,1),obiekt)
else instance_create(-20+(room_width+2*20)*choose(0,1),random(room_height),obiekt)

 

Mimo, że w takiej formie nie do końca pokrywa się z tym co jest u mnie, to ten zapis jest naprawdę świetny!

Odnośnik do komentarza
Udostępnij na innych stronach

Metoda Threefa powinna działać w następującej formie:

GML
angle=random(360)

distance=sqrt(sqr(room_width/2)+sqr(room_height/2))+offset

instance_create(room_width/2+lengthdir_x(distance,angle),room_height/2+lengthdir_y(distance,angle),obiekt) //poprawka

offset oznacza minimalną odległość, jaką może mieć pewien punkt na okręgu do pewnego rogu ekranu - przyjmując wartość 0, okrąg, na którym będą pojawiać się obiekty, będzie styczny do prostokąta, jaki tworzy room. Im większy offset, tym dalej będą się pojawiać obiekty.

@hgter: miałem z tym do czynienia tak często, że takie rzeczy pisze się instynktownie : >

Odnośnik do komentarza
Udostępnij na innych stronach

Tam w ostatniej linijce jeszcze chyba powinno być wyśrodkowanie?

 

GML
angle=random(360)

distance=sqrt(sqr(room_width/2)+sqr(room_height/2))+offset

instance_create(room_width/2+lengthdir_x(distance,angle),room_height/2+lengthdir_y(distance,angle),obiekt)

 

 

miałem z tym do czynienia tak często, że takie rzeczy pisze się instynktownie : >

 

Ehh, liczę, że też takiej lekkości z czasem nabiorę.

Odnośnik do komentarza
Udostępnij na innych stronach

Komputery nie potrafią losować liczb. Poczytaj o tym. ;)

 

Być może wyciągasz liczby losowe rzadko dlatego widzisz że się powtarzają, bo tak jest. Jeżeli nie użyjesz funkcji randomize() to liczby będą zawsze takie same przy każdym włączeniu gry.

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