【问题标题】:Stopping while waiting for user input在等待用户输入时停止
【发布时间】:2013-05-18 18:28:16
【问题描述】:

我正在制作游戏。在游戏中,玩家和敌人都存储在物体内。 每个对象都有如下属性:

$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 中。

否则我该怎么做?

【问题讨论】:

  • 您是否希望每次发生某些事情时都调用服务器?为什么不使用客户端上的事件来 ajax 服务端呢?
  • 您只能从数据库中获取信息(其中涉及 php) - 使用 js 进行游戏,例如这里:html5rocks.com/en/tutorials/canvas/notearsgame 是一个很好的教程
  • 有一些很好的理由将游戏逻辑放在服务器上,例如防止作弊,以及在多人游戏中简化同步。
  • 这会是一个很好的解决方案吗,如果每次用户进行操作时,我都会将 php 对象从数据库转换为 javascript,使用 javascript 执行该操作,然后将它们转换回 php并将它们保存在服务器上?

标签: php javascript jquery ajax


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    要检测玩家回合的结束,请将事件处理程序绑定到按钮。在此处理程序中,通过 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)可能会让你的生活更轻松

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • PHP 的 sleep 将无法在用户单击浏览器中的按钮之前进入睡眠状态
      • ...正是我想要的。虽然它没有回答最初的问题,但对我来说很有价值,谢谢:-)
      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2015-11-30
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多