Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mapa do gry
Forum PHP.pl > Forum > PHP
michal16202
Witam, od jakiegoś czasu robię grę ekonomiczną a'la plemiona i napotkałem problem. Nie mam zielonego pojęcia jak zrobić do niej mapę z podglądem na miasta (nie podgląd budynków w mieście). Wymyśliłem że podgląd mapy będzie miał rozmiar 10 miast na 10 miast czyli będzie widać ich jednorazowo maksymalnie 100 więc wpadłem na pomysł aby do każdej poziomej linijki dać pętlę for która sprawdzała by czy na danej pozycji znajduje się miasto czyli rekord w bazie ale niestety nie wiem jak to zrobić.
daniel1302
Masz 2 wyjścia(zawsze jest ich więcej) lepsze i gorsze i oba w zasadzie są jednakowo proste.

1) Albo tj ty to wymyśliłeś, że dla każdego pola na mapie pobierasz dane osobno w pętli i umieszczasz na mapie ale jest to czasochłonne i procesorzerne.

2) Pobierasz dane z bazy(miasta) które mają określoną pozycję w sposób jak niżej:
Załóżmy, że punktem odniesienia jest środek(albo jego okolice). Jeśli przeglądamy mapę od początku to będą widoczne pola X od 0 do 9 włącznie i w osi Y tak samo od 0 do 9.
Punkt odniesienia(np który przesuwa się po naciśnięciu strzałek) to będzie dla ww. danych np (X;Y) = (4;4)
Teraz obliczamy jakie pola widać:
Kod
Xmin = X-4 = 0,
Xmax = X+5 = 9

Ymin = Y-4 = 0
Ymax = = Y+5 = 9.


I teraz pobierasz wszystkie rekordy gdzie:
...
Kod
WHERE X BETWEN Xmin-1 AND Xmax+1 AND Y BETWEN Ymin-1 AND Ymax+1;


później w pętli sprawdzasz pobrane dane i umieszczasz je w tablicy mapy np
  1. $mapa = array();
  2. foreach ($results as $result) {
  3. $mapa[$result['x']][$resuls['y']] = $result['villageid'];
  4. }

A później w pętli rysujesz po jednym wierszu mapy i sprawdzasz czy istnieje w tablicy $mapa rysowane pole i jeśli istnieje to wstawiasz odpowiedni rysunek i jak na niego kliknie to coś tam się dzieje np uruchamia się skrypt ajax który pobierze kod z db o danej wiosce i wyświetli go w okienku albo cuś...
michal16202
Właśnie zdałem sobie sprawe ile jeszcze muszę się nauczyć. Czy możesz mi to rozpisać troche jaśniej? Dla ciebie może się to wydawać banalne ale dla mnie jest wyższa filozofia.
daniel1302
Mam gdzieś mapę napisaną właśnie w oparicu o plemiona (obrazki widze), znalazłem ją teraz ale nie wiem kiedy została napisana, mam date utworzenia z 2012 ale to napewnie nie wtedy napisałem ją.

Tutaj link do mojego projektu(wyciąłem co uznałem za słuszne ale nie wiem czy wszystko): https://drive.google.com/folderview?id=0Bwb...amp;usp=sharing

A tutaj masz multum informacji na twoj problem: http://forum.gammo.pl/search.php?searchid=461219
michal16202
Coś z tym porobię ale raczje wątpie że coś zrobie bo nie znam js a co do drugiego linka pisze mi "Niestety - brak wyników. Proszę spróbować użyć innych zwrotów". Dam znać za jakiś czas bo żadko siedze ostatni przy kompie.

Przejrzałem tą twoją mapkę i stwierdzam że nie mam zieolnego pojęcia jak ją odpalić a tym bardziej nie wiem jak działa jednym słowem czarna magia. Na tym foum co podałeś link znalazłem mapkę ale nie do końca o to mi chodziło, jest tam kod który dzieli mapę na "wyspy" a ja właśnie zamierzam uniknąć czegoś takiego.

Jest progress, postanowiłem jednak użyć tej mapy z forum z tego linka, oświeciło mnie jak siedziałem na kiblu ale niestety znowu wyszły jakieś błędy których nie wiem jak naprawić bo nawet print odmawia posluszeństwa. Błąd jest taki "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\WebServ\httpd\mapa.php on line 25" a kod natomiast jest taki.
  1. <?php require_once 'engine/init.php'; include '/modules/header.php';?>
  2. <?php
  3.  
  4. echo '<div id="drag"><div class="inside drag">'; //pobieramy z css'a wymiary itd.
  5.  
  6. $sql = mysql_query("SELECT * FROM miasta WHERE Gracz='Player'"); // pobieranie x i y mojego miasta i dodanie do petli ponizej "jak?"
  7. for ($i=0; $i<=9; $i++) //pętla która liczy współrzędne od 0 do 9 poziomo
  8. {
  9. $x = $i * 40 + 15; // liczymy co ile ma się pokazywać współrzędna
  10. echo "<div style='position:absolute; top:-20; left:$x'>$i</div>"; // pokazujemy wsółrzędną
  11. }
  12.  
  13. for ($i=0; $i<=9; $i++) //pętla która liczy współrzędne od 0 do 9 pionowo
  14. {
  15. $x = $i * 40 + 15;
  16. echo "<div style='position:absolute; top:$x; left:-20'>$i</div>";
  17. }
  18. $Xmin = 0 ; //------------------------------------------------//
  19. $Xmax = 10 ; // Pobieranie pozycji ze zmiennej $sql i //
  20. $Ymin = 0 ; // usuwanie 4 i dodawanie 5 żeby sprawdzić wioski //
  21. $Ymax = 10 ; //------------------------------------------------//
  22.  
  23. $kod = mysql_query("SELECT x, y FROM miasta WHERE x BETWEN " .$Xmin. " AND " .$Xmax. " AND Y BETWEN " .$Ymin. " AND " .$Ymax. "") ; //wybieramy tabelę wioski (zakładam że macie inną) i wynik gdzie wyspa jest tą co w get
  24. while ($wiersz = mysql_fetch_array($kod)) // robimy pętle która pobierze wszystkie wioski na mapę
  25. {
  26. $x = $wiersz['x']; // x wiosek
  27. $y = $wiersz['y']; // y wiosek
  28.  
  29. $a = $x*40; //tutaj mamy jaką ma mieć wielkość obrazka wioski i ile ma mieć odległość między współrzędnymi np 1 - 2 w moim przypadku 40px
  30. $b = $y*40;
  31. echo "<div style='position:absolute; top:$b; left:$a'><img src='/layouts/img/city.png'></div>"; //pokazujemy wioski na wyznaczonych współrzędnych
  32. }
  33. echo'</div></div><br>'; // zamykamy tagi html ;)
  34. ?>
  35. <?php include '/modules/footer.php'?>

I mam jeszcze pytanie, w 6 linijce mam zmienną $sql która chcę pobrać x i y "mojego" miasta żeby był punktem odniesienia do mapy, później to zamienie na pobieranie informacji z sesji ale nie o to chodzi, jak użyć zmiennej globalnej żebym mógł użyć tej zmiennej do petli w 7 linijce i 13?

Zamieniłem 23 linijkę na
  1. $kod = mysql_query("SELECT x, y FROM miasta WHERE x >= ".$Xmin." AND x <= ".$Xmax." AND y >= ".$Ymin." AND y <= ".$Ymax."");
i działa wyświetlanie miast ale nadal mam problem z tą zmienną globalną i doszedł kolejny problem, nie działa mi zwiększanie zmiennej Xmin z formularzu, kod:
  1. echo '<form method="POST">';
  2. echo '<button name="ok">+1</button>';
  3. echo '</form>';
  4. if(isset($_POST['ok']))
  5. {
  6. $Xmin = $Xmin + 1;
  7. }
daniel1302
Witam, przejdź na z przekzaywania danych za pomoca $_POST na $_GET bo to w twoim wypadku jest lepsze i prostrze.

na początku zrób tak:
  1. if (!isset($_GET['xvalue'])) { $_GET['xvalue'] = 0; }


i niżej daj

  1. <?php echo '<a href="'?xvalue='.$_GET['xvalue']+1 .'">+1</a>;
  2. $Xmin = $_GET['xvalue'];


Mniej więcej takie coś.
michal16202
Już brałem pod uwagę $_GET ale nie wiem jak to zrobić dla 4 wartości, 2 dodające dla x i y i 2 odejmujące tak żeby można było jednocześnie dodawać i odejmować wartości przez co mapa będzie się przesówać. Wiesz jak użyć zmiennej $sql w pętli 7 i 13 linijce? Oraz mam jeszcze jedno pytanie jak zrobić żeby pętla for za pierwszym razem wykonała inny niż za każdym kolejnym wykonaniem?
johny_s
Dlaczego się bierzesz za takie rzeczy skoro podstaw nie znasz?
michal16202
Robię to po to żeby się nauczyć i zrobić coś w życiu z czego będę dumny.
daniel1302
Załóżmy, że masz linka
...../skrypt.php?imie=daniel&wiek=120&mzamieszkania=nycity

i teraz w php masz takie coś:
  1. echo $_GET['imie']; //daniel
  2. echo $_GET['wiek'].' lat'; //120 lat.
  3. .....
michal16202
Wydaje mi się że ogarniam ale nie mam za bardzo czasu w tej chwili myśleć nad tym, jutro albo po jutrze odpisze czy coś uwskórałem.

@edit

Daniel, wziąłem twój kod kilka postów wyżej i nie działa, próbowałem naprawić ale nic to nie dawało. Szukałem na internecie czegoś na wzór tego i też nie działało. Taki error wyświetla "Parse error: syntax error, unexpected '=' in"


Przerobiłem co nie co ten kod, pozbyłem się jednego problemu i pojawił się kolejny. Kod wygląda tak:
  1. echo '<div class="poziomo">';
  2. for ($i=0; $i<=9; $i++) //pętla która liczy współrzędne od 0 do 9 poziomo
  3. {
  4. echo $i.'&nbsp'; // pokazujemy wsółrzędną
  5. }
  6. echo '</div>';

W tej chwili wygloda tak, http://prntscr.com/3mkyma ale kiedy wartości się zwiększą np do maksimum wszystko się rozjeżdża, http://prntscr.com/3mkz0c.
Próbowałem już to zablokować jakimś innym divem, próbowałem zostawić to tak jak było poprzednio ale wtedy tekst nasuwał się na mapę, próbowałem word-spacing i nic.
  1. .poziomo{
  2. float: left;
  3. margin-left: 14px;
  4. margin-top: -25px;
  5. word-spacing: 27px;
  6.  
  7. }

I jeszcze jedno, gdzy dodaję do pliku
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2.  

to wszystkie miasta znajdują się w lewym górnym rogu mapy, przetestowałem kilka żeczy i mogę stwierdzić że to coś wyłącza mi pobieranie stylów z pliku php.


@edit
Udało mi się zrobić bezbłędne wyświetlanie wiosek i współrzędnych, wszystko jest cacy. Pozostały mi tylko trzy problemy, funkcja GET, rozchodzące się górne współżędne i ten przeklęty doctype.

@edit

Napisałem coś takiego ale nie działa do końca jak chce. Jak klikam button odpowiedzialny za przesuwanie y lub x to działa bez zarzutów ale jak chcę przesunąć x i y to wraca mi do domyślnej wartości x lub y w zależności co piwersze się kliknęło. Czytałem na niecie że trzeba użyć pola hidden ale nie wiem jak.


  1. if (!isset($_GET['x'])) { $_GET['x'] = 0; }
  2. if (!isset($_GET['y'])) { $_GET['y'] = 0; }
  3.  
  4. echo'<div class=\'strzalki\'>';
  5. $y = (int)$_GET['y'] - 1;
  6. echo "<form action='' method='get'>";
  7. echo "<input type='hidden' name='y' value='$y' />";
  8. echo "<input type='submit' value='/\'>";
  9. echo "</form>";
  10. echo'</div>';
  11. echo'<div class=\'strzalki2\'>';
  12. $x = (int)$_GET['x'] - 1;
  13. echo "<form action='' method='get'>";
  14. echo "<input type='hidden' name='x' value='$x' />";
  15. echo "<input type='submit' value='<<'>";
  16. echo "</form>";
  17. echo'</div>';
  18. echo'<div class=\'strzalki3\'>';
  19. $x2 = (int)$_GET['x'] + 1;
  20. echo "</form>";
  21. echo "<form action='' method='get'>";
  22. echo "<input type='hidden' name='x' value='$x2' />";
  23. echo "<input type='submit' value='>>'>";
  24. echo "</form>";
  25. echo'</div>';
  26. echo'<div class=\'strzalki4\'>';
  27. $y2 = (int)$_GET['y'] + 1;
  28. echo "<form action='' method='get'>";
  29. echo "<input type='hidden' name='y' value='$y2' />";
  30. echo "<input type='submit' value='\/'>";
  31. echo "</form>";
  32. echo'</div>';
  33.  


@edit

Znalazłem rozwiązanie do tego get, w każdym buttonie zrobiłem nowe pole hidden i w zależności co button robił, czy zwiększał x czy y, czy zmniejszał dałem odpowiednia zmienną pobierającą x lub y w value i wszystko działa.
  1. $a = (int)$_GET['x'];
  2. $b = (int)$_GET['y'];



Pozostaje jeszcze tylko problem tego doctype i mapa będzie działała bez zarzutu.
kujol
To wrzuć może jakieś demo jak skończysz, zobaczymy co z tego wyszło biggrin.gif
michal16202
Demko gry czy mapy? Jeśli demko gry to napewno pojawi się tu jakiś temat ale nie prędko, prace idą powoli a na dodatek nie mam grafika i kasy żeby go połacić ale gra wystartuje.
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.