Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mapa, układ współrzędnych
Forum PHP.pl > Forum > Przedszkole
MagnuM
Witam, chciałbym utworzyć mapę na potrzeby gry.

Prowizorycznie powinna wyglądać następująco.


Kod
y\x     -2       -1      -0      1       2
-2   (-2,-2)  (-1,-2)  (0,-2)  (1,-2)  (2,-2)
-1   (-2,-1)  (-1,-1)  (0,-1)  (1,-1)  (2,-1)
0     (-2,0)   (-1,0)   (0,0)   (1,0)   (2,0)
1     (-2,1)   (-1,1)   (0,1)   (1,1)   (2,1)
2     (-2,2)   (-1,2)   (0,2)   (1,2)   (2,2)


Każdy punkt zawiera osobne właściwości.

1. Jak powinna wyglądać struktura tabeli dla takiej mapy ? (id?, os_x, os_y, [inne])
2. Jak napisać pętlę która będzie wyświetlała bazę dla określonego punktu środkowego (na przykładzie [0,0], lecz chciałbym aby on był zależny od miejsca jakie zajmuje użytkownik na mapie).
3. Jak powinno wyglądać zapytanie do takiej pętli ?

Pozdrawiam.
Master Miko
też się kiedyś nad tym zastanawiałem.. może popristu każdej komórce dać inne id, a algorytm odczytywałby ich położenie na podstawie id..

tylko chcesz to zrobić w tabeli html, obrazku gd czy w bazie danych?
MagnuM
? wszelkie dane mają być w bazie, chciałbym je dynamnicznie wczytywać za pomocą zapytania do bazy, tworzyłaby się tabela(html) z polami a w nich dane na temat danego pola
Master Miko
No to tak... ja bym najpierw zdefiniował:
ilość kolumn i wtedy wsadzał do nich id

powiedzmy... że chcesz 200 pól - które będą zamknięte w np. 10 kolumnach. Wyjdzie że będzie 20 wierszy.

Każda komórka w tabeli miałaby własny id także w bazie danych. No i w ten sposób do każdego id mógłbyś przypisać odzielne parametry

id | wartosc
1 | ....
... | ...
200 | ...


1 zapytanie mysql:

"SELECT * FROM mapa ASC"

no i robisz fetch...

dla każdej serii 10 pól robisz 1 TR...


----- edit --------

Jeśli to maiałaby być "interaktywna mapa" do grania... ciężkoby się obliczało odległości... np. między id 40 a 74...

pomysł Bonza też jest dobry... ale np. mi tak bybyło lepiej
dr_bonzo
Hmm...
Kod
x | y | pozostale_parametry

indeksy na x i y

user jest w punkcie: (100, 30), mape chcesz miec o wymiarach: 5x5, czyli od (98,28) (lewy gorny) do (102, 32) (prawy dolny rog).

  1. SELECT x, y, ...
  2. FROM tabela
  3. WHERE x BETWEEN 98 AND 102 AND y BETWEEN 28 AND 32 ORDER BY y ASC, x ASC


Nie wiem jak to wypadnie z wydajnoscia.
MagnuM
Chodzi o to żeby ta mapa była dynamiczna, tzn. mogę z każdej strony mapy dodawać kolumny itd. dlatego użyłem układ współrzędnych, tzn w bazie jest os_x i os_y. Problem jest tego typu że ciężko to wyświetlić.
Master Miko
Cytat(MagnuM @ 2006-04-23 20:04:42)
Chodzi o to żeby ta mapa była dynamiczna, tzn. mogę z każdej strony mapy dodawać kolumny itd. dlatego użyłem układ współrzędnych, tzn w bazie jest os_x i os_y. Problem jest tego typu że ciężko to wyświetlić.

no właśnie... mój sposób nie spełnia Twoich warunków, natomiast dobry sposób bonza jest trudny do wyświetlenia :/



---edit----

Wygląda na to że musisz szukać najniższych wartości, a potem je dodawać... ale trudno zrobić zapytanie mysql do tego blink.gif


---edit---

musiałbyś dać

SELECT y FROM map where x = -2 ASC

no i tak dla każdego x :/
NuLL
Panowie - zadne tam tabelki - DIVy i nakladanie przezroczystych divow na obrazek - przeciez divovi mozna ustawic x i y.

http://www.flickr.com/photos/peterjlambert/128938562/ - zobaczcie co sie dzieje jak sie najedzie na zdjecie.
Master Miko
dobry pomysł... ale czy div w tym momencie będzie obsługiwał wartości ujemne snitch.gif , czy poprostu będzie trzeba dodać do niego wartość i do innecyh też?
MagnuM
Rozwiązałem częściowo problem.

  1. <?php
  2. $x = mysql_query("SELECT * FROM mapa WHERE os_x BETWEEN -2 AND 2 AND os_y BETWEEN -2 AND 2 ORDER BY os_x ASC, os_y ASC LIMIT 5");
  3.  
  4. echo '<table>';
  5.  
  6. while ($sqlArray = mysql_fetch_array($x)) {
  7.  
  8. echo '<tr>';
  9.  
  10. $y = mysql_query("SELECT * FROM mapa WHERE os_y = ". $sqlArray['os_y'] ." ORDER BY os_x");
  11.  
  12. while ($sqlArrayX = mysql_fetch_array($y)) {
  13.  
  14. echo '<td class=glowna>('.$sqlArrayX['os_x'].','.$sqlArray['os_y'].')</td>';
  15. }
  16. echo '</tr>';
  17.  
  18. }
  19.  
  20. echo '</table>';
  21. ?>


Tylko że to jest... straszne ;p
ActivePlayer
http://travian.com/

zarejestruj sie, tam jest wlasnie taka mapka, ogolnie duzo tego tam jest...
Master Miko
oczywiście chodzi o to żeby było jak najmniej zapytań mysql... najlepiej byłoby wtedy selectować wszystko jednym polecaniem, a co do wyboru zostawić to skryptowi...
dr_bonzo
A co bylo zlego w mojej wersji -- dostajesz jedno wymiarowa tabele, znasz ilosc kolumn w wierszu (5) i dzielisz ta tablice na wiersze po 5 kolumn w kazdym.
MagnuM
Cytat(dr_bonzo @ 2006-04-23 22:28:58)
A co bylo zlego w mojej wersji -- dostajesz jedno wymiarowa tabele, znasz ilosc kolumn w wierszu (5) i dzielisz ta tablice na wiersze po 5 kolumn w kazdym.

No dobrze, a napisz do tego tabele w htmlu, w której komórki są odpowiednio wypełnione danymi z tego zapytania, prosze.
ActivePlayer
hmm
  1. ?><table><?
  2. $i=0;
  3. while($row=mysql_fetch_assoc($res)){
  4. if($i%5==0){?><tr><?}
  5. ?><td><?echo $row['x'];?> - <?echo $row['y'];
  6. $i++;
  7. }
  8. ?></table><?

?
MagnuM
Witam ponownie.

Cytat
y\x    -2      -1      -0      1      2
-2  (-2,-2)  (-1,-2)  (0,-2)  (1,-2)  (2,-2)
-1  (-2,-1)  (-1,-1)  (0,-1)  (1,-1)  (2,-1)
0    (-2,0)  (-1,0)  (0,0)  (1,0)  (2,0)
1    (-2,1)  (-1,1)  (0,1)  (1,1)  (2,1)
2    (-2,2)  (-1,2)  (0,2)  (1,2)  (2,2)



Mapa wygląda w sposób następujący. Pogrubione pole oznajmia, że znajduje się na nim jakaś dodatkowa wartość. Chciałbym wykonać zapytanie które wybierze mi pole które będzie odległe o przynajmniej jedno pole od tego które ma jakąkolwiek wartość.

Struktura bazy: os_x, os_y, wartosc

pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.