2014-03-29 109 views
2

我有一個錯誤,當我試圖顯示計算機的擲骰子在我的迷你遊戲中滾動時,顯示的每個滾動之間有一個延遲。PHP - 在while循環中運行函數之前有延遲

$roll = rand(2, 7); 
while($roll > 0){ 
    //shows dice 
    showDice($cDi1, $cDi2); 
    sleep(2); 
    $roll = $roll - 1; 
    $cDi1 = rand(1, 6); 
    $cDi2 = rand(1, 6); 
} 

當我運行的是,它會暫停頁2秒鐘,然後一下子運行showDice功能,沒有延遲在兩者之間。

有什麼辦法可以解決這個問題嗎?

+2

當您在控制檯,而不是瀏覽器中運行,會發生什麼?它是否按預期工作? – Drahcir

+1

showDice函數做了什麼? – jornane

回答

1

您遇到的問題是PHP代碼在請求頁面時在服務器上執行..
因此,在將HTML發送到用戶瀏覽器之前,sleep()函數會導致暫停。
這有道理嗎?

要使頁面以增量輸出您的值,您需要使用客戶端腳本
(如JavaScript)。

你可以做這樣的事情..

<?php 

$roll=rand(1, 6); 
$time=0; 

echo'<script>'; 

for($i=0;$i<$roll;$i++){ 
    echo' 
    setTimeout(function(){document.write("<div>'.rand(1,6).' & '.rand(1,6).'</div><br/>")},'.$time.');'; 
    $time+=2000;} 

echo ' 
</script>'; 

?> 

(中回聲命令換行符幫助你輸出的JavaScript是從源讀取)
如果$輥= 3 /看起來會這樣

<script> 
    setTimeout(function(){document.write("<div>3 & 4</div><br/>")},0); 
    setTimeout(function(){document.write("<div>1 & 2</div><br/>")},2000); 
    setTimeout(function(){document.write("<div>4 & 1</div><br/>")},4000); 
</script> 

但是如果你要記住你的骰子值,你需要將它們放在一個數組..

for($i=0;$i<$roll;$i++){ 
    $dice[$i]=array(rand(1,6),rand(1,6)); 
    echo' 
    setTimeout(function(){document.write("<div>'.$dice[$i][0].' & '.$dice[$i][1].'</div><br/>")},'.$time.');'; 
    $time+=2000;} 
0

你也可以這樣做..
這樣你就可以完成頁面的結構,然後將'骰子滾動'信息直接放在你想要的地方,按時間遞增。
(這有明顯的好處)

<html> 
<head> 

//function places dice roll values into already created divs 
<script> 
    function showDice(dice,rollNumber){ 
     setTimeout(function(){document.getElementById("roll"+rollNumber).innerHTML=dice[0] + " & " + dice[1]},rollNumber*2000);} 
</script> 

</head> 
<body> 

<?php 

//create random number of dice rolls 
$roll=rand(1, 6); 

//tell user how many rolls will be made 
echo '<div>'.$roll; 
if($roll==1) echo ' roll'; 
else echo ' rolls'; 
echo ' of the dice</div><br/> 
'; 

//create dice roll values and pre create the divs that the dice rolls will be shown in 
for($i=0;$i<$roll;$i++){ 
    $diceroll[$i]=array(rand(1,6),rand(1,6)); 
    echo '<div id="roll'.$i.'"></div> 
';} 

?> 

</body> 
</html> 

<script> 

<?php 

//store dice roll values in a javascript array 
echo 'var diceRoll=new Array() 
    '; 
for($i=0;$i<$roll;$i++){ 
    echo 'diceRoll['.$i.']=new Array('.$diceroll[$i][0].','.$diceroll[$i][1].') 
    ';} 

?> 

//call function to place values into divs for each roll 
for (var i=0;i<diceRoll.length;i++){ 
    showDice(diceRoll[i],i);} 

</script>