Przewidywanie nowego kafelka w zadanym kierunku

0

Cześć, mam prawdopodobnie banalny problem, ale może Wam uda się szybciej wpaść na rozwiązanie.

Mam mapę kafelkową np. 16x16px oraz obiekt, który porusza się z prędkością vx i vy po kafelkach i znajduje się na pozycji x i y. Moja zagwozdka: jak obliczyć, w którym następnym kafelku wyląduje mój obiekt - biorąc pod uwagę jego środek.
Wszystko byłoby proste, gdyby obiekt poruszał się tylko w pionie lub poziomie -> wówczas wystarczyłoby tylko dodać 16px do obecnej pozycji w danym kierunku i obliczyć, który to kafelek np. w pozycji y = y; x += 16; (zakładając, że obiekt porusza się tylko w poziomie).
Mam jednak problem jak to przełożyć na ruch ukośny. W końcu jeśli obiekt porusza się z lewego górnego rogu kafelka w kierunku prawego dolnego rogu to ta odległość > 16px; (przekątna to (16*16 + 16*16)^0.5 = 22,62px...
Czy da się to jakoś prosto wyprowadzić?

0

Żeby nie było wątpliwości o co mi chodzi poniżej zamieszczam również ilustrację. Mam nadzieję, że wszystko jest jasne.
user image

0

Nie rozumiem twojego problemu. Masz pozycję (x,y) i masz prędkość (vx,vy). Wyliczasz nową pozycję (x',y') = (x+vx, y+vy). Skoro kafelki są kwadratami 16px to przecież dzielenie całkowite x'/16 i y'/16 da ci numer kolumny oraz numer wiersza okreslajace kafelek.
Jeśli x=10, y=10, vx=7, vy=7 to startujemy z kafelka (10/16, 10/16) = (0,0) a dochodzimy do kafelka (17/16, 17/16) = (1,1)

0

za cholerę nie rozumiem jaki masz problem

masz dane
x, y, vx, vy

i pytasz jak "wyprowadzić" x + vx, y + vy ?
Co ma do tego przekątna? I o co chodzi z tą odległością 16 px - czemu akurat 16?

0

mam wrażenie, że poziom edukacji sięga dna

0

Z tego co pamiętam, to było to na fizyce w 7 albo 8 klasie szkoły podstawowej (a może i wcześniej, ale tak daleko w przeszłość już nie sięgam, i tak, to były czasy gdzie podstawówka miała 8 klas :D). Nazywało się to jakoś ruchem jednostajnym, czy coś...

0
fourfour napisał(a):

Z tego co pamiętam, to było to na fizyce w 7 albo 8 klasie szkoły podstawowej

ja dodawanie w zakresie do 10 miałem już w zerówce ;)

0

Dzięki, ale chyba nie do końca się zrozumieliśmy.

fsadsafdfdsa napisał(a):

mam wrażenie, że poziom edukacji sięga dna

To dlatego, że:

fsadsafdfdsa napisał(a):

za cholerę nie rozumiem jaki masz problem

Może trochę bardziej jaskrawy przykład z użyciem obrazka:
user image
Wydaje mi się, że trzeba tu najpierw obliczyć położenie obiektu na danym kafelku (czyli przerobić x,y na x_kafelka i y_kafelka) i jakoś to później odnieść...

0

Dobra, wyskoczę jak Filip z konopii - taki wzór y=ax+b znasz? Jeśli tak, to dasz radę. Bo to ten trudniejszy sposób... :)

0

W moim problemie nie chodzi o przemieszczenie obiektu, tylko określenie, który z 9 otaczających obiekt kafelków będzie następny na jego drodze.
Nie ma tu znaczenia prędkość. To może być inny kafelek w zależności od tego, gdzie obecnie znajduje się obiekt na danym kafelku.

0

@MichałZ chłopie, słabisz mnie. W pierwszym poście napisałeś:

Moja zagwozdka: jak obliczyć, w którym następnym kafelku wyląduje mój obiekt

Podkreślam wyląduje. Na to pytanie udzieliłem ci odpowiedzi. ale twój problem najwyraźniej jest zupełnie inny. Ty chcesz wiedzieć przez które kafelki będzie przebiegać droga obiektu. Niemniej jednak możesz to policzyć w dokładnie ten sam sposób biorąc pewne mniejsze deltaT po prostu. Zamiast skoczyć od razu o (Vx, Vy) do przodu możesz skoczyć 10 razy po 1/10 tego wektora.

0
MichałZ napisał(a):

W moim problemie nie chodzi o przemieszczenie obiektu, tylko określenie, który z 9 otaczających obiekt kafelków będzie następny na jego drodze.
Nie ma tu znaczenia prędkość. To może być inny kafelek w zależności od tego, gdzie obecnie znajduje się obiekt na danym kafelku.

MichałZ napisał(a):

W moim problemie nie chodzi o przemieszczenie obiektu, tylko określenie, który z 9 otaczających obiekt kafelków będzie następny na jego drodze.
Nie ma tu znaczenia prędkość. To może być inny kafelek w zależności od tego, gdzie obecnie znajduje się obiekt na danym kafelku.

Zrób tak:

  1. narysuj wykres współrzędnych, taki z x-ami i y-kami (osie współrzędnych)
  2. wymyśl sobie dwie nieduże liczby, najlepiej mniejsze od 10 a większe od 0
  3. jedną z tych liczb nazwij "a", drugą "b" (np. 3 to a, 2 to b)
  4. dla każdej liczby od 1 do 10 (albo 20, albo ile chcesz), nazywanej "x" policz wynik równania y=ax+b, czyli np. y=3*1+2
  5. narysuj na wykresie punkty (x,y) dla każdego x i wyliczonego y

Przyjrzyj się dokładnie rysunkowi, potem spróbuj zobaczyć go tak, że każda para (x,y), czyli punkt na wykresie to jeden kafelek. Wszystko powinno stać się jasne.

0
Shalom napisał(a):

@MichałZ chłopie, słabisz mnie. W pierwszym poście napisałeś:

Moja zagwozdka: jak obliczyć, w którym następnym kafelku wyląduje mój obiekt

Podkreślam wyląduje. Na to pytanie udzieliłem ci odpowiedzi. ale twój problem najwyraźniej jest zupełnie inny. Ty chcesz wiedzieć przez które kafelki będzie przebiegać droga obiektu. Niemniej jednak możesz to policzyć w dokładnie ten sam sposób biorąc pewne mniejsze deltaT po prostu. Zamiast skoczyć od razu o (Vx, Vy) do przodu możesz skoczyć 10 razy po 1/10 tego wektora.

Masz rację @Shalom, źle się wyraziłem. Rzeczywiście mi chodzi o to, do którego kafelka obiekt dojdzie jako pierwszy.
Fakt, mogę to zrobić korzystając z małej delty_time, ale to rozwiązanie ma jedną podstawową wadę: jest zbyt obliczeniożerne. Nie mogę za każdym razem, dla każdego obiektu obliczać w ten sposób.
Wydaje mi się, że da się to zrobić jakoś lepiej...

0

Ano oczywiście że da sie. Wszystko sie da.
Wylicz półprostą pomiędzy (x,y) a (x+Vx, y+Vy) a następnie przetnij ją z prostymi wyznaczonymi poprzez boki sąsiednich kafelków. Będziesz wtedy wiedział z którą ściana sie przetnie i w efekcie przez który kafelek będzie pomykał (a także jaki czas jest mu do tego potrzebny).

0

mam przeczucie graniczące z przekonaniem że autor po prostu spalił się ze wstydu i wymyślił na szybko nieco trudniejszy problem żeby jakoś z tego wyjść
pierwszy post i obrazek zdecydowanie opisują inny problem

ja dopowiem tylko że w większości gier jest stosowana uproszczona wersja - tzn. wektor jest ograniczonej długości i sprawdzane jest czy jego koniec znajduje się w obiekcie
w bardzo wielu grach można dzięki temu przejść przez ścianę gdy nabierze się odpowiedniej prędkości i/lub spowolni się procesor na tyle żeby delta czasu była wystarczająco duża (czasem wystarczy do tego przesuwanie okna gry)

0

if (H-y)/vy>(W-x)/vx - w poziomie
if (H-y)/vy<(W-x)/vx - w pionie
if (H-y)/vy=(W-x)/vx - po przekątnej

0

@Shalom i @_13th_Dragon - Dziękuję Wam bardzo za pomoc!
Chyba już wszystko w temacie ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1