Skocz do zawartości

parents i child


Rekomendowane odpowiedzi

Witam,

 

mam następujące dwa problemy:

 

- mam obiekty, które są "child"ami innego obiektu (kulki różnego koloru są pochodnymi obiektu "kula"), chcę im nadać ruch w zależności od odległości od innych obiektów tego typu, czyli jeśli kula zbliży się do innej kuli na wskazaną odległość to ma się zatrzymać. Problem polega na tym, że te obiekty również siebie traktują jako obiekt, który je blokuje i się nie ruszają. Jak zrobić, żeby każda kula "widziała" tylko inne kule, nie siebie.

 

kod:

 

if(distance_to_object(obj_kula)) > 48{

self.y += 5;

}

else{

self.y += 0;

}

 

- jak policzyć obiekty danego typu, ale tylko te, które znajdują się tylko w linii z x = 80?

 

kod, który nie działa (produkuje nieskończoną ilość kul):

 

if(instance_number(obj_kula.x = 80) = 8){

instance_create(80, 0, obj_kula_czerwona)

}

 

Z góry dziękuję.

 

Ps.: na sugestię Uzjela edytowałem. Dzięki

Odnośnik do komentarza
Udostępnij na innych stronach

Na drugie pytanie mogę odpowiedzieć:

GML
c=0

for(var i=0;i<instance_number(obj);i+=1)

in=instance_find(obj,i)

if(in.x==80)

{

c+=1

}

if(c=8){instance_create(80, 0, obj_kula_czerwona)}

 

Na pierwsze stwierdzam że w bardzo zły sposób robisz kolizje.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli kulki nie różnią się niczym poza grafiką to nie rób osobnych obiektów, a kolor (grafikę) określ jako własciwość obiektu (sprite_index). Zedytowałem kod w poprzednim poście żeby robił to co chcesz. No ale w pierwszym pytaniu Ci nie pomożemy. Nie dałeś żadnych informacji. ten kawałek kodu może dotyczyć wszystkiego.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli kulki nie różnią się niczym poza grafiką to nie rób osobnych obiektów, a kolor (grafikę) określ jako własciwość obiektu (sprite_index). Zedytowałem kod w poprzednim poście żeby robił to co chcesz. No ale w pierwszym pytaniu Ci nie pomożemy. Nie dałeś żadnych informacji. ten kawałek kodu może dotyczyć wszystkiego.

 

Dzięki za kod, sprawdzę i dam znać.

Kulki niestety oprócz kolorów będą miały różne cechy. :( Nie wiem co więcej mogę napisać. Jeśli wpisuję ten kod np. do kuli czerwonej i daję reakcję na kulę np. niebieską to wszystko jest ok. Problem pojawia się jeśli zamiast niebieskiej dam obiekt parent lub też kulę czerwoną. Wtedy kula która ma być w ruchu nie rusza się, sama się blokuje.

Odnośnik do komentarza
Udostępnij na innych stronach

No bo robisz w bardzo zły sposób wykrywanie kolizji. Sprawdzanie dystansu nie ma w ogóle sensu bo musiałbyś sprawdzać z najbliższym obiektem. Kule są idealnie okrągłe? Jeżeli tak to:

  • W GM:S popróbuj z fizyką
  • GM8 zrób zwykłe kolizje. Ustaw maskę na okrąg, odznacz 'precise collision checking' i sprawdzaj przez event collision albo place_free()
Odnośnik do komentarza
Udostępnij na innych stronach

No bo robisz w bardzo zły sposób wykrywanie kolizji. Sprawdzanie dystansu nie ma w ogóle sensu bo musiałbyś sprawdzać z najbliższym obiektem. Kule są idealnie okrągłe? Jeżeli tak to:

  • W GM:S popróbuj z fizyką
  • GM8 zrób zwykłe kolizje. Ustaw maskę na okrąg, odznacz 'precise collision checking' i sprawdzaj przez event collision albo place_free()

 

Czyli nie ma sposobu, żeby określić, że obiekt ma brać pod uwagę inne obiekty a nie siebie? Można to ominąć, wiem o tym, ale boję się, że później i tak będzie mi to potrzebne.

Odnośnik do komentarza
Udostępnij na innych stronach

Używanie distance_to_object(parent)) do takich rzeczy jest głupie. I nie robie się tego w ten sposób.

 

Możesz w podobny sposób do tego co zrobiłem w pierwszym poście przeiterować przez wszystkie instance danego obiektu (dzieci też) i wykonywać swoje operacje. Np sprawdzać czy in.id!=id

Odnośnik do komentarza
Udostępnij na innych stronach

Używanie distance_to_object(parent)) do takich rzeczy jest głupie. I nie robie się tego w ten sposób.

 

Możesz w podobny sposób do tego co zrobiłem w pierwszym poście przeiterować przez wszystkie instance danego obiektu (dzieci też) i wykonywać swoje operacje. Np sprawdzać czy in.id!=id

 

Rozumiem, że pod pojęciem "jest głupie" masz na myśli - robią tak mniej doświadczeni użytkownicy GM, tak? ;)

 

A drugie zdanie po polsku poproszę ;) Mam losowo pojawiające się kule o różnych kolorach, spadają one na dół, jednak gdy zbliżą się do kuli leżącej już na dole na daną odległość, zatrzymują się. Co powinienem sprawdzić za pomocą tego kodu?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if(place_meeting(x,y+48,parent)){y+=5}

Widzisz, powiedziałeś o co chodzi i po kłopocie.

 

A z tym że głupie to chodziło mi o to że są o wiele prostsze sposoby, które są przy okazji optymalniejsze i mniej zawodne. distance_to_object() powinno się stosować tylko pomiędzy 2 znanymi obiektami, walenie w parenta to bardzo zły pomysł.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli potem chcesz sprawdzać właściwości kul to nie możesz użyć place_meeting bo to nie zwraca id kolidowanej kuli tylko true lub false (jest kolizja albo jej nie ma)

Więc zrób tak:

GML
var colizja = instance_place(x+hspeed, y+vspeed, kula);

if (colizja != noone)

{

speed = 0; // zatrzyma się kula w której ten kod się wykonuje

colizja.speed = 0; // zatrzyma się ta druga kula

}

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety Panowie, nadal jest problem.

Jeśli dam:

 

if(place_meeting(x,y+48,obj_kula_niebieska*)){

y += 0;

}

 

else{

y += 5;

}

 

*lub inny kolor oprócz koloru kuli której kod dotyczy

 

to kod działa i jest ok.

 

Jeśli jednak dam:

 

if(place_meeting(x,y+48,obj_kula*)){

self.y += 0;

}

 

else{

self.y += 5;

}

 

*lub obj_kula_czerwona, czyli parenta lub taki kolor jak kula której dotyczy

 

to kula stoi i się nie rusza. :(

Odnośnik do komentarza
Udostępnij na innych stronach

Coś musisz mieć nie tak.

Wsadź ten kod do parenta i pokaż zawartość tego co Ci wyskoczy po naciśnięciu przycisku "Show information" pod parent i mask.

 

Proszę:

 

Information about object: obj_krysztal Sprite:

Solid: true

Visible: true

Depth: 0

Persistent: false

Parent:

Mask:

No Physics Object Step Event:

execute code: if(place_meeting(x,y+48,obj_krysztal)){ y += 0; } else{ y += 5; }

Odnośnik do komentarza
Udostępnij na innych stronach

A zapomniałem xD

 

Niestety, nadal brak ruchu. Problem nie polega na tym jak nadać ruch i jak określić kolizję, tylko, że obiekt sam siebie traktuje jako przeszkodę. Kiedy dałem mu, żeby ignorował obiekty o x i y równym sobie, wtedy wszystko gra. Tylko wiem, że to działanie na około. Gdzieś wyszukałem, że w takich sytuacjach należy zastosować "call parent event", ale jeszcze nie wiem jak to się je.

Odnośnik do komentarza
Udostępnij na innych stronach

proponuje bys zrobil sobie extra gm przyklad, wedlog tego co ci radzili wyzej.

 

jesli bedzie problem(a niewierze) to mozesz pokazacs ten pryklad a wtedy v zaraz bedzie jasne kdzie jest problem :)

Odnośnik do komentarza
Udostępnij na innych stronach

proponuje bys zrobil sobie extra gm przyklad, wedlog tego co ci radzili wyzej.

 

jesli bedzie problem(a niewierze) to mozesz pokazacs ten pryklad a wtedy v zaraz bedzie jasne kdzie jest problem :)

 

Witam,

 

dziwna rzecz, zrobiłem wszystko od początku w nowym pliku, ale tak jak poprzednio i działa :) Nie wiem co to mogło być. Dzięki wszystkim za pomoc. Jak będę miał chwilę czasu, to wrócę do mojego 2 pytania, ale to za jakąś chwilę.

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