Skocz do zawartości

Ruch postaci via GTA


Quetzacotl

Rekomendowane odpowiedzi

Stworzyłem ruch postaci na wzór tego z pierwszych 3 części GTA, mianowicie lewo/prawo - obrót, góra/dół - chodzenie, widok z góry.

Zrobiłem to na klockach, link tutaj > http://members.lycos.co.uk/xagon/gta-ruch.gm6

 

Mam jednak taki problem, iż kiedy idę do przodu lub do tyłu, i skręcam w lewo to postać idzie dalej i równocześnie skręca, jednak gdy chcę skręcać w prawo to postać staje i tylko się obraca nie idzie do przodu.

Byłbym wdzięczny gdybyście rzucili okiem na plik i wytłumaczyli mi gdzie jest błąd.

Dzieki z góry, pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Zmiana klawiszy nie będzie potrzebna. Zamiast eventów odpowiadającym naciśnięciu klawiszy: góra, dół, lewo, prawo (te skasuj) zrób event keyboard-> <any key> i daj tam:

if keyboard_check(vk_left) {direction+=5 speed=0.00000000000001 image_angle=direction}

if keyboard_check(vk_right) {direction-=5 speed=0.00000000000001 image_angle=direction}

if keyboard_check(vk_up) {speed=3}

if keyboard_check(vk_down) {speed=-3}

Powinno działać :P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Działa, a tutaj poprawiona przeze mnie wersja. Daj to w step, by nie bawić się z dodatkowymi eventami:

if keyboard_check(vk_left)
{
   direction+=5
   speed=0.00000000000001
   image_angle=direction
}
else if keyboard_check(vk_right)
{
   direction-=5
   speed=0.00000000000001
   image_angle=direction
}

if keyboard_check(vk_up)
   speed=3
else if keyboard_check(vk_down)
   speed=-3
else speed=0

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... no dobrze, podaliście mi jak zrobić żeby działało i działa, ale nie powiedzieliście mi w czym tkwił błąd w moich klockach, a chcę wiedzieć na przyszłość.

 

I druga sprawa, korzystając z okazji, często wyskakuje mi pewien błąd, którego nie potrafie naprawić w żaden sposób, chociaż sprawdzam czy zmienna isnieje, jest poprawnie podana itp. nie mam pojecia o co chodzi, niby oczekuje na podanie zmiennej :|

Tutaj screen > http://members.lycos.co.uk/xagon/blad.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Ewentualnie mozesz zrobic tak:

https://gmclan.iglu.cz/upload/temp/gta-ruch.gm6

 

W twoim przykładzie wiesz co było źle? Spójrz na kolejność event'ów, UP jest sprawdzany przed RIGHT, a w RIGHT masz ustawione praktycznie zerowanie szybkości, a szybkosc oddzialowuje na obiekt dopiero po sprawdzeniu wszystkich eventów i "tyknięcia" jednego fpsa. Po prostu niepotrzebnie użyłeś tych niebieskawych klocków do zmiany direction i speed w LEFT i RIGHT, skoro powinieneś zmieniać tylko direction.

Odnośnik do komentarza
Udostępnij na innych stronach

if keyboard_check(vk_left)
{
  direction+=5
  speed=0.00000000000001
  image_angle=direction
}
else if keyboard_check(vk_right)
{
  direction-=5
  speed=0.00000000000001
  image_angle=direction
}

if keyboard_check(vk_up)
  speed=3
else if keyboard_check(vk_down)
  speed=-3
else speed=0

TEN KOD JEST DOBRY ALE JAK ZROBIC WTEDY ZATRZYMYWANIE SIĘ NA INNYM OBJEKCIE?? SPEED=0 I BOUNCE AGAINST OBJECT NIE WYSTARCZA :(

Odnośnik do komentarza
Udostępnij na innych stronach

aaa... no to to było poruszane w jakimś temacie już, musisz wstawić maske, najlepiej sprite kwadratowy, przezroczysty z wielkością i szerokością danego sprite'a

 

EDIT: a teraz ja mam znów problem, nie związany z tym ruchem ale nie chce zakładać nowego topicu, mianowicie chcę zrobić coś takiego:

jest drzewo, podchodze do niego i uderzam w niego siekierą, następuje kolizja i wtedy przy drzewie powinien pokazać się jego pasek HP, który po jakichś 3 s znika, jeżeli znów w drzewo nie uderzysz, ilość HP ten pasek powinien pobierać z drzewa w które uderzyłem ofkoz, jednak nie wiem co zrobić żeby pobierał akurat z tego drzewa, jeśli na mapie jest wiecej takich samych drzew, żeby ich nie mylił.

Po za tym ten pasek HP drzewa, to chcę żeby był sprite, tzn własny obraz paska chcę zrobić a nie jakieś brzydkie rec :P I teraz przypuśćmy, że drzewo ma 20 HP,

i uderze w nie siekierą, to chcę aby paek który się pokaże przy drzewieskrócił się o jedną dwudziestą część swojej całości, czyli przekłądając na kod, powinno to zachodzić mniej więcej tak, że gdy pasek ma długość dajmy na to 200 to po uderzeniu długość skraca się o 10 i wynosi 190, ale nie powinien się ten pasek zmniejszać tylko obcinać, tak jakbym zmniejszał canvas size sprite'a, do tego chciałbym ten pasek zastosować też przy innych elementach, gdy będzie inna ilość HP dlatego długość paska powinna być zawsze najpeirw dzielona przez ilość HP danego obiektu i potem o tą ilość powinien być skracany pasek, czyli gdyby drzewo miało 10 Hp a dł. 200 to 200/10 daje 20 czyli kazde uderzenie skraca pasek tym razem o 20 : )

 

Wiem, że to b. skomplikowane, większość z tego potrafię zrobić sam jednak są elementy których nie potrafie wykonać dlatego opisałem wszystko. A te elementy są przeważnie najważniejszymi w całym skrypcie.

 

Naprawdę bardzo dziękuję za pomoc - z góry...

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

żeby obiekt zatrzymywał sie na drugim to ja umiem, ale chodzi mi oto zeby zlikwidować taką sytuyacje: mój objekt zatrzyma sie na jakims drzewie i obroci sie np. w prawo to bedzie on nachodził na to drzewo.  :(

Jak chcesz wiedzieć, to możesz tak spróbować :D :

if not place_empty(x.drzewo,y.drzewo) {
action_move("000010000",0);
}

Odnośnik do komentarza
Udostępnij na innych stronach

if not place_empty(x.drzewo,y.drzewo) {
action_move("000010000",0);
}

Pisze że vairable name expected

Nie ma zadnych zmiennych o nazwie drzewo, ani innych objektow, a object drzewo jest w ten sam sposob napisany(przez rz) co w codzie

Co jest tego przyczyną?? ten gm6.0 jest jakis dziwny:(

Odnośnik do komentarza
Udostępnij na innych stronach

Powtarzam prosbe:

a teraz ja mam znów problem, nie związany z tym ruchem ale nie chce zakładać nowego topicu, mianowicie chcę zrobić coś takiego:

jest drzewo, podchodze do niego i uderzam w niego siekierą, następuje kolizja i wtedy przy drzewie powinien pokazać się jego pasek HP, który po jakichś 3 s znika, jeżeli znów w drzewo nie uderzysz, ilość HP ten pasek powinien pobierać z drzewa w które uderzyłem ofkoz, jednak nie wiem co zrobić żeby pobierał akurat z tego drzewa, jeśli na mapie jest wiecej takich samych drzew, żeby ich nie mylił.

Po za tym ten pasek HP drzewa, to chcę żeby był sprite, tzn własny obraz paska chcę zrobić a nie jakieś brzydkie rec I teraz przypuśćmy, że drzewo ma 20 HP,

i uderze w nie siekierą, to chcę aby paek który się pokaże przy drzewieskrócił się o jedną dwudziestą część swojej całości, czyli przekłądając na kod, powinno to zachodzić mniej więcej tak, że gdy pasek ma długość dajmy na to 200 to po uderzeniu długość skraca się o 10 i wynosi 190, ale nie powinien się ten pasek zmniejszać tylko obcinać, tak jakbym zmniejszał canvas size sprite'a, do tego chciałbym ten pasek zastosować też przy innych elementach, gdy będzie inna ilość HP dlatego długość paska powinna być zawsze najpeirw dzielona przez ilość HP danego obiektu i potem o tą ilość powinien być skracany pasek, czyli gdyby drzewo miało 10 Hp a dł. 200 to 200/10 daje 20 czyli kazde uderzenie skraca pasek tym razem o 20 : )

 

Wiem, że to b. skomplikowane, większość z tego potrafię zrobić sam jednak są elementy których nie potrafie wykonać dlatego opisałem wszystko. A te elementy są przeważnie najważniejszymi w całym skrypcie.

 

Naprawdę bardzo dziękuję za pomoc - z góry...

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję wylewnie :) juz sprawdzam

 

EDIT: sprawdziłem, nie do końca rozumiem naczym polega to sprawdzanie id czy coś takiego, po za tym zrobiłeś tak, że długość pasak energii jest zależna od ilości HP, mi chodziło o to aby pasek był zawsze tak samo długi tylko zmniejszał się w innych proporcjach, ale to sam juz sobie zrobię, tyle chyba umiem :)

A reszta jest wszystko cacy

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Długość paska nie jest zależna od HP tylko od szerokości sprite'a obiektu nadrzędnego. Wystarczy w obj_energia w event draw:

en_w = ( nadobiekt.energia / nadobiekt.energia_maks ) * nadobiekt.sprite_width - 1;

zamienić na:

en_w = ( nadobiekt.energia / nadobiekt.energia_maks ) * tutaj_liczba_w_postaci_szerokosci - 1;

Chodziło o uzyskanie efektu tak jak w niektórych rts'ach, że szerokość paska jest zależna od szerokości obiektu. :)

 

A co do id to jest tak:

 

Aby odwołać się do jakiegoś obiektu, wystarczy podać jego nazwe, np:

gracz.x

 

Jeśli chcemy odwołać się do obiektu z którym kolidujemy, to tylko w event colision mozna uzyc:

other.x

other.speed

 

Jesli chcemy odwolac sie do samego siebie to uzywamy:

x lub self.x

 

Jesli chcemy odwolac sie do wszystkich obiektow:

with ( all ) instance_destroy();

 

To są słowa specjalne, po których identyfikujemy dane obiekty. Niestety, jesli uzywamy paru obiektow tego samego typu, to odwolanie sie za pomoca nazwy w przypadku checi pobrania jakiejs zmiennej spowoduje uzyskanie zmiennej od najmlodszego obiektu danego typu.

 

Kazdy obiekt natomiast w momencie tworzenia dostaje wlasny id. Jest to unikatowy numer (widac go np. przy wstawianiu obiektow w edytorze plansz). Ten unikatowy numer sluzy jako alternatywna nazwa. Zamiast pisac:

gracz.x

mozemy zapisac np:

1000049.x

Albo trzymac numer id danego obiektu w postaci zmiennej i uzywac:

zmienna.x

 

instance_create(...) wlasnie zwraca numer id tworzonego obiektu. W przykladzie dziala to na takiej zasadzie, ze podczas wywolania skryptu tworzy sie nowa zmienna: obiekt_energia. Jesli klikniemy na drzewo, to skrypt sprawdza czy ta zmienna nie rowna sie 0 (czy jest tam id jakiegos obiektu) jesli tak, to uaktualnia tylko temu obiektowi licznik, jesli nie, to tworzy nowy obiekt i zwraca do tej zmiennej jego id. Nastepnie drzewko tworzy temu obiektowi nowa zmienna z wlasnym id. Dzieki temu te obiekty maja zapisane swoje id. Energia id drzewka, drzewko id energii. Teraz mozna wprowadzic relacje, czyli np. w przypadku energii mozna sobie pobierac pozycje i inne zmienne konkretnego drzewka. Przy smierci paska energii, odwoluje sie on do "swojego" drzewka zerujac mu obiekt_energia. Dzieki temu drzewko znowu wie, ze nie ma przypisanego zadnego paska.

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