Skocz do zawartości

Android czujnik ruchu


Bobkowy

Rekomendowane odpowiedzi

Mam za zadanie zrobić prostą grę na androida z wykorzystaniem czujnika ruchu.

Sterowanie zrobiłem łopatologiczne, niestety obiekt porusza się prawidłowo tylko w osi x natomiast jeśli chce poruszać się w osi y os x musi być wyzerowana czyli idealnie poziomo co jest prawie niemożliwe. Wygląda to tak:

74947114.jpg

Prosiłbym o nakierowanie co jest źle lub wskazówkę jak można to zrobić porządnie.

Szukałem już na różnych stronach o wykorzystaniu funkcji YoYo_GetTiltX() lecz jedyne co udało mi się odnaleźć to zmiana orientacji obrazu z poziomego na pionowy i odwrotnie .

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Wygląda jak HTML5, ale tam nie było chyba Androida.... a funkcje YoYo_* były wywalone praktycznie na równi z premierą prawie rok temu... obecnie nie działają. Używasz jakiegoś pirata czy coś?

Odnośnik do komentarza
Udostępnij na innych stronach

Wersja to Game Maker Studio 1.1 MiPS ściągnięta przedwczoraj ze stronki producenta więc żaden pirat :)

Po wejściu w zakładkę scripts -> show build in functions wyświetliło mi ponad 20 funkcji YoYo_*

Oczywiście mam darmową wersję bo nie opłaca mi się kupować pro żeby zrobić jedna gierkę na zaliczenie która i tak nie pójdzie na sprzedaż.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Dlaczego akurat MIPS?

 

Nie mniej, prawidłowe funkcje to:

 

http://gnysek.github.com/gmstudiodocs/5pic...get_tilt_x.html

 

device_get_tilt_x()

device_get_tilt_y()

device_get_tilt_z()

 

Sprawdź je w dokumentacji załączonej do programu.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Musisz przyjąć, że pozycja w jakiej tablet się znajduje w momencie odpalenia gry to pozycja wyjściowa i teraz względem niej sprawdzać odchył. Do tego jakiś margines wg. którego się nie rusza. Nalezy też pamiętać, że:

 

w pozycji poziomej:

lewo-prawo: Y, góra-dół: Z

w pozycji pionowej:

lewo-prawo: X, góra-dół: Z

 

(co zresztą wynika z obrazków w dokumentacji)

Odnośnik do komentarza
Udostępnij na innych stronach

Widzę że nie rozumiesz o co mi chodzi. Jeśli dam tylko odczytywanie pozycji z osi x to w osi x porusza się idealnie, jeśli w osi y to znowu porusza się idealnie ale jeśli dam zczytywanie pozycji w obu osiach jednocześnie to tylko jedna oś działa dobrze a druga już nie. Obiekt zaczyna drżeć i muszę telefon trzymać idealnie pomiędzy górą a dołem żeby w danej osi funkcja zwracała 0 oraz przechylony w któryś bok żeby obiekt poruszał się w daną stronę.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

No cóż, nakazujesz iść postaci na raz w dwa różne kierunki... są dwie opcje:

 

a) wyliczasz średnią pomiędzy kierunkami i idziesz na skos

b ) zwiększasz margines przechylenia tabletu (martwą strefę) w kodzie i pozwalasz iść tylko w jedną stronę, stosując odpowiednio if/else zależnie czy bardziej jesteś wychylony w poziomie czy w pionie

Odnośnik do komentarza
Udostępnij na innych stronach

Opcja a odpada ponieważ gra to labirynt więc raczej opcja b ;)

Tylko że nie mam bardzo pomysłu jak to wykonać :unsure:

Wiem że muszę użyć 2 zmiennych które będą incrementowane o wartość device_get_tilt_*() czyli -1,0,1 w podanym przeze mnie zakresie.

Tylko gdzie muszę umieścić taki skrypt ?

Wiem że są 3 możliwe miejsca 1 to ogólny skrypt programu w menu po lewej, 2 to skrypt pokoju ale to odpada bo nie będę do każdego pokoju wklejał tych samych skryptów oraz 3 to skrypt który można umieścić nad blokami w obiekcie. Którą opcję lepiej wybrać 1 czy 3?

Następne pytanie to zmienne: mogę użyć jakichś wbudowanych czy sam muszę jakieś zadeklarować?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

GML
//create

/// zakładam poziome ułożenie

nachylenie = device_get_tilt_z();

martwaStrefa = 0.3;

 

GML
//step

if (abs(device_get_tilt_y()) > martwaStrefa) {

// poziomo

speed = 2;

direction = -180 * sign(device_get_tilt_y());

} else if (abs(device_get_tilt_z() - nachylenie) > martwaStrefa) {

// pionowo

speed = 2;

direction = 90 * sign(device_get_tilt_z());

}

 

jakoś tak chyba, może przy kierunku trzeba zmienić znaki na -, sprawdź

Odnośnik do komentarza
Udostępnij na innych stronach

Po małych modyfikacjach wszystko chodzi idealnie :)

Dzięki wielkie za pomoc.

Wklejam kod dla potomnych

if (abs(device_get_tilt_y()) > martwaStrefa) {
// poziomo
speed = 2;
direction =90 - (90 * sign(device_get_tilt_y()));
} 

else if (abs(device_get_tilt_x()) > martwaStrefa) {
// pionowo
speed = 2;
direction = -90 * sign(device_get_tilt_x());
}

 

Mam jeszcze jeden problem otóż jak dam kompiluj to aplikacja wyświetla się normalnie na moim telefonie natomiast jak dam create application to wyświetla mi 2 ostrzeżenia

 [javac] Note: Some input files use or override a deprecated API.
   [javac] Note: Recompile with -Xlint:deprecation for details.

Kompilacja tra około 2 minut daje wynik success zaczyna ładować na telefon i od razu dostaję komunikat aplikacja została zatrzymana

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