Skocz do zawartości

RTS - movement


MXQ

Rekomendowane odpowiedzi

Gatunek nie narzuca sposobu poruszania.

 

Definiujesz w Create dwie zmienne:

GML
CelX=x;

CelY=y;

 

Global mouse press left:

GML
CelX=mouse_x;

CelY=mouse_y;

 

W step:

GML
dist=point_distance(x,y,CelX,CelY);

move_towards_point(CelX , CelY , min(dist,5));

 

Cała filozofia.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
To weź wytłumacz o co ci chodzi. Tylko wybrana jednostka ma się przemieścić czy cały oddział? Precyzujcie dokładnie ludzie czego oczekujecie. Nie każdy musi być zaznajomiony z RTSami.

Zaznaczone jednostki, ale żeby nie nachodziły na siebie.

Odnośnik do komentarza
Udostępnij na innych stronach

Sporo jest rozwiązań na ten temat. Możesz zrobić tak:

Chodzenie tak jak Platyna mówi, zaznaczanie i odznaczanie jednostki masz? Jeżeli tak to do każdej w kolizji z innymi jednostkami (np jakimś parentem)

daj:

GML
_range=5 // ustawiasz rozmiar obiektu, pokombinuj

_dir=point_direction(x,y,other.x,other.y)

_x=(x+other.x)/2

_y=(y+other.y)/2

x=_x-lengthdir_x(_range*2,_dir)

y=_y-lengthdir_y(_range*2,_dir)

other.x=_x+lengthdir_x(_range*2,_dir)

other.y=_y+lengthdir_y(_range*2,_dir)

 

Jednostka będzie odpychała inne które napotka, fajnie to wygląda i sie prezentuje:) W moim RTSie zdało egzamin.

Odnośnik do komentarza
Udostępnij na innych stronach

Miałem podobny problem, rozwiązałem go przez tworzenie formacji :) . Trochę to może być skomplikowane i wymaga obiektu kontrolnego i tablicy zaznaczonych obiektów, ale wszystko da sie zrobić. Ogólnie to wyglądało tak:

 

Obiekt kontrolny: Create

GML
// Tworzymy jakąś formację, np linię

// Każdy obiekt formacji (indeks) posiada inne współrzędne względem pierwszej pozycji

// Nie wpisujemy tutaj odległości, tylko jakby taki mnożnik, żeby działało i na duże i małe obiekty

// Zauważ, że formacja obsługuje maksymalnie 5 jednostek, musisz dopisać resztę (ewentualnie wymyślić funkcję)

formation_line_num = 5;

formation_line_x[0] = 0;

formation_line_y[0] = 0;

formation_line_x[1] = 0;

formation_line_y[1] = 1;

formation_line_x[2] = 0;

formation_line_y[2] = -1;

formation_line_x[3] = 0;

formation_line_y[3] = 2;

formation_line_x[4] = 0;

formation_line_y[4] = -2;

 

 

//Tworzymy tablicę zaznaczonych obiektów

// select_size_max będzie wyznaczało wielkość największej jednostki. Każda jednostka musi mieć

// stworzoną zmienną size, która będzie mówiła, jak wielki jest promień wokół jednostki

select[0] = -1;

select_num = 0;

select_size_max = 0;

 

// Tworzymy zmienne potrzebne do zaznaczania. Od teraz wszystkie operacje

// zaznaczania (najlepiej również odrysowanie pasku życia nad obiektem) będą

// należały do tego obiektu

xx = 0;

yy = 0;

zaznacz = false;

 

Obiekt kontrolny: Global Left Pressed

GML
// Zaczynamy zaznaczenie

xx = mouse_x;

yy = mouse_y;

zaznacz = true;

 

Obiekt kontrolny: Global Left Release

GML
// Obiekt kontrolny powinien być pierwszą instancją. Musi wyzerować tablice zaznaczeń zanim

// obiekty zaczną się do niej "wpisywać". Chyba, że chcesz dodanie do zaznaczenia. W sumie nic trudnego :D

if (!keyboard_check(vk_shift))

{

select_num = 0;

select_size_max = 0;

zaznacz = false; // EDIT: dopisałem tutaj zmianę znacznika, zapomniałem o tym

}

 

Wszystkie obiekty do zaznaczenia: Create

GML
// Musimy dodać parę zmiennych potrzebnych do chodzenia

des_x = 0;

des_y = 0;

action = "stój";

des_speed = 5;

// akcje lubię pisać w ciągu znaków. Więcej zajmuje, ale wiadomo, co obiekt robi :) .

// Można również skorzystać ze stałych

// Dodajemy również zmienną size

size = 50;

 

Wszystkie obiekty do zaznaczenia: Global Left Release

GML
// Samo zaznaczenie będzie wykonywane przez obiekt, który może być zaznaczony.

// Sprawdzanie, czy obiekt znajduje się w środku zaznaczenia

if (x >= min(obiekt_kontrolny.xx, mouse_x) && y >= min(obiekt_kontrolny.yy, mouse_y)

&& x <= max(obiekt_kontrolny.xx, mouse_x) && y <= max(obiekt_kontrolny.yy, mouse_y))

{

obiekt_kontrolny.select[obiekt_kontrolny.select_num] = id;

obiekt_kontrolny.select_num += 1;

obiekt_kontrolny.select_size_max = max(size, obiekt_kontrolny.select_size_max);

}

 

Obiekt kontrolny: Global Right Release

GML
// Wyznaczamy każdemu obiektowi z osobna inną współrzędną

for (i = 0; i < select_num || i < formation_line_num; i += 1)

{

select.des_x = mouse_x + formation_line_x*select_size_max; // EDIT

select.des_y = mouse_y + formation_line_y*select_size_max; // EDIT

select.action = "ruch";

}

 

/* Jeżeli interesuje cie obrót formacji tak, aby linia była prostopadła do kierunku przyjścia, spróbuj tego:

var select_direction;

if (select_num > 0) select_direction = point_direction(select[0].x, select[0].y, mouse_x, mouse_y);

for (i = 0; i < select_num || i < formation_line_num; i += 1)

{

select.des_x = mouse_x + (formation_line_x*cos(degtorad(select_direction))+formation_line_y*sin(degtorad(select_direction)))*select_size_max;

select.des_y = mouse_y + (formation_line_x*sin(degtorad(select_direction))+formation_line_y*cos(degtorad(select_direction)))*select_size_max;

select.action = "ruch";

}*/

 

Wszystkie obiekty do zaznaczenia: Step

GML
// Wykonujemy ruch

if (action == "ruch")

{

move_towards_point(des_x, des_y, des_speed);

if (point_distance(x, y, des_x, des_y) < 5) // EDIT: Zapomniałem wyzerować prędkości po skończonym ruchu

{

action = "stój";

speed = 0;

}

}

 

Troche tego jest, ale zapewniam cię, że będzie działać. Poza tym można ten kod udoskonalać na wiele sposobów, tworzyć nowe formacje (zapisać je w dwuwymiarowej tablicy, żeby można było wybrać), stworzyć obrót formacji... myślę, że będzie działac ;)

 

 

 

EDIT: jeżeli chciałbyś zrobić funkcję, która by wyznaczała miejsca, możesz to zrobić dodając nowe funkcje: formation_line_x i formation_line_y (lub formation_x i formation_y, jeżeli będzie więcej formacji):

 

formation_line_x(index)

GML
// Funkcja musi być, choćby nawet zwracała 0, wiadomo, co z czego się bierze

return 0;

 

formation_line_y(index)

GML
if (argument0 mod 2 == 0)

return -ceil(argument0/2);

else return ceil(argument0/2);

 

Usuwasz wtedy wszystkie formation_line z Create obiektu kontrolnego, a w Right Release zamieniasz [ ] na ( ) (i usuwasz warunek przerwania pętli). I tyle ;)

 

 

 

EDIT2: Dodałem w kodzie dopiski EDIT, w tych miejscach pozmieniałem błędy, które mogły powodować błąd działania (w końcu pisałem z głowy)

Odnośnik do komentarza
Udostępnij na innych stronach

___________________________________________

ERROR in

action number 1

of Step Event

for object o_hero:

 

Error in code at line 2:

if (action == "ruch")

 

at position 6: Unknown variable action

 

 

___________________________________________

E: Jakbyś mógł to wyślij mi gotowy przykład na GM7

Odnośnik do komentarza
Udostępnij na innych stronach

Nie ma zmiennej action.

Dodaj w create

GML
action = "ruch"

Albo daj to jak mają się ruszać, tak trudno samemu wpaść ;O

 

Z resztą masz tam w poście wyżej:

Wszystkie obiekty do zaznaczenia: Create

GML

// Musimy dodać parę zmiennych potrzebnych do chodzenia

des_x = 0;

des_y = 0;

action = "stój";

des_speed = 5;

// akcje lubię pisać w ciągu znaków. Więcej zajmuje, ale wiadomo, co obiekt robi :) .

// Można również skorzystać ze stałych

 

// Dodajemy również zmienną size

size = 50;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
to był mój problem

rozwiązał go Alwin tylko że potrzebuję teraz, żeby ludziki nie tańczyły wokół tego co dojdzie do celu pierwszy

Podobny do pakła jesteś

Odnośnik do komentarza
Udostępnij na innych stronach

Ten kod rozwiązuje to inaczej. Nie powoduje wyznaczenia jednego punktu każdemu obiektowi i teraz "pchajcie cie wszyscy" (chociaż ten spósób też jest niezły :) ). Z pewnością grałeś w Kozaki, czy którąś z serii Earth... albo jakąkolwiek strategię ;) . W większości gier strategicznych jest możliwość ustawienia jednostek w formacji. Ten kod na to ci pozwala. Pisałem go z głowy, dlatego jest tam parę błędów, ale całość działa.

 

TUTAJ MASZ LINK DO PRZYKŁADU

 

EDIT: Niestety nie mam siódemki, dałem więc w kodzie z osiem. Lepsze to niż nic. Spróbuj jeszcze otworzyć kopię zapasową:

 

TUTAJ

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