Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][JavaScript]Przekierowanie
Forum PHP.pl > Forum > Przedszkole
kamilos809
hejka,
Bawię się funkcją setTimeout("");
I napotkałem niestety problem...
Moja funkcja, cóż by tu wiele opowiadać, połączona z PHP tworzy pętlę liczącą od stu w dół i zapisującą każdą zmianę w bazie.
Problem w tym, że skrypt po przejechaniu zera odejmuje dalej i chciałbym, żeby przy dojechaniu do liczb na minusie przekierował mnie na danego linka.

Sam kod, brany z przykładu wygląda tak:
  1. <script language=javascript>
  2. // tworzymy zmienna
  3. var object = false;
  4.  
  5. // tworzymy obiekt XMLHttpRequest (dla IE jest troche inaczej, stad funkcja warunkowa)
  6. if (window.XMLHttpRequest) object = new XMLHttpRequest();
  7. else if (window.ActiveXObject) object = new ActiveXObject("Microsoft.XMLHTTP");
  8.  
  9. // ponizsza funkcja pobiera dane ze wskazanego zrodla (pliku lub skryptu php) do wskazanego
  10. // DIVa poprzez obiekt XMLHttpRequest
  11. function getData(dataSource, divID)
  12. {
  13. // kontynuuje wylacznie gdy obiekt nie jest zajety
  14. if (object.readyState==4 || object.readyState==0)
  15. {
  16. // tworzy zmienna odpowiadajaca konkretnemu obiektowi na stronie
  17. var obj = document.getElementById(divID);
  18.  
  19. // czyta z pliku lub wykonuje skrypt
  20. object.open("GET", dataSource);
  21.  
  22. // definiuje metode obslugi odpowiedzi serwera
  23. object.onreadystatechange = function()
  24. {
  25. // kontynuuje jesli transmisja zostala zakonczona powodzeniem
  26. if (object.readyState == 4 && object.status == 200)
  27. obj.innerHTML= object.responseText;
  28. }
  29. // wysyla zadanie do serwera
  30. object.send(null);
  31. }
  32. }
  33.  
  34. // w ponizszej funkcji wywolujemy funkcje getData z odpowiednimi parametrami
  35. // oraz wywolujemy ja sama rekurencyjnie po co okreslony czas (w naszym wypadku 1000 ms)
  36. function odswiezaj2()
  37. {
  38. getData('arena3.php?przeciwnik=<?php echo"$przec"; ?>&gnick=<?php echo"$gn"; ?>','gora');
  39. setTimeout("odswiezaj2()", 2000);
  40. }
  41.  
  42. </head>


a pliku php nie ma co kopiować, tam są tylko if'y o których wspominałem wcześniej.
SmokAnalog
Ten kod będzie trzeba rozpracować wieloetapowo, bo jest kilka babolków. Po pierwsze, kolejne wywołania funkcji odswiezaj2() powinny się odbywać w funkcji zwrotnej Ajaxa, bo nigdy nie wiesz ile potrwa łączenie się z serwerem. Czyli ta linijka:
[JAVASCRIPT] pobierz, plaintext
  1. setTimeout("odswiezaj2()", 2000);
[JAVASCRIPT] pobierz, plaintext

Którą notabene można zapisać po prostu tak:
[JAVASCRIPT] pobierz, plaintext
  1. setTimeout(odswiezaj2, 2000);
[JAVASCRIPT] pobierz, plaintext

Włóż tu:
[JAVASCRIPT] pobierz, plaintext
  1. if (object.readyState == 4 && object.status == 200) {
  2. obj.innerHTML= object.responseText;
  3. setTimeout(odswiezaj2, 2000);
  4. }
[JAVASCRIPT] pobierz, plaintext
kamilos809
Dzięki za poprawkę tego, ale mój problem nadal nie jest rozwiązany...
SmokAnalog
No bo napisałem, że krok po kroku to trzeba rozpracować. Póki co to nawet nie wiadomo o co chodzi - gdzie ma przekierować? Gdzie ten link? I co jest tą liczbą? Wróżkami nie jesteśmy tongue.gif
kamilos809
jakbym wiedział gdzie wsadzić tą liczbę i link to bym nie pytał tongue.gif
to wszystko jest umieszczone w pliku do którego się odnosze tu:

  1. getData('arena3.php?przeciwnik=<?php echo"$przec"; ?>&gnick=<?php echo"$gn"; ?>','gora');


nie ma co opisywać czy kod pokazywać. Za każdym wykonaniem tej pętli(?) że tak to nazwę, bo nie wiem jak to się fachowo zwie, z tabeli, dokładnie z jednej zdefiniowanej komórki odejmuje się liczba wybierana losowo(rand) od puli w tej komórce zawartej(będzie to zawsze: 100) i chcę zrobić coś takiego, żeby ta pętla nie wykonywała się cały czas, tylko do momentu, kiedy osiągnie 0 lub pierwszą niższą(wiadomo, że jeśli od 3 odejmiemy 5 wyjdzie -2...). Kiedy już to osiągnie ma przekierować do jakiegoś linka, dajmy na to index.php.
SmokAnalog
Myślę, że lepiej będzie jak opiszesz swój projekt. Mam wrażenie, że totalnie nie ogarniasz tematu. Napisz co chcesz zrobić (bez używania jakichkolwiek technicznych pojęć, mów tylko o projekcie), to podpowiem jak.
kamilos809
no już prościej nie umiem.
System jest na refleks. Musisz pokonać przeciwnika, którym jest system. Jednak on dobiera stosownie do Twojego poziomu tych przeciwników. Każdy taki przeciwnik bije Cię czy jakby to tam nazwać, co jakąś liczbę sekund z jakąś siłą, a Tobie ucieka życie z każdym uderzeniem np. z siłą -5 pkt życia. Cały system mi śmiga, tylko chcę dodać opcję, żeby kiedy się Tobie skończy życie, przekierowało do stosownej podstrony podsumowującej, że przegrałeś. Z wygraną sobie poradziłem, bo przy przesyłaniu czynności on sobie uaktualnia dane.
SmokAnalog
Ale na jakiej zasadzie odbywa się to bicie?
kamilos809
Chwilowo to wyświetlanie tekstu + odejmowanie punktów życia poprzez PHP.
Jak wymyślę coś lepszego to się dorobi
SmokAnalog
Ale ja nie o to pytam. Pytam, co sprawia, że danemu graczowi odejmują się punkty? Ktoś w coś klika czy po prostu to, że obaj są na tej samej stronie? Zadaję te pytania, bo mam wrażenie, że źle się za to zabrałeś.
kamilos809
jeny...
No ta pętla to robi, powtarzam któryś raz...
Za każdym wykonaniem pętli wykonuje się zapytanie odejmujące życie graczowi, a przeciwnikowi systemowemu odejmują się w ogóle w innym zapytaniu dzięki metodzie POST przechwyconej przez AJAX, żeby zapobiec niepotrzebnemu mieleniu całej strony
SmokAnalog
Chyba masz problem z czytaniem ze zrozumieniem, trudno.
kamilos809
nie, to Ty źle czytasz.
WALKA 2 GRACZY:
Gracz 1: realna osoba
Gracz 2: system, bot
próbuje Ci to wytłumaczyć od dawna...
Pyton_000
Kilka postów bezsensownej gadaniny a kod pokazany to najzwyczajniejszy Ajax, w którym nie ma nic co by miało pomóc w rozwiązaniu problemu.
SmokAnalog
No bezsensownej, autor tematu nie pojmuje, że nikt mu nie siedzi w głowie i jego zdaniem "jest gracz i bot" to wystarczające wyjaśnienie jego gry biggrin.gif
kamilos809
Ja już tracę siły. Nie wiem co Ci mam więcej wyjaśnić.

Łap ten kod, jeżeli on Ci cokolwiek zmieni:

  1. <?
  2. $db_host = 'localhost';
  3. $db_user = 'root';
  4. $db_pass = '';
  5. $db_name = 'gra';
  6. $prefix = '';
  7. $globals = false;
  8. if( !@mysql_connect($db_host, $db_user, $db_pass) )
  9. displayError( 'błąd połączenia z MySQL', mysql_errno(), mysql_error() );
  10.  
  11. if( !@mysql_select_db($db_name) )
  12. displayError( 'błąd wybierania bazy danych', mysql_errno(), mysql_error() );
  13. include("teksty/arena.php");
  14. $query = "SELECT * FROM walka WHERE id_potwora='$_GET[przeciwnik]' AND nick='$_GET[gnick]'";
  15. $w = mysql_query($query);
  16. while($r=mysql_fetch_array($w)){
  17. $zycie_potwora = $r['zycie_potwora'];
  18. }
  19. $query = "SELECT * FROM przeciwnicy WHERE id='$_GET[przeciwnik]'";
  20. $w = mysql_query($query);
  21. while($r=mysql_fetch_array($w)){
  22. $nazwa = $r['nazwa'];
  23. $sila = $r['sila'];
  24. }
  25. $query = "SELECT energia FROM users WHERE nick='$_GET[gnick]'";
  26. $w = mysql_query($query);
  27. while($r=mysql_fetch_array($w)){
  28. $energia=$r['energia'];
  29. }
  30. if($energia > 0){
  31. $losuj=rand(1,5);
  32. if($losuj=='1'){
  33. echo $tekst[3];
  34. $nowa_energia = $energia - 3;
  35. }
  36. if($losuj=='2'){
  37. echo $tekst[4];
  38. $nowa_energia = $energia - 4;
  39. }
  40. if($losuj=='3'){
  41. echo $tekst[5];
  42. $nowa_energia = $energia - 4;
  43. }
  44. if($losuj=='4'){
  45. echo $tekst[6];
  46. $nowa_energia = $energia - 5;
  47. }
  48. if($losuj=='5'){
  49. echo $tekst[7];
  50. $nowa_energia = $energia - 2;
  51. }
  52. $z="UPDATE users SET energia='$nowa_energia' WHERE nick='$_GET[gnick]'";
  53. $w=mysql_query($z);
  54. }else{
  55. echo'<font color="red"><b>Przegrałeś!</b><br>
  56. <a href="index.php">Strona Główna</a> | <a href="arena.php">Spróbuj ponownie!</a>';
  57. }
  58. ?>

Chociaż do teraz nie rozumiem po co wam zwykły kod połączenia z bazą... przecież to zielony wie jak sie pisze...


Cytat(kamilos809 @ 17.07.2014, 22:35:46 ) *
no już prościej nie umiem.
System jest na refleks. Musisz pokonać przeciwnika, którym jest system. Jednak on dobiera stosownie do Twojego poziomu tych przeciwników. Każdy taki przeciwnik bije Cię czy jakby to tam nazwać, co jakąś liczbę sekund z jakąś siłą, a Tobie ucieka życie z każdym uderzeniem np. z siłą -5 pkt życia. Cały system mi śmiga, tylko chcę dodać opcję, żeby kiedy się Tobie skończy życie, przekierowało do stosownej podstrony podsumowującej, że przegrałeś. Z wygraną sobie poradziłem, bo przy przesyłaniu czynności on sobie uaktualnia dane.


<--- SmokAnalog, jeżeli to jest słabe wyjaśnienie to już nie wiem jak Ci mam wytłumaczyć lepiej. Cała struktura opisana, nic więcej tam nie ma. Będzie jak rozwiążę ten problem.


//Edit

Gdyby ktoś nie wiedział, to jest plik przytoczony w getData wink.gif
Pyton_000
W php dodaj warunek jeżeli energia <= 0 to echo 0;
w js sprawdzaj respondText czy == 0 jeżeli tak widnow.location.href='google.p'
trueblue
W odpowiedzi ajax zmień na to o czym pisał SmokAnalog i dodatkowo:
  1. if (object.readyState == 4 && object.status == 200) {
  2. var val=parseInt(object.responseText);
  3. if(val>0){
  4. obj.innerHTML= val;
  5. setTimeout(odswiezaj2, 2000);
  6. }
  7. }
kamilos809
trueblue, fajnie kombinujesz, tylko jeżeli dobrze zrozumiałem to w połączeniu SmokAnalog'a i Twojego kodu, chodzi o zczytanie wartości wyświetlonej w echo(PHP) a jeśli moje echo normalnie pokazuje w echu jakiś tam tekst, to warunek się nie spełnia więc trochę jeszcze nie to.


/Edit

Odwróciłem kota ogonem, zrobiłem że jeżeli val <=0 przenoś na link, else{reszta skryptu}

Dzięki chłopaki za pomoc wink.gif
Pyton_000
podałem Ci rozwiązanie
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.