![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 1 Dołączył: 25.03.2011 Ostrzeżenie: (10%) ![]() ![]() |
Witam mam gre 2D i chce zrobić system kolizji (wejście na pole jest zablokowane) i mam problem ze za nic nie moge tego zrobić więc pomyślałem ,że zapytam się tutaj
![]() mapa | x | y | 1 | 5 | 4 | 1 | 6 | 4 | i teraz mam mape : ( x y) x x x x x x y 1x1 | 1x2 | 1x3 | 1x4 | 1x5 | 1x6 .... 1x15 y 2x1 | 2x2 | 2x3 | 2x4 | 2x5 | 2x6 .... 2x15 y 3x1 | 3x2 | 3x3 | 3x4 | 3x5 | 3x6 .... 3x15 y 4x1 | 4x2 | 4x3 | 4x4 | 4x5 | 4x6 .... 4x15 y 5x1 | 5x2 | 5x3 | 5x4 | 5x5 | 5x6 .... 5x15 y 6x1 | 6x2 | 6x3 | 6x4 | 6x5 | 6x6 .... 6x15 i w bazie chce zablokowac aby nie można bylo wejsc na x-5 y-4 oraz x-6 i y-4 ![]() jeszcze aby nei było dam to co zrobiłem ostatnio ![]()
prosze o pomoc =] |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Skąd? Popatrz na swoje współrzędne. Skoro x = 5, y = 4, wielkość planszy w poziomie to 15 kolumn, poziomie to 6 wierszy, to wychodzi nam plansza o faktycznej wielkości 17 kolumn i 8 wierszach. Teraz punkt (5,4) . Wiersz 4 ma pod sobą 3 wiersze realne i jeden zablokowany, wszystkie o szerokości 17 kolumn, z kolei 4 kolumna to 4 kolumny + 1 kolumna dodatkowa. Z tego wychodzi nam, że numer pola to zawsze według wzoru:
Kod nr = y * ilość_kolumn_w wierszu + x + 1 gdzie: x - numer kolumny, y - numer wiersza. Podstawiając więc do wzoru przykładowo: Pole w grze ma: - 20 kolumn x 30 wierszy - punkt postaci to (5,9) Co nam to daje? Wszystko co chcemy. Plansza realna zamienia się nam na 22 kolumny i 32 wiersze, czyli możemy policzyć pozycję startową nr = 9 *22 + 5 + 1 = 204 Jeśli przypatrzymy się numeracji pól wokół niego to uzyskamy taki widok: Kod 181 182 183 203 204 205 225 226 227 A z tego można łatwo zauważyć jaki ruch to jaka operacja, gdyż zawsze to końcowe pole odjąć startowe: W lewo w górę: 181 - 204 = -23 W górę: 182 - 204 = -22 W prawo w górę: 183 - 204 = -21 W lewo: 203 - 204 = -1 W prawo: 205 - 204 = 1 W lewo w dół: 225 - 204 = 21 W dół: 226 - 204 = 22 W prawo w dół: 227 - 204 = 23 Popatrz na to, na wielkości planszy i zauważ prostą rzecz... W lewo w górę => - ilość_kolumn_w_wierszu - 1 W górę => - ilość_kolumn_w_wierszu W prawo w górę => - ilość_kolumn_w_wierszu + 1 W lewo => -1 W prawo => +1 W lewo w dół => ilość_kolumn_w_wierszu - 1 W dół => ilość_kolumn_w_wierszu W prawo w dół => ilość_kolumn_w_wierszu + 1 Masz zdefiniowane wszystko: operacje będące ruchami, wielkość planszy, numeracje pól. Czego chcieć więcej? Jedyne co potrzebujesz do wygenerowania plansz to: - znać ich wielkość bazową, - wiedzieć co jest na jakim polu, - jakie numery pól są zablokowane. Dlaczego tak? Ponieważ w bazie nie musisz już rozwalać wszystkiego na macierze. Zamiast zapisywać punkty w formie układu współrzędnych w postaci (x,y) masz jedną liczbę. Możesz mieć ogrom plansz, które przechowują informacje w postaci: numer_planszy, numer_pola, id_obiektu zamiast rozbijać numer_pola na dwie składowe. Co nam to daje przykładowo? Zaprezentuję prostym przykładem. Mamy już wygenerowaną "mapę" i teraz pewne pola wrzucamy do tablicy $forbidden, która przechowuje pola na które nie można wejść. Sposób sprawdzenia banalny... Próbujemy wykonać "operację ruchu" i sprawdzamy czy wynik jest w tej tablicy (zwykłe użycie in_array) jeśli tak - robimy ruch. Ba... Możemy na planszy umieszczać przedmioty interaktywne. Jak? Robimy tablicę $interaction (lub $objects jak kto lubi), której klucz to numer pola, a wartość to tablica przedmiotów jakie się na tym polu znajdują. Jaki plus użycia obu? Pola zabronione też mogą przechowywać przedmioty, które są... elementami otoczenia (skały, drzewa). Używając stałych i określonych identyfikatorów, można wstawić do grafiki pola grafikę owego przedmiotu. Mogą też niektóre obiekty stanowić portale między mapami. Masz więc maksymalnie uproszczone operacje do: dodawania, odejmowania, prostego wyszukiwania tablicowego po wartościach lub kluczach. Cały świat można tak "narysować". Bo jakie masz ograniczenie int? Nawet 10k na 10k nie wyczerpuje go ![]() EDIT: Poza tym zobacz co w bazie robisz za bałagan... Jeśli w bazie nie ma pola, to jest ono zablokowane? A co z polami pustymi, gdzie można przejść, ale nie ma nic? W bazie masz tak więc pola, które są puste i do niczego nie służą, tyko po prostu są, bo nie mogą być zablokowane. Jeśli masz na planszy duże, puste przestrzenie, masz ogrom takich pól w bazie. Jeśli byłby z kolei "zapchane" plansze, to byłoby dużo pól w bazie. I tak źle, i tak niedobrze. Ale prędzej będzie wariant z dużą ilością wolnych. No chyba, że zrobisz ścieżkę jedyną słuszną przez las czy w górach ![]() Zauważ też, że zablokowane pola też zazwyczaj są czymś zapełnione i to też musi gdzieś być przechowane. Powstaje Ci więc tylko tak naprawdę utworzenie 3 tabel: - Board: id, width, height - Items: id, forbidden - Fields_to_item: board_id, field_id, item_id No i oczywiście reszta już zależna od tego co chcesz robić. Mogą to być tabele właściwości przedmiotów, ekwipunku, graczy itp.
Powód edycji: [thek]: EDIT co do nieobecności w bazie...
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 09:55 |