szmalu Opublikowano 20 Grudnia 2012 Udostępnij Opublikowano 20 Grudnia 2012 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 Więcej opcji udostępniania...
Threef Opublikowano 20 Grudnia 2012 Udostępnij Opublikowano 20 Grudnia 2012 Już widzę że podajesz jako argumenty funkcji numer przycisku, a to błąd. Powinieneś najpierw sprawdzić który palec jest w odpowiedniej części ekranu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
szmalu Opublikowano 20 Grudnia 2012 Autor Udostępnij Opublikowano 20 Grudnia 2012 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 Więcej opcji udostępniania...
Threef Opublikowano 20 Grudnia 2012 Udostępnij Opublikowano 20 Grudnia 2012 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 Więcej opcji udostępniania...
szmalu Opublikowano 20 Grudnia 2012 Autor Udostępnij Opublikowano 20 Grudnia 2012 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 21 Grudnia 2012 Administratorzy Udostępnij Opublikowano 21 Grudnia 2012 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 Więcej opcji udostępniania...
szmalu Opublikowano 21 Grudnia 2012 Autor Udostępnij Opublikowano 21 Grudnia 2012 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 Więcej opcji udostępniania...
Threef Opublikowano 21 Grudnia 2012 Udostępnij Opublikowano 21 Grudnia 2012 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 Więcej opcji udostępniania...
szmalu Opublikowano 21 Grudnia 2012 Autor Udostępnij Opublikowano 21 Grudnia 2012 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 Więcej opcji udostępniania...
Threef Opublikowano 21 Grudnia 2012 Udostępnij Opublikowano 21 Grudnia 2012 Nie x, y i rozmiar to stałe, odpowiadające pozycji padów na ekranie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
szmalu Opublikowano 21 Grudnia 2012 Autor Udostępnij Opublikowano 21 Grudnia 2012 No dobra, to chyba będę musiał ustawić je na stałe, będzie łatwiej, chociaż plan był inny. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 21 Grudnia 2012 Udostępnij Opublikowano 21 Grudnia 2012 To jak ty to chciałeś zrobić? Pozwolić na klikanie w dowolnym miejscu ekranu? Przecież to nie ma sensu! Tak się nie buduje UI! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
szmalu Opublikowano 22 Grudnia 2012 Autor Udostępnij Opublikowano 22 Grudnia 2012 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 Więcej opcji udostępniania...
Threef Opublikowano 22 Grudnia 2012 Udostępnij Opublikowano 22 Grudnia 2012 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 Więcej opcji udostępniania...
szmalu Opublikowano 22 Grudnia 2012 Autor Udostępnij Opublikowano 22 Grudnia 2012 Chyba masz rację, nie zastanowiłem się głębiej nad tym. W takim razie skorzystam z twojego kodu, dzięki. PS Dobrze, że przynajmniej wreszcie się zrozumieliśmy :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę