Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: javascript, nie działa
Forum PHP.pl > Forum > Po stronie przeglądarki
nakers2
Mam system walki w grze, niestety wygląda to fatalnie. Gdy u gracza uruchamia się walka, od razu wyświetla wszystkie kolejki (ile on zadał dmg mobowi i ile mob mu), dzieje się to od razu.

Nie chodzi mi np. o to by co określoną liczbę sekund ładował się element z pętli odpowiadający za obliczenie wywieranego dmg na mobie - Tylko po prostu żeby co określony czas np. pół sekundy wyświetlało się echo z informacją o tym ile gracz zadał DMG mobowi / mob graczowi.
W skrócie: ma to działać po stronie przeglądarki, nie serwera... samo odkrywanie "echo"... dla samego efektu.

Edit, mam już to:

Kod
<script type="text/javascript">
function display() {
document.getElementById("graczatak").innerHTML += "";
}
window.setInterval(display, 1000);</script>
</script>


i potem w kodzie mma tak:

echo "<div id='graczatak'>&nbsp;+ Zadałeś przeciwnikowi <font color = '#7ffa88'>".$dam."</i></font> DMG<br></div>";

niestety nie pojawia mi się te echo w odstępach czasowych mimo poprawności kodu,
dodam że te echo jest w pętli while, to może być tego przyczyną ?

cały kod wygląda tak:

Kod
$bonus = floor($oGracz['atak'] / $potwor['obrona']);
if($bonus > 2) $bonus = 2;
$oGracz['omin'] = floor($oGracz['omin'] * $bonus);
$oGracz['omax'] = floor($oGracz['omax'] * $bonus);
$bonus = floor($potwor['atak'] / $oGracz['obrona']);
if($bonus > 2) $bonus = 2;
$potwor['omin'] = floor($potwor['omin'] * $bonus);
$potwor['omax'] = floor($potwor['omax'] * $bonus);
while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){
    $czas ++;    
    $dam =rand($oGracz['omin'],$oGracz['omax']) - $potwor['absorpcja'];
    if($dam < 1) $dam = 1;
    $potwor['zycie'] -=$dam;
    echo "<div id='graczatak'>&nbsp;+ Zadałeś przeciwnikowi <font color = '#7ffa88'>".$dam."</i></font> DMG<br></div>";


co w tym powoduje to że nie wyświetla danego echa w odstępach czasowych ?
Ilware
java scrip działa po stronie przeglądarki i dostaje już w całości dokument, od razu cały, ten kod co napisałeś nie może działać poprawnie.Chyba że ja się mylę. Użyj do tego Ajaxa powinno działać wtedy poprawnie
zegarek84
zmień sobie widok wyświetlanych walk albo na regularną strukturę gdzie mógłbyś to wyciąć z HTML'a i wstawiać po kolei - od razu wyświetlone w html'u jakby ktoś miał js wyłączony... albo dane komunikaty walki po stronie php wyświetl np. do tablicy i potem przez js to wstaw... - taki przykład na bazie Twojego kodzika:
[JAVASCRIPT] pobierz, plaintext
  1. var aKomunikaty = [
  2. 'komunikat pierwszy<br/>',
  3. 'komunikat drugi<br/>',
  4. 'komunikat trzeci'
  5. ];
  6. var i = 0, iL = aKomunikaty.length;
  7. var interval;
  8. function display() {
  9. if(i<iL) document.getElementById("graczatak").innerHTML += aKomunikaty[i++];
  10. if(i===iL) clearInterval(interval);
  11. };
  12. interval = setInterval(display, 1000);
[JAVASCRIPT] pobierz, plaintext


// edit - tu nie jest potrzebny żaden ajax skoro wyniki mogą być od razu a chodzi tylko o kosmetykę wyświetlanych wyników...

ogólnie w php trzymajmy się tego, że nie można "streamować" odpowiedzi - jest na to sposób ale szkoda o nim wspominać choćby ze względu na strukturę html - chyba, że zdarzenia onload i inne wywołują się zaraz po zamknięciu taga html a nie po zamknięciu połączenia - tego nie sprawdzałem - gdyż w tym wypadku można by fajnie streamować wywoływanie funkcji w js dodając za samym html'em
nakers2
to co mi dałeś w ogóle nie działa, jest identyczne jak tamto co napisałem na początku

Cytat
zmień sobie widok wyświetlanych walk albo na regularną strukturę gdzie mógłbyś to wyciąć z HTML'a i wstawiać po kolei


jak mam to zrobić? przecież wyświetlanie obrażeń - mob/gracz działa na bazie tej pętli (do póki ta pętla zostanie spełniona):

Cytat
while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){


i chodzi mi właśnie by w pewnym sensie wyświetlanie tego co jest w tej pętli opóźniać
a nie osobnych elementów, nie wyobrażam sobie tego
zegarek84
w php tego nie opóźnisz a kod który Ci podałem sprawdzałem w firebugu i działa ;]
nakers2
no działa, wyświetla mi co chwile te 3 komunikaty sleep.gif

co do tego tworzenia tablic i pobierania, jak mam to zrobić w oparciu o tą pętle?
Cytat
while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){
zegarek84
nie powinno się danych wyświetlać od razu a powinno się buforować jeśli jest potrzeba do zmiennych lub tablic i potem wyświetlić... ale jeśli już od razu chcesz to wyświetlić to mniej więcej do js tak [można i tak jak robisz do html'a ale nie znam struktury kontenera obejmującego]:
Kod
<?php
$aKomunikat = array();
while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){
    $czas ++;    
    $dam =rand($oGracz['omin'],$oGracz['omax']) - $potwor['absorpcja'];
    if($dam < 1) $dam = 1;
    $potwor['zycie'] -=$dam;
    $aKomunikat[] = "\"<div id='graczatak'>&nbsp;+ Zadałeś przeciwnikowi <font color = '#7ffa88'>".$dam."</i></font> DMG<br></div>\"";
// DODAŁEM JESZCZE CYCTATY W WYŚWIETLANYM KODZIE HTML - ZOSTANIE WYŚWIETLONY PÓŹNIEJ
}
?>
<script type="text/javascript">
    var aKomunikaty = [
        <?php echo implode(',', $aKomunikat);?>
    ];
    var i = 0, iL = aKomunikaty.length;
    var interval;
    function display() {
    if(i<iL) document.getElementById("graczatak").innerHTML += aKomunikaty[i++];
    if(i===iL) clearInterval(interval);
    };
    interval = setInterval(display, 1000);
</script>

nakers2
dzięki ci wielkie, za kod...

Cytat
nie powinno się danych wyświetlać od razu a powinno się buforować jeśli jest potrzeba do zmiennych lub tablic i potem wyświetlić... ale jeśli już od razu chcesz to wyświetlić to mniej więcej do js tak [można i tak jak robisz do html'a ale nie znam struktury kontenera obejmującego]:


...ale możesz jaśniej, mało co z tego zrozumiałem. Moja wiedza o php kończy się na sesjach, if, while, for, operatorach no i sql/mysql / js. Dlatego też z tablicami nie wiedziałem do tej pory o co chodzi, nigdy ich nie używałem.
zegarek84
odnośnie odpowiedniej struktury html - co było by lepsze jeśli gra nie wymaga JavaScript do grywalności a sam JS jest tylko dodatkiem, to miałem na myśli np. coś w stylu:
Kod
<div id="komunikaty">
    <div class="komunikat">jakiś tam pierwszy komunikat</div>
    <div class="komunikat">drugi komunikat</div>
    <div class="komunikat">....</div>
    <div class="komunikat">enty komunikat</div>
</div>
<script type="text/javascript">
// przy odpowiedniej strukturze html'a nic nie musiałeś zmieniać tylko wystarczyło dołożyć skrypt js ukrywający wszystko a potem po kolei pokazujący komunikaty
/*
i tutaj skrypt chowający wszystkie komunikaty przed użytkownikiem (wszystkie div'y o klasie "komunikat") po czym wyświetlający po kolei te div'y - wystarczyło im na początku ustawić w js np. visibility:hidden; [dokładnie nazwy nie jestem pewien;p] po czym po kolei przełączać na visible;
*/
</script>

zaletą tego rozwiązania jest to, iż gdy użytkownik miałby wyłączony JavaScript to też zobaczy komunikaty z walki tyle, że od razu...
nakers2
aha rozumiem, ale chce by było jednak obowiązkowe JS bo i tak gracz nawet jak by miał wyłączone JS dostanie potem raport o tym że odbyła się walka z częściowym jej opisem

aha i ten kod nie działa jednak, nic się nie pojawia

Kod
<?php
$aKomunikat = array();
while(($oGracz['zycie'] > 0) && ($potwor['zycie'] > 0)){
    $czas ++;    
    $dam =rand($oGracz['omin'],$oGracz['omax']) - $potwor['absorpcja'];
    if($dam < 1) $dam = 1;
    $potwor['zycie'] -=$dam;
    $aKomunikat[] = "\"<div id='graczatak'>&nbsp;+ Zadałeś przeciwnikowi <font color = '#7ffa88'>".$dam."</i></font> DMG<br></div>\"";
// DODAŁEM JESZCZE CYCTATY W WYŚWIETLANYM KODZIE HTML - ZOSTANIE WYŚWIETLONY PÓŹNIEJ
}
?>
<script type="text/javascript">
    var aKomunikaty = [
        <?php echo implode(',', $aKomunikat);?>
    ];
    var i = 0, iL = aKomunikaty.length;
    var interval;
    function display() {
    if(i<iL) document.getElementById("graczatak").innerHTML += aKomunikaty[i++];
    if(i===iL) clearInterval(interval);
    };
    interval = setInterval(display, 1000);
</script>


to w ogóle nie działa
zegarek84
podaj kod html generowany wraz z objętym kontenerem na komunikaty i komunikaty - w wolnym czasie napiszę Ci skrypt js i napiszę gdzie dokładnie go wkleić - nie bardzo wiem gdzie wyświetla Ci się poprzedni skrypt i gdzie to wszystko wkleja - ale rozwiązanie jest takie jak podałem - chyba, że div o id "graczatak" jest tym do którego jest wklejany kod javascript - ten kod powinien znaleźć się na zewnątrz niżej niż ten div z id "graczatak"...
nakers2
html wygenerowało to (czyli błąd):

<script type="text/javascript">
var aKomunikaty = [
<br />
<b>Warning</b>: implode() [<a href='http://www.php.net/manual/pl/function.implode'>function.implode</a>]: Invalid arguments passed in <b>D:\Programowanie\PHP\gra\walka.php</b> on line <b>4</b><br />
];
var i = 0, iL = aKomunikaty.length;
var interval;
function display() {
if(i<iL) document.getElementById("graczatak").innerHTML += aKomunikaty[i++];
if(i===iL) clearInterval(interval);
};
interval = setInterval(display, 1000);
</script>
zegarek84
po pierwsze to czemu dopiero w czwartej linii - a gdzie reszta kodu php??... po drugie miałeś podać strukturę kodu wygenerowanego html jak wyświetlałeś wszystkie te komunikaty na raz - ja Ci teraz miałem dać gotowy skrypt javascript i napisać w którym miejscu go zamieścić - ale chyba jednak się nie dogadamy...
nakers2
Cytat
po pierwsze to czemu dopiero w czwartej linii - a gdzie reszta kodu php??... po drugie miałeś podać strukturę kodu wygenerowanego html jak wyświetlałeś wszystkie te komunikaty na raz


po prostu, nie mogę poskładać tego w logiczną całość ^^
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.