Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> javascript, nie działa
nakers2
post
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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 ?
Go to the top of the page
+Quote Post
Ilware
post
Post #2





Grupa: Zarejestrowani
Postów: 248
Pomógł: 31
Dołączył: 14.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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

Ten post edytował zegarek84 30.05.2011, 23:06:09
Go to the top of the page
+Quote Post
nakers2
post
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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

Ten post edytował nakers2 31.05.2011, 10:59:46
Go to the top of the page
+Quote Post
zegarek84
post
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


w php tego nie opóźnisz a kod który Ci podałem sprawdzałem w firebugu i działa ;]
Go to the top of the page
+Quote Post
nakers2
post
Post #6





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


no działa, wyświetla mi co chwile te 3 komunikaty (IMG:style_emoticons/default/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)){


Ten post edytował nakers2 31.05.2011, 11:19:06
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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>

Go to the top of the page
+Quote Post
nakers2
post
Post #8





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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.

Ten post edytował nakers2 31.05.2011, 16:34:36
Go to the top of the page
+Quote Post
zegarek84
post
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nakers2
post
Post #10





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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

Ten post edytował nakers2 31.05.2011, 17:48:13
Go to the top of the page
+Quote Post
zegarek84
post
Post #11





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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"...
Go to the top of the page
+Quote Post
nakers2
post
Post #12





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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>

Ten post edytował nakers2 1.06.2011, 14:06:40
Go to the top of the page
+Quote Post
zegarek84
post
Post #13





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nakers2
post
Post #14





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 2.05.2011

Ostrzeżenie: (30%)
XX---


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ść ^^
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 04:51