Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> System kolizji
kylu31
post 12.07.2012, 15:23:48
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 1
Dołączył: 25.03.2011

Ostrzeżenie: (10%)
X----


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 smile.gif więc tak, mam baze mysql o nazwie kolizje a w niej pola

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 biggrin.gif

jeszcze aby nei było dam to co zrobiłem ostatnio haha.gif

  1. if($row['x'] + 1 == $user['x'] and $row['y'] == $user['y']){
  2. // funkcja nei zostanie wykonana
  3. }else{
  4. // funkcja jest wykonana
  5. }


prosze o pomoc =]
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post 13.07.2012, 12:58:40
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 wink.gif A nie sądzę, byś tak ogromne plansze robił. Poza tym jak wyobrażasz sobie sprawdzanie pola w układzie kartezjańskim? Musiałbyś stworzyć obraz planszy i wszystkich jej pól by potem sprawdzać owe pola z możliwością ruchu. Zamiana na wektor sprawia, że przechowujesz jedynie informację o niezbędnych polach, czyli takich gdzie coś jest lub zabronionych dla ruchu. Tych będzie o niebo mniej.

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 laugh.gif
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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:55