1

我在做游戏。在游戏中,玩家和敌人都存储在对象中。每个对象都具有以下属性:

$player->health
$player->attack  (this is a value, as in attack power)

然后是处理战斗的 php 函数:

function fight($player, $enemy) {...}

它使用 和 之类attack($player, $enemy)的函数castSpell($player,$enemy)

现在,问题来了:游戏在回合制上运行,玩家和敌人各有各的回合。我想要的是每次轮到玩家时,脚本都会等到用户点击,然后根据按下的按钮调用一个函数。

我正在考虑使用 Javascript setTimeout,然后在用户单击时停止它,但是因为我使用的所有对象和函数都在 php.ini 中。

否则我该怎么做?

4

3 回答 3

3

您不能在 PHP 脚本中间等待用户输入:PHP 脚本运行,生成输出(通常是 HTML 页面),然后退出。然后将输出发送到用户的浏览器,在那里他们可以阅读并与之交互。

您描述的交互将需要使用 AJAX,以便呈现初始页面并将其发送到浏览器,然后onclickJS 中的处理程序或类似的处理程序将导致对 PHP 脚本的额外调用,该脚本根据单击的事件计算出应该发生的事情. 您将需要$_SESSION在各种 PHP 调用之间持久化您的对象,例如使用 。

所有 AJAX 真正的意思是 PHP 脚本返回一小段数据,而不是整个页面。因此,单击“施放治疗法术”可能会请求“/ajax_fight_action.php?player=1&action=cast_spell&spell_name=healing”,这将返回 ( echo) 一个 XML 或 JSON 字符串,让您的 JS 知道玩家的新健康状况。

于 2013-05-18T18:49:24.630 回答
1

要检测玩家回合的结束,请将事件处理程序绑定到按钮。在此处理程序中,通过 ajax 将轮次详细信息发送到服务器。服务器会做它的事情,然后返回它需要的任何东西。然后,“成功”方法需要相应地更新页面并触发下一轮的开始,重复该过程。

您最终可能会得到这样的 javascript(使用 JQuery 作为跨浏览器事件处理,而 ajax 怪癖可能有点像噩梦)。

$('.button').click(function()) {
  // here do what ever is appropriate to disable the buttons, so the player to wait until the game is ready for his next turn

  $.ajax({ 
    url: serverUrl,
    type: 'post',
    data: $(this).attr('id'), // assumes the id of each button is the name of the action
    success: function(result) {
       // update the client based on the data returned by the server (result)

       // do whatever the game requires to start the next turn (e.g. re-enabling the buttons)
    }
  });
});

PHP 可能不是最好的服务器端语言,因为它引发了许多问题,因为脚本只能在请求的生命周期内(即一个回合)存活。您需要弄清楚如何在服务器上从一回合到下一回合保留状态。对于单人游戏,您可能可以将其全部塞入会话变量中,但对于多人(或多会话)游戏,您可能会发现自己走上了数据库路线。让你的脚本寿命更长的语言(例如 python)可能会让你的生活更轻松

于 2013-05-18T18:58:09.367 回答
-1

使用 php 的 sleep 函数将停止脚本指定时间,例如 sleep(4) 将停止脚本 4 秒

于 2013-05-18T18:33:11.150 回答