Wiem, że jest już dużo zasobów na ten temat, ale nie znalazłem takiego, który pasowałby do mojego układu współrzędnych i mam ogromne problemy z dostosowaniem któregokolwiek z tych rozwiązań do moich potrzeb. Nauczyłem się, że najlepszym sposobem na to jest użycie matrycy transformacji. Wdrażanie nie stanowi problemu, ale nie wiem, w jaki sposób muszę przekształcić przestrzeń współrzędnych.
Oto obraz, który pokazuje mój układ współrzędnych:
Jak przekształcić punkt na ekranie w ten układ współrzędnych?
Odpowiedzi:
Po pierwsze, oto kod. Wyjaśnienie nastąpi:
Pamiętaj, że ten kod nie będzie działać po wyjęciu z pudełka mapy pokazanej w pytaniu. Dzieje się tak, ponieważ nieparzyste kafelki są przesunięte w lewo, podczas gdy nieparzyste kafelki są zwykle przesunięte w prawo (tak jak ma to miejsce w edytorze map kafelkowych ). Powinieneś być w stanie łatwo temu zaradzić, modyfikując wartość x zwróconą w przypadku nieparzystych kafelków.
Wyjaśnienie
Może się to wydawać nieco bardziej brutalną metodą realizacji tego zadania, ale ma tę zaletę, że jest idealna pod względem piksela i nieco bardziej elastyczna.
Sztuczka polega na tym, aby oglądać mapę nie jako pojedynczą naprzemienną siatkę, ale jako dwie siatki nakładające się na siebie. Istnieje siatka nieparzystych wierszy i siatka nieparzystych wierszy, ale nazwijmy je czerwonymi i zielonymi, abyśmy mogli stworzyć ładny diagram ...
Zauważ, że po prawej stronie tego obrazu zaznaczyłem punkt fioletową kropką. Jest to przykładowy punkt, który spróbujemy znaleźć w naszym oryginalnym polu kafelków.
Należy zwrócić uwagę na każdy punkt na świecie, że zawsze będzie on leżeć dokładnie w dwóch regionach - czerwonym i zielonym (chyba że jest na krawędzi, ale prawdopodobnie i tak przycinamy w granicach poszarpanej krawędzi). Znajdźmy te regiony ...
Teraz wybierz, który z dwóch regionów jest właściwy. Zawsze będzie dokładnie jedna odpowiedź.
Stąd możemy wykonać prostszą arytmetykę i obliczyć kwadratową odległość od naszego punktu próbnego do każdego punktu środkowego dwóch regionów. Cokolwiek będzie najbliższe, będzie nasza odpowiedź.
Istnieje jednak alternatywny sposób. Dla każdego regionu testowego próbkujemy mapę bitową, która dokładnie odpowiada kształtowi naszych płytek. Próbkujemy to w punkcie przetłumaczonym na lokalne współrzędne dla tego pojedynczego kafelka. W naszym przykładzie wyglądałoby to mniej więcej tak:
Po lewej stronie sprawdzamy zielony region i otrzymujemy trafienie (Czarny piksel). Po prawej testujemy czerwony region i otrzymujemy brak (biały piksel). Drugi test jest oczywiście zbędny, ponieważ zawsze będzie dokładnie jeden lub drugi, nigdy oba.
Następnie dochodzimy do wniosku, że trafiliśmy w nieparzystą płytkę przy 1,1. Ta współrzędna powinna być łatwa do odwzorowania na oryginalne współrzędne kafelków przy użyciu innej transformacji dla nieparzystych i parzystych wierszy.
Ta metoda pozwala również mieć proste właściwości poszczególnych pikseli na bitmapach testowych pikseli. Np. Biały jest pozbawiony kafelków, czarny jest hitem, niebieski to woda, czerwony jest jednolity.
źródło
Myślę, że masz problem z przestrzenią współrzędnych. Współrzędne, które podałeś kafelkom, nie są tak naprawdę rzutem izometrycznym - musisz myśleć o xAxis jako o przekątnej w dół w prawo, a yAxis jako o przekątnej w dół w lewo (lub o innym wariancie)
teraz, jeśli poruszasz się wzdłuż ilustrowanych osi współrzędnych, będziesz podróżować po przekątnej w „przestrzeni kafelkowej”, aby kwadraty stały się diamentami (i wszystko będzie bardziej złożone)
Matryca transformacji, której szukasz, jest zbudowana z tych osi xiy. Jest to w rzeczywistości to samo, co wykonanie następujących obliczeń.
Edycja: Właśnie natrafiłem na podobne pytanie (ale z układem współrzędnych, o którym mówiłem) i ktoś udzielił tutaj o wiele dokładniejszej odpowiedzi:
Jak przekonwertować współrzędne myszy na indeksy izometryczne?
źródło
Zasadniczo chcesz uzyskać pozycję myszy w oknie za pomocą detektora zdarzeń, musisz usunąć przesunięcie pozycji kanwy w oknie z pozycji myszy, aby pozycja myszy była wówczas względna względem kanwy.
Zakładam, że wiesz, jak wykonać zdarzenie nasłuchujące na płótnie dla ruchu myszy, w przeciwnym razie możesz dowiedzieć się więcej o JS, zanim weźmiesz pod uwagę izometryczny projekt gry: D
źródło
Rozwiązałem to, zmieniając przestrzeń współrzędnych. Teraz zaczyna się bez przesunięcia w pierwszym rzędzie i do tego znalazłem działający przykład, który mogłem trochę dostosować.
źródło