Wpis z mikrobloga

Cześć, mam pewien problem (a właściwie pytanie) czy istnieje jakiś fajny algorytm do wyznaczania prawdziwego dystansu pomiędzy dwoma punktami i na podchodzenie do nich? Chodzi o to że mam koordynaty potworka i swoje (gra jest w dwóch wymiarach) i teraz aby postać zaatakowała wymagany jest dystans 6 komórek pomiędzy nimi, dystans obliczam tak:
abs(mojex - xpotworka) + abs(mojey + ypotworka);
i teoretycznie to działa, z taką różnicą, że w grze oczywiście możemy atakować także na ukos, czyli jeżeli potwór będzie w odległości ukośnej 6 komórek, to mój kod pokaże, że dla niego to jest 12 komórek.
Sprawę podchodzenia do potworków w miarę rozwiązałem, jednak też nie do końca i pewnie okrężną drogą.
Jeśli komuś chcę się zerknąć to: http://pastebin.com/m7TYVJUz
Mam nadzieję że jest wystarczająco dużo komentarzy. :P
#programowanie #naukaprogramowania
  • 33
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@morsisko: jesli mozemy atakowac na ukos to na pewno 6 komorek ukosnie to nie jest ta sama odleglosc co 6 komorek pion/poziomo (jest to sqrt(2) razy wiecej, wiec nie powinno byc mozliwosci na atak po skosie w odl wiekszej niz okolo 4 komorki (6 dzielone przez sqrt(2) i zaokraglone do liczby calkowitej w dol (floor (x)), część całkowita - jest to pewna matematyczna operacja)
  • Odpowiedz
@ktose:
Nad Pitagorasem myślałem, ale oczywiście nie wszystkie mooby są na ukos od mojej postaci, niektóre są w linii prostej, więc trzeba by było sprawdzać jeszcze czy da się zbudować trójkąt.
@anonim1133:
W sumie to dobra propozycja, przyznam szczerze że na to nie wpadłem, tutaj w sumie trzeba sprawdzać tylko przynależność punktu do koła :D
@plasticstone
Właśnie gra ma taki algorytm że 6 ukośnie to to samo
  • Odpowiedz
@morsisko: poprostu skorzystaj ze starego, dobrego pitagorasa :)
(x2 -x1)^2 + (y2-y1)^2 = dist^2
Przy testowaniu minimalnej odleglości spotęguj najpierw dystans, żeby pozbyć się pierwiastkowania.
  • Odpowiedz
@Wiktor426: Ale tak właśnie robię z tą różnicą że zamiast sqrt(pow(x,2) używam abs() co jest chyba trochę lepsze i bardziej przejrzyste, ale takie coś nie uwzględni odległości ukośnej.
  • Odpowiedz
@Wiktor426: Ale to nie daje takiego samego efektu?
Przykład: Moje koordynaty: 155,50
Przeciwnika: 165,80

z abs = abs(165-155) + abs (80 - 50) = 40
z sqrt(pow(x,2) = sqrt((165-155)^2) + sqrt((50-80)^2))
  • Odpowiedz