Skocz do zawartości

Dwa ekranowe pady


szmalu

Rekomendowane odpowiedzi

Oczywiście chodzi mi znowu o GM:S i Androida. Chciałem zrobić tak, żeby gracza kontrolowało się za pomocą dwóch wirtualnych, ekranowych padów, no wiecie o co chodzi. ;) Pierwszy do obrotu postacią, drugi do sterowania ruchem. Na razie naskrobałem coś takiego:

 

GML
if device_mouse_check_button_pressed(0, mb_left)

joy=instance_create(device_mouse_x(0),device_mouse_y(0),pad)

 

if device_mouse_check_button_released(0, mb_left)

{

with (joy)

instance_destroy()

}

 

if instance_number(pad)>0

direction=point_direction(joy.x,joy.y,device_mouse_x(0),device_mouse_y(0))

image_angle=direction

 

/////////////////////////////////////////////////////////////////////

if device_mouse_check_button_pressed(1, mb_left)

joy2=instance_create(device_mouse_x(1),device_mouse_y(1),pad)

 

if device_mouse_check_button_released(1, mb_left)

{

with (joy2)

instance_destroy()

}

if instance_number(pad)=2

motion_set(point_direction(joy2.x,joy2.y,device_mouse_x(1),device_mouse_y(1)),2)

 

gdzie pad to animowany obiekt tej gałki.

 

Kod brzydki, bo pisany na szybko, ale nie mniej jednak chyba powinien działać, a ja za nic nie mogę znaleźć tu błędu. Pomóżcie!

 

Jak odpalam grę to wszystko działa na początku. Kręcę pierwszym padem, wszystko działa. Ruszam drugim, działa, po chwili error

FATAL ERROR in action number 1 of Step Event0 for object gracz:
VMError!! Occurred - Push :: Execution Error - Variable Get y at gml_Objectgracz_Step_0

Odnośnik do komentarza
Udostępnij na innych stronach

Przepraszam, ale nie do końca wiem co masz na myśli. A więc nie da się zrobić tak, że zawsze pierwszy palec na ekranie odpowiada za jedną rzecz, a drugi (obojętnie gdzie położony) za inną?

 

EDIT: Zabrakło najważniejszego pytania - w takim razie co dokładnie zrobić, żeby to jakoś działało? W dokumentacji jest mało o tych funkcjach napisane.

Odnośnik do komentarza
Udostępnij na innych stronach

Na właśnie tak jest. Pierwszy palec ma wartość 0, drugi 1, n-ty ma n-1. Nie możesz założyć że gracz najpierw położy palec na pierwszym padzie, a potem na drugim. Najlepiej sprawdzać wszystkie palce.

 

A co do twojego błędu to jest on w tym miejscu (chyba):

GML
direction=point_direction(joy.x,joy.y,device_mouse_x(0),device_mouse_y(0))

Chwilę wcześniej jest warunek po którego spełnieniu usuwany jest instance joy. Powinno wystarczyć

GML
if(instance_exist(joy)){direction=point_direction(joy.x,joy.y,device_mouse_x(0),device_mouse_y(0))}
Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze - wydaje mi się, że instance_exist ani instance_number nie mogą mieć jako argumentu konkretnego id instancji. Po drugie - wedle kodu, nie przewiduję który palec położy na jakim padzie. Tworzą się one same przy naciśnięciu i usuwają przy puszczeniu, więc chyba powinno być dobrze. (chyba, że dalej nie zrozumiałem)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

jakby instance_ nie mogło mieć ID instancji, to by się tak funkcja nie nazywała ;) Nie mniej device_mouse_x(0) to będzie palec który jako pierwszy dotknął ekranu, aż do momentu puszczenia. Mi się wydaje, że wystarczy place_meeting(mouse_x,mouse_y,self) (albo position_meeting, bo mi sie zawsze te funkcje mylą...).

Odnośnik do komentarza
Udostępnij na innych stronach

Tak czy siak, już z dobrym instance_exists, kod nie działa, mógłby ktoś to wyjaśnić? Powtarzam zasadę działania - na początku na ekranie jest tylko gracz (reszty jeszcze nie ma). Naciskam pierwszym palcem, w tym miejscu tworzy się pierwszy obiekt "pad" i kierunek od niego do palca odpowiada za kierunek obrotu gracza. Następnie, trzymając jeszcze pierwszy palec, kładę gdzieś indziej drugi i kierunek od niego do drugiego palca to kierunek w funkcji motion_set. Przy puszczeniu jakiegokolwiek palca, odpowiedni obiekt "pad" powinien się usunąć. Błąd wywala mi już w miejscu, gdy zaczynam obracać drugim palcem. Przez chwilę się dobrze porusza, a za chwilę error, którego treść wkleiłem w pierwszym poście.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie działaj na obiektach! Zrób jeden który będzie to kontrolował.

GML
for(var i=0;i<8;i++)//Te 8 to maksymalna ilość klawiszy. Nie pamiętam ile to. :P BTW Postinkrementacja!

{

//Pad 1

if(device_mouse_check_button(i, mb_left) and point_distance(x_pada1,y_pada1,device_mouse_x(i),device_mouse_y(i)<rozmiar_pada1)

{

direction=point_direction(x_pada1,y_pada1,device_mouse_x(i),device_mouse_y(i))

image_angle=direction

}

 

//Pad 2

if(device_mouse_check_button(i, mb_left) and point_distance(x_pada2,y_pada2,device_mouse_x(i),device_mouse_y(i)<rozmiar_pada2)

{

motion_set(point_direction(x_pada2,y_pada2,device_mouse_x(i),device_mouse_y(i)),2)

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Rozumiem, że wartości x_pada i y_pada mam zapisać w momencie dotknięcia? Btw, w tamtym kodzie faktycznie wystarczyło użyć instance_exists i id instancji zamiast instance_number, tylko że trzeba było wcześniej zadeklarować jakieś wartości joy i joy2... Głupi ja.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak to nie? Spotkałem się z tym wielokrotnie w grach na ekrany dotykowe. Może nie w całkiem dowolnym miejscu, ale w pewnym rejonie ekranu (np. jakiś tam obszar w lewym dolnym rogu), obojętnie gdzie się dotknie, tam tworzy się przycisk do sterowania. Nie jest w stałym miejscu.

Odnośnik do komentarza
Udostępnij na innych stronach

To jaki ty gry planujesz, bo żaden topdown nie powinien mieć takiego sterowania. Jest nie intuicyjne, a gracz używa ekranu dotykowego jak gamepada i spodziewa się że wykonanie takiego samego ruchu palcem jak ostatnio poskutkuje wykonaniem takiej samej akcji jak ostatnio.

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