Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Mapa jak w grach online mmorpg
Forum PHP.pl > Forum > Przedszkole
PiNkOs
Witam,

Bawię się w tworzenie mapy coś na zasadzie typu plemiona, itp.

Udało mi się dojść do kroku, w którym zaznaczam osadę (podaję x i y)

Oto kod:

  1. <?php
  2. /// World Size x,y
  3. $size_x = 25;
  4. $size_y = 25;
  5.  
  6. //City place
  7. $x = 12;
  8. $y = 13;
  9.  
  10. // World tabel
  11. ?>
  12. <h1>MAPA</h1>
  13. <table border='0' rules='all'>
  14. <?
  15.  
  16. echo "<tr>";
  17. echo "<td> </td>";
  18. for($j=0; $j<$size_y; $j++){
  19. echo "<td align='center'>".$j."</td>";
  20. }
  21. echo "</tr>";
  22.  
  23. for($i=0; $i<$size_y; $i++){
  24. //Create y?>
  25. <tr id='<?=$i;?>'>
  26. <td><?=$i?></td>
  27. <?
  28. for($o=0; $o<$size_x; $o++){
  29. //Create x
  30.  
  31. if($i == $y && $o == $x){
  32. ?>
  33. <td width='50px' height='50px' bgcolor='white'> </td>
  34. <?
  35. }else{
  36. ?>
  37. <td width='50px' height='50px' bgcolor='black'> </td>
  38. <?
  39. }
  40.  
  41. }
  42. ?>
  43. </tr><?
  44. }
  45. ?>
  46. </table>


Wprowadzamy liczby w zmienne $x i $y i koloruje nam osadę (kwadrat) na kolor biały.

I teraz zaczyna się problem.

Chodzi mi oto, abym mógł zaznaczać kolejne osady podając współrzędne. (Po prostu zaznaczyć kolejne.)

Myślałem o tablicy, lecz się pogubiłem.

Co do optymalizacji to słucham innych propozycji, jednakże zależy mi na rozwiązaniu w oparciu o ten kod.
gino
nie wiem czy to ma tak działać, ale w sekcji City place zmień:

  1. <?php
  2. $x = array(12=>12, 13=>13, 14=>14);
  3. $y = array(13=>13, 14=>14, 15=>15);
  4. ?>


w sekcji Create x:

  1. <?php
  2. //if($i == $y && $o == $x) //zamiast tego
  3. if (array_key_exists($i, $x) && array_key_exists($o, $y)) //daj to
  4. //i dalej Twoj kod...
  5. ?>



gino

PS. edycja dotyczyła zmiany w tablicach abyś dostosować to do Twojego kodu.
PiNkOs
Podając twe dane w

  1. <?php
  2. $x = array(12=>12, 13=>13, 14=>14);
  3. $y = array(13=>13, 14=>14, 15=>15);
  4. ?>


otrzymałem coś takiego:



Uploaded with ImageShack.us

Chodzi mi oto, aby te oznaczenie[osady] nie były od siebie zależne, Zauważyłem tutaj jakąs zależność. Może ja Cię nie zrozumiałem, mógłbyś wyjaśnić jeżeli chodzi o te tablice wyżej... dlaczego takie wartości?
gino
wstaw to i zobacz na pewno pojmiesz (tamte liczy wstawiłem losowo, sory)

  1. $x = array(12=>'12', 12=>'12', 12=>'12');
  2. $y = array(13=>'13', 14=>'14', 15=>'15');


gino
PiNkOs
Dzięki wiem o co biega ;D

Ale teraz przykład:

Chcę zaznaczyć TYLKO 3x4 12x6

  1. $x = array(4=>'4', 6=>'6');
  2. $y = array(3=>'3', 12=>'12');


Pojawiają się 4 kwadraciki w miejscach: 4x3 4x12 i 6x3 i 6x12

Czemu?

Z góry wielkie dzięki za pomoc.

//DOŁĄCZAM SCREEN 20:35



Uploaded with ImageShack.us
gino
sorki troche sie pospieszyłem, ale juz daje kod:

  1. <?php
  2. $x = array(0=>'12', 1=>'12', 3=>'13');
  3. $y = array(0=>'12', 1=>'13', 3=>'13');
  4. //zaznaczenie 3 kwadratów o wsp. 12,12; 13,12; 13,13
  5. ?>


a w pętli for dla $o warunek:

  1. <?php
  2. for($o=0; $o<$size_x; $o++)
  3. {
  4. if (($i == current($y) && current($y)!='') && ($o == current($x) && current($x)!=''))
  5. {
  6. next($x);
  7. next($y);
  8. ....//dalej Twój kod
  9. ?>


sorki za błędny kod


gino
zegarek84
najlogiczniej byś to mógł zrobić tworząc sobie taką mapkę z tablic w pierwszej kolejności, gdzie np. $y to tablica zawierająca inne tablice które są wierszami, i w tych wierszach z kolei ustawiasz na pozycji $x np true... dla przykładu $aMap = array(); if(!isset($aMap[$y]) $aMap[$y] = array(); // lub zamiast isset array_key_exists... i dalej na pozycji $x ustawiasz jakąś wartość np. $aMap[$y][$x] = true;

potem sprawdzić możesz prosto za pomocą innych zmiennych odpowiadających pozycji $y i $x np. isset($aMap[$wiersz]) && isset($aMap[$wiersz][$kolumna])

możesz zrobić jeszcze inaczej - skoro znasz wymiar tablicy i pozycję danej wiochy to tablicę z wiochami możesz spłaszczyć i wiochę zaznaczoną w kolejności od lewego pola wierszami od góry w dół będziesz miał:
$aSplaszczona = array();
numeracja wierszy od 0 - pierwszy wiersz 0 przy tym spłaszczeniu i tak kolejno;
$aSplaszczona[$y*$szerokosc_planszy + $x] = true;

jeśli rysujesz całą planszę na pętli inicjujesz na zewnątrz zmienną i ją zwiększasz przy każdym tworzeniu nowej komórki - przy pomocy tej zmiennej sprawdzasz po prostu isset($aSplaszczona[$iKolejnyTd]).... a jeśli to jest wycinek planszy to pozycję zmiennej $iKolejnyTd w przebiegu pętli musisz wyliczyć - mam na mysli jeśli np. nie wyświetlasz 10 kolumn z lewej...

rozwiązań jest kilka - matematyka przede wszystkim i trochę wyobraźni i nie obawiaj się próbować - to że kod wyjdzie w pierwszej wersji nie optymalny to nic - potem poprawisz ;]

ps. jeśli z bazy będziesz pobierał wycinki planszy dla danego pola w zależności od x i y to nałóż sobie index po x, y lub po y, x - w zależności który pierwszy parametr będzie sprawdzany
gino
rozwiązań jest trochę, ale PiNkOs zaznaczył, że zależy mi na rozwiązaniu w oparciu o ten kod... Dla jasności do tego co napisałem dodam, że ponieważ pętla dla Y wykonywana jest raz od zera do wartości max, współrzędne w tablicach trzeba sortować również rosnącą: w tablicy $y dla wszystkich elementów, a w tablicy $x dla elementów będących współrzędnymi tych samych wartości w $y. Obrazowo:wartości dla $y: 1,3,4,7,9,12,12,12,13 odpowiadające im w $x: 3,1,5,6,2,2,3,6,4 (sortowanie dla w $x dla wartości 12 w $y także musi być rosnące).


gino
PiNkOs
Bardzo dziękuję za pomoc.

Pzdr
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.