Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Opóźnienie wykonania skryptu
Forum PHP.pl > Forum > Przedszkole
Razzly100
Witam,

trapie się nad pewną sprawa.

Otóż programuje małą grę przeglądarkową. W języku ajax wyświetla walke między graczem a jakimś tam stworem. Wszystko jest ok tylko że wpis do bazy (czy przeżył gracz czy potworek) jest już przed zakonczeniem tejże walki przez co gracz moze zacząć taką walke i od razu z niej wyjsc a i tak walka będzie zaliczona.

W jaki sposób opóźnić działanie skryptu aż do momentu kiedy skrypt ajax wyswietli wygraną bądź przegraną gracza.

markonix
Sam sobie odpowiedziałeś, ajaxem aktualizuj wpis i zabezpiecz go dodatkowo sesją po stronie serwera (czas rozpoczęcia walki time)
Razzly100
Nie bardzo rozumiem o co Ci chodzi.

W moim przypadku teksty wyswietlane przez ajaxa są 'dekoracja' bo skrypt php z góry zapisuje dane. Po prostu chce zeby dane zostaly zapisane wraz z zakonczeniem sie skryptu 'dekoracyjnego' ajaxa
markonix
To zmień jego funkcje wyłącznie z dekoracyjnej na funkcjonalną.

Chyba, że mylisz pojęcia bo to, że jakieś obrazki tam się zmieniają to wcale nie musi być ajax.
CuteOne
- rozpoczęcie walki - wysyłasz żądanie do PHP aby zapisał ową walkę(zmiany HP, itp.) do tabeli tymczasowej lub sessji ze statusem walki = 0
- na koniec walki - wysyłasz żądanie do PHP aby zapisał zmiany w prawdziwej tabeli jeżeli status walki w tabeli tymczasowej = 0

Jeżeli ktoś zakończy walkę przed czasem walka nie zostanie zapisana

ps. możesz również wysyłać ajaxa podczas samej walki aby na bierząco zapisywać stan walki np. w sesji a dopiero pod koniec zapis do bazy
markonix
Po co bazę mieszać skoro i tak sesja jest już w ruchu.

Wystarczy ten wynik zamiast do bazy zapisywać do sesji - dzięki temu jeżeli ktoś opuści grę nie musimy się martwić o śmieci w postaci walk ze statusem 0.
Do sesji zapisujemy tylko ten time dla pewności i jak dla mnie na tyle wystarczy i jest bezpiecznie.
CuteOne
Właśnie nie jest smile.gif co jak ktoś zaatakuje potworka i jest bliski przegranej - odświeża stronę i walka nigdy nie miała miejsca. Tak przy kolejnej akcji nieuczciwego gracza dane, które były gromadzone w trakcie walki (obniżenie HP do 0 itp) zostają zapisane do tabeli gracza.
markonix
To już też troszkę zależy od koncepcji samej gry.
Może tu chodzi tylko o animacje, a nie widok konkretnej walki, skoro i tak jest z góry ustalona.
Można też JSem wykryć przerwanie walki, dzięki temu zareagować i dodać np. ucieczki to jest dosyć popularną koncepcją.
Autor tematu niech się wysili i poda więcej danych.
Razzly100
Aktualnie wyglada to tak:

Na początku walki pobiera dane oraz wyswietla je

  1. $bonus = floor($oGracz['atak'] / $potwor['obrona']);
  2. if($bonus > 2) $bonus = 2;
  3. $oGracz['omin'] = floor($oGracz['omin'] * $bonus);
  4. $oGracz['omax'] = floor($oGracz['omax'] * $bonus);
  5.  
  6. $bonus = floor($potwor['atak'] / $oGracz['obrona']);
  7. if($bonus > 2) $bonus = 2;
  8. $potwor['omin'] = floor($potwor['omin'] * $bonus);
  9. $potwor['omax'] = floor($potwor['omax'] * $bonus);
  10.  
  11. $max = floor($oGracz['zycie'] / $oGracz['zycie_max'] * 100);
  12. $tekst ="
  13.  
  14. <table style='text-align:center'>
  15. <tr>
  16. <td></td>
  17. <td>".$oGracz['login']."</td>
  18. <td>".$potwor['nazwa']."</td>
  19. </tr>
  20. <tr>
  21. <td></td>
  22. <td align='center'><img src='".$av."' alt='' style='max-width:60px; max-height:60px;'/></td>
  23. <td align='center'><div id='potwor".$potwor['potwor']."' style='width:60px; height:60px;'></div></td>
  24. </tr>
  25. <tr>
  26. <td></td>
  27. <td>
  28. <div style='background:#000; height:20px; width:100px; border: solid 1px #ff0000;'>
  29. <div id='life1' style='background:#ff0000; height:20px; width:".$max."px;'>
  30. </div>
  31. </div>
  32. </td>
  33. <td>
  34. <div style='background:#000; height:20px; width:100px; border: solid 1px #ff0000;'>
  35. <div id='life2' style='background:#ff0000; height:20px; width:100px;'>
  36. </div>
  37. </div>
  38. </td>
  39. </tr>
  40. <tr>
  41. <td><img src='www/atak.png' alt=''/></td>
  42. <td>".$oGracz['atak']."</td>
  43. <td>".$potwor['atak']."</td>
  44. </tr>
  45. <tr>
  46. <td><img src='www/obrona.png' alt=''/></td>
  47. <td>".$oGracz['obrona']."</td>
  48. <td>".$potwor['obrona']."</td>
  49. </tr>
  50. <tr>
  51. <td><img src='www/abs.png' alt=''/></td>
  52. <td>".$oGracz['absorpcja']."</td>
  53. <td>".$potwor['absorpcja']."</td>
  54. </tr>
  55. <tr>
  56. <td><img src='www/obr.png' alt=''/></td>
  57. <td>".$oGracz['omin']." - ".$oGracz['omax']."</td>
  58. <td>".$potwor['omin']." - ".$potwor['omax']."</td>
  59. </tr>
  60.  
  61. </table>
  62.  


Tak wygląda kod który widzi potem gracz

  1. <div id='walka_tekst' style='height:180px; width:500px; padding:5px; overflow:auto;'>Walka rozpoczęta...<br/></div>
  2. <script type='text/javascript'>
  3. var id = 0;
  4. function walcz(){
  5. var info = document.getElementById('walka_tekst');
  6. id = id + 1;
  7. if(typ[id] != undefined){
  8. if(typ[id] == 1){
  9. info.innerHTML = info.innerHTML + '<br/>' + teksty[id] ;
  10. if(kto[id] == 1){
  11. $('#life2').animate({
  12. width: '-='+wartosci[id]
  13. }, 1000, function() {}
  14. );
  15. } else {
  16. $('#life1').animate({
  17. width: '-='+wartosci[id]
  18. }, 1000, function() {}
  19. );
  20. }
  21. } else {
  22. info.innerHTML = info.innerHTML + '<br/>' + teksty[id] ;
  23. }
  24.  
  25. }
  26. if(typ[id+1]) {
  27. var t=setTimeout('walcz()',1500);
  28. }
  29. }
  30. var teksty=new Array();
  31. var obrazenia=new Array();
  32. var wartosci=new Array();
  33. var kto=new Array();
  34. var typ=new Array();
  35.  
  36. ";
  37.  
  38. $id = 0;
  39. while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){
  40. $id++;
  41. $dam =rand($oGracz['omin'],$oGracz['omax']) - $potwor['absorpcja'];
  42. if($dam < 1) $dam = 1;
  43. $potwor['zycie'] -=$dam;
  44.  
  45. $wartosc = round($dam/$potwor['zycie_max'] * 100);
  46. if($wartosc < 1) $wartosc = 1;
  47.  
  48. $tekst .= "
  49. teksty[".$id."] = '<b>".$oGracz['login']."</b> uderza i zadaje ".$dam." obrażeń';
  50. obrazenia[".$id."] = ".$dam.";
  51. kto[".$id."] = 1;
  52. typ[".$id."] = 1;
  53. wartosci[".$id."] = ".$wartosc.";
  54. ";
  55. if($potwor['zycie'] < 1){
  56. $oGracz['exp'] += $potwor['exp'];
  57. $oGracz['zloto'] += $potwor['zloto'];
  58. mysql_query("update gracze set zycie = ".$oGracz['zycie'].", zloto = zloto + ".$potwor['zloto'].", exp = exp + ".$potwor['exp'].", exp_suma = exp_suma + ".$potwor['exp']." where gracz = ".$oGracz['gracz']);
  59.  
  60. mysql_query("update potwory_mapa set status = 1 where mapa_id = ".$oGracz['mapa_id']." and x = ".$oGracz['x']." and y = ".$oGracz['y']." limit 1");
  61.  
  62. $id++;
  63. $tekst .= "
  64.  
  65. teksty[".$id."] = '<br/><b>Przeciwnik pada martwy! Wygrywasz!</b><br> Zdobywasz ".$potwor['exp']." doświadczenia i ".$potwor['zloto']." złota';
  66. obrazenia[".$id."] = 0;
  67. kto[".$id."] = 1;
  68. typ[".$id."] = 2;
  69. wartosci[".$id."] = 0;
  70. ";
  71.  
  72. mysql_query("insert into walki(gracz_id, potwor_id, data) value (".$oGracz['gracz'].",".$potwor['potwor'].", ".time().")");
  73.  
  74. $rand = rand(1,100);
  75. $item = mysql_fetch_array(mysql_query("select * from potwory_drop inner join przedmioty on przedmiot_id = przedmiot where potwor_id = ".$potwor['potwor']." and szansa < ".$rand));
  76. if(!empty($item)){
  77.  
  78. $id++;
  79. $tekst .= "
  80.  
  81. teksty[".$id."] = '<br/><br>Miałeś szczęście, po walce znalazłeś ".$item['nazwa']."';
  82. obrazenia[".$id."] = 0;
  83. kto[".$id."] = 1;
  84. typ[".$id."] = 2;
  85. wartosci[".$id."] = 0;
  86. ";
  87.  
  88. mysql_query("insert into przedmioty_gracze(gracz_id, przedmiot_id) value (".$oGracz['gracz'].",".$item['przedmiot'].")");
  89. }
  90.  
  91. $rand = rand(1,100);
  92. $rand -= $oGracz['lvl'];
  93. $cena = 1000 + $oGracz['lvl'] * 100;
  94. if($rand < 30) {
  95. $przedmiot = mysql_fetch_array(mysql_query("select * from przedmioty where losowy = 0 and typ < 8 and cenax < ".$cena." order by rand() limit 1"));
  96.  
  97. if(!empty($przedmiot)){
  98. $r = rand(1,100);
  99. $r -= $oGracz['lvl'];
  100.  
  101. if($r < 10){
  102.  
  103. $r = rand(1,(1 + $oGracz['lvl']));
  104. if($przedmiot['omin'] >0) $przedmiot['omin'] += $r ;
  105. if($przedmiot['omax'] >0) $przedmiot['omax'] += $r ;
  106.  
  107. $r = rand(0,4);
  108. $przedmiot['lvl'] += $r ;
  109.  
  110. $r = rand(0,4);
  111. if($przedmiot['absorpcja'] >0) $przedmiot['absorpcja'] += $r ;
  112.  
  113. $r = rand(5,(5 + $oGracz['lvl']*2));
  114. if($przedmiot['atak'] >0) $przedmiot['atak'] += $r ;
  115.  
  116. $r = rand(5,(5 + $oGracz['lvl']*2));
  117. if($przedmiot['obrona'] >0) $przedmiot['obrona'] += $r ;
  118.  
  119. $r = rand(9,(9 + $oGracz['lvl']*3));
  120. if($przedmiot['zycie_max'] >0) $przedmiot['zycie_max'] += $r ;
  121.  
  122. $przedmiot['cenaSp'] = $przedmiot['omin'] * 11 + $przedmiot['omax'] * 12 + $przedmiot['absorpcja'] * 15 + $przedmiot['atak'] * 5 + $przedmiot['obrona'] * 6 + $przedmiot['zycie_max'] * 2;
  123.  
  124. mysql_query("insert into przedmioty(nazwa, obrazek, atak, obrona, absorpcja, omin, omax, zycie_max, typ, lvl, losowy, cenaSP) value (
  125. 'Magiczny Przedmiot: ".$przedmiot['nazwa']."','_".$przedmiot['obrazek']."',".$przedmiot['atak'].",".$przedmiot['obrona'].",".$przedmiot['absorpcja'].",".$przedmiot['omin'].",".$przedmiot['omax'].",".$przedmiot['zycie_max'].",".$przedmiot['typ'].",".$przedmiot['lvl'].",1,".$przedmiot['cenaSp']."
  126. )");
  127.  
  128. $ids = mysql_insert_id();
  129. $tekst .= "";
  130. mysql_query("insert into przedmioty_gracze(gracz_id, przedmiot_id) value (".$oGracz['gracz'].",".$ids.")");
  131.  
  132. $id++;
  133. $tekst .= "
  134.  
  135. teksty[".$id."] = '<br/><br>Miałeś szczęście, po walce znalazłeś Magiczny Przedmiot: ".$przedmiot['nazwa']."';
  136. obrazenia[".$id."] = 0;
  137. kto[".$id."] = 1;
  138. typ[".$id."] = 2;
  139. wartosci[".$id."] = 0;
  140. ";
  141. } else {
  142. $id++;
  143. $tekst .= "
  144.  
  145. teksty[".$id."] = '<br/><br>Miałeś szczęście, po walce znalazłeś Przedmiot: ".$przedmiot['nazwa']."';
  146. obrazenia[".$id."] = 0;
  147. kto[".$id."] = 1;
  148. typ[".$id."] = 2;
  149. wartosci[".$id."] = 0;
  150. ";
  151. mysql_query("insert into przedmioty_gracze(gracz_id, przedmiot_id) value (".$oGracz['gracz'].",".$przedmiot['przedmiot'].")");
  152. }
  153.  
  154. }
  155.  
  156.  
  157.  
  158. }
  159. } else {
  160. $dam =rand($potwor['omin'],$potwor['omax']) - $oGracz['absorpcja'];
  161. if($dam < 1) $dam = 1;
  162. $oGracz['zycie']-=$dam;
  163.  
  164.  
  165. $wartosc = round($dam/$oGracz['zycie_max'] * 118);
  166. if($wartosc < 1) $wartosc = 1;
  167. $id++;
  168. $tekst .= "
  169. teksty[".$id."] = '<b>".$potwor['nazwa']."</b> uderza i zadaje ".$dam." obrażeń';
  170. obrazenia[".$id."] = ".$dam.";
  171. kto[".$id."] = 2;
  172. typ[".$id."] = 1;
  173. wartosci[".$id."] = ".$wartosc.";
  174. ";
  175. if($oGracz['zycie'] < 1){
  176. mysql_query("update gracze set zycie = 0 where gracz = ".$oGracz['gracz']);
  177. $id++;
  178. $tekst .= "
  179. teksty[".$id."] = '<br/><b>Padasz nieprzytomny! Budzisz się... ledwo wstajesz i powoli wracasz do domu opatrzyć rany...</b>';
  180. obrazenia[".$id."] = 0;
  181. kto[".$id."] = 1;
  182. typ[".$id."] = 2;
  183. wartosci[".$id."] = 0; ";
  184. }
  185. }
  186.  
  187. }
  188.  
  189. $tekst .= "var t=setTimeout('walcz()',1500); </script>";
  190. echo $tekst;
  191. $oGracz = gracz($oGracz['gracz']);


markonix
Kod JS nagle przeradza się w kod PHP... Magia...
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.