Skocz do zawartości

Jak nadać obiektowi stworzonemu przez inny, pozycję x i y obiektu, który go stworzył


Rekomendowane odpowiedzi

Witam. Jestem nowy w GameMaker: Studio i szukałem już chyba wszędzie (głównie po angielsku) odpowiedzi na moje pytanie.

 

W projekcie wykorzystuję dwa obiekty:

- Statek

- Działko

 

Gdy gra zostaje odpalona, tworzy się Statek, a ten od razu na swojej pozycji musi stworzyć Działko. Gdy statek się przemieszcza, działko powinno się przemieszczać razem z tym Statkiem, jednak chciałbym to zrobić tak, żeby to pozycja x i y "twórcy" tego Działka była również pozycją Działka, nie chcę, żeby Działko miało pozycję Statku, gdyż planuję stworzyć w którymś poziomie kilka takich Statków, w którym każde ma swoje Działko.

 

Proszę o pomoc, bo już załamany jestem, a bardzo chcę rozpocząć ten projekt. Wydawało się to takie proste... że wystarczy wpisać w Działko>Draw>Skrypt: x = parent.x; y = parent.y;

Pozdrawiam MetalowyNerd.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak tworzysz działo to można mu przypisać id statku tak by wiedziało kto go stworzył.

GML (Statek)
var ins;

ins = instance_create(x, y, dzialo);

ins.statekID = id;

Teraz nowo stworzone działo zna id swojego stwórcy, więc można je przesuwać gdy stwórca się przesuwa:

GML (Dzialo step)
x = statekID.x;

y = statekID.y;

 

Ale w przyszłości żeby uniknąć błędu o nie znalezionej instancji gdy statek zginie to warto sprawdzać jeszcze czy ten statek istnieje zanim się przesunie działko

GML (Dzialo step)
if ( instance_exsists(statekID) )

{

x = statekID.x;

y = statekID.y;

}

else instance_destroy(); // jak statek nie istnieje to zniszcz tez dzialo

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

A mam jeszcze jedno pytanie. Mianowicie kiedy tworzę Statek i chcę, żeby Działo było na jego jednym skrzydle i obracało się razem ze Statkiem jednak pozostając na skrzydle, to jakich komend muszę użyć? Próbuję z statekID.direction/image_angle, ale nawet na logikę to nie ma prawa działać <_< .

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jestem pewien czy wiem co chcesz osiągnąć. Ale tak tłumacząc trochę prościej. Mamy statek i dzielimy go na 3 pola jakby. Lewo, środek, prawo. I działo ma być zawsze przyczepione do prawej strony, nawet jeśli obracamy statkiem. Tutaj potrzebne będą lengthdiry.

Jeśli przyjmiemy, że jedno pole jest równe kratce 64x64, to wydaje mi się, że powinno to wyglądać tak.

GML
var xx=statek.x+lentghdir_x(64, image_angle);

var yy=statek.y+lengthdir_y(64, image_angle);

 

dzialo.x=xx;

dzialo.y=yy;

Działa?

Odnośnik do komentarza
Udostępnij na innych stronach

Sutikku, niestety nie działa. Chyba, że to ja coś źle zrobiłem.

 

Statek(o_turret2/step):

GML
//x = statekID.x;

//y = statekID.y;

var xx=statekID.x+lengthdir_x(64, image_angle);

var yy=statekID.y+lengthdir_y(64, image_angle);

 

if ( instance_exists(statekID) )

{

//x = statekID.x;

//y = statekID.y;

x=xx;

y=yy;

}

else instance_destroy();

 

image_angle = direction;

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

 

W sumie sprite tego statku ma rozmiary 32x32. Nie wiem, czy to coś wniesie do tematu :/.

Chodzi mi o coś w tym stylu:

 

ocokaman.png

 

[czerwony = działko, niebieski = środek sprite'a Statku]

Odnośnik do komentarza
Udostępnij na innych stronach

Zakładając, tak jak pisałeś, że masz rozmiar sprita ustawiony na 32x32 i jest wycentrowany:

 

GML
x = statekID.x+7;

y = statekID.y+7;

 

Gdzie siódemki to po prostu jak daleko od 'centrum' sprite'a ma się utrzymywać obrazek działa. Spróbuj i daj znać.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak już próbowałem, ale nie chodzi mi o to, żeby działko podążało za statkiem, jak dron, tylko żeby było częścią statku i obracało się razem ze skrzydłem statku, gdy ten się obraca. Chodzi mi po prostu o to, żeby działko miało wspólne "centrum" rotacji ze statkiem. Żeby było jakby "przyklejone" do skrzydła statku.

Odnośnik do komentarza
Udostępnij na innych stronach

Wstaw sprite statku, bo tam trzeba zmierzyć pixele żeby dobrze punkty zaczepu zrobić. Można to zmierzyć w niektórych programach graficznych np paint.net

albo samemu wyliczyć matematycznie w ten sposób: https://forum.gmclan.org/index.php?showtopi...=lenghtdir+info

 

Do lengthdira trzeba znać długość lini i kąt od środka sprita statku do punktu zaczepu.

 

 

Pokażę na screenie jak się mierzy w paint.net, na dole na pasku stanu są te wartości podane gdy weźmiemy narzędzie linia i tą linię narysujemy ze środka sprita do punktu zaczepu. Zalecam jednak sprit obrócić tak by dziób był w prawą stronę bo tam GM ma kąt zero. Jak sprit jest odwrócony w górę to trzeba odejmować -90

niRCkog.png

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję wszystkim za konkretną pomoc :) .I am Lord, teraz czaję, jak to działa dzięki. Nie działało mi, ale to dlatego, że Sutikku mi troszkę błędny kod podał, bo zamiast "var xx" użyłem po prostu "x" xd i tak samo z "var y". Mimo to bardzo Wam dziękuję za pomoc i wrzucam kod działka, które poprawnie trzyma się punktu, który wyznaczyłem:

 

GML
if ( instance_exists(statekID) )

{

x=statekID.x+lengthdir_x(30, statekID.image_angle+30);

y=statekID.y+lengthdir_y(30, statekID.image_angle+30);

}

else instance_destroy();

 

image_angle = direction;

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

 

Pozdrawiam serdecznie i jeszcze raz dziękuję :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

Zamień jeszcze kolejnością to:

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

image_angle = direction;

Bo nie ma sensu że dopiero później wyliczasz kierunek.

 

A w ogóle to jeżeli działko w żaden inny sposób się nie porusza i jeżeli nie ma z niczym kolizji (czyli praktycznie tylko je rysujesz) to nie zmieniaj direction i od razu rób:

GML
image_angle = point_direction(x,y,mouse_x,mouse_y);
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ę...