为所有用户

时间:2015-09-19 23:28:46

标签: php mysql

我知道有这样一个标题有几个问题,但到目前为止似乎都没有帮助我。

我正在jQuery / Ajax / PHP中制作一个浏览器游戏,我想创建一个具有循环特定寻路的NPC(例如,5个向下,5个向右,5个向上和5个向左)。但是任何连接的玩家都应该随时在当前位置看到这个NPC,这就是为什么我需要将NPC的当前X和Y位置存储在数据库中。 NPC每秒都会迈出一步。

我试过这样的事情:

index.php:

function loopNPC(){

    $(document).load('getNPC.php', function(npc){
        $('.npc').remove();       // I remove the NPC's image with previous position
        $('.map').append(npc);    // I add the new one
    });

}

setInterval(loopNPC, 1000);

在getNPC.php文件中,我有类似的东西:

<?php
/* Here I have a string like this : "dddddrrrrruuuuulllll" where "d" : down,
"r" : right, etc. And I check the characters of this string one after
another every second this script is called in index.php */   

// I store the new NPC position in the database :

$newNPC = $db->prepare('update npc set x = :x, y = :y, map = :map where id = :id');
$newNPC->execute(array(
        'x' => $posX,
        'y' => $posY,
        'map' => $map,
        'id' => $row['id']
        ));

// and here I just "echo" the image of the NPC with its new X and Y positions, 
// which I append to $('.map') in the index.php code

当我是唯一连接的播放器时,它工作正常,但我尝试在另一个浏览器上创建并连接另一个播放器以模拟同时连接到游戏的两个会话,现在NPC移动速度快两倍(不是1步/秒) ,但2)只是因为第二个会话也每秒调用这个PHP脚本。

有没有办法在连接新的播放器/会话时每秒对数据库进行一次“更新”SQL查询而不会重复?就像一个每秒都会运行的脚本,无论连接用户的数量是多少?

我听说过cron的工作,但我不确定那是我在找什么

谢谢

1 个答案:

答案 0 :(得分:2)

您尝试做的事情对于PHP的请求/响应方式不起作用。

您应该考虑其他选项,要么在服务器端运行PHP CLI应用程序,要么使用NodeJS等“游戏服务器”的其他选项,还要考虑用于通信的websockets而不是普通的GET / POST请求。 / p>

Websockets允许您在客户端和服务器之间进行持续的通信,然后实际的服务器端应用程序将允许您保持这些通信并对其进行操作。