如何实时更新浏览器游戏中的属性,例如Travian游戏中的4种资源?

3
我想制作一个基于Web的游戏,类似于“Travian”(或“Ikariam”)。该游戏将基于PHP和MySQL。我想知道如何实现游戏属性的实时更新。
对于前端,我可以使用AJAX调用(从数据库获取最新值),甚至可以使用虚假的值更新(不与服务器通信)。
对于后端,这是否通过PHP定时作业完成(每几秒运行一次)?如果是这样,有人能提供给我一些示例代码吗?
顺便说一下,我知道如果我使用IIS + FastCGI将会很麻烦。
=== 版本信息 ===
PHP: 5.2.3 IIS: 6.0 with FastCGI OS: Windows Server 2003 Standard R2

2
我非常确定Travian等游戏使用所谓的“虚假更新和值”。当你加载页面时,页面中可能有两个数据:当前资源水平(x)和增长速率(y)。然后就是纯粹的JavaScript——每隔几秒钟,他们将y添加到x上。没有与服务器的检查等等。您可以通过打开两个选项卡来验证此操作。在一个选项卡中保留您的资源计数,并在另一个选项卡中进行购买。第二个选项卡中的购买不会从第一个选项卡中扣除。这种技术的明显缺点是其不准确性;优点是其简单性。 - Frank Farmer
4个回答

6

正确的答案取决于您的确切需求。

每个人是否总是以相同的速度获得资源?如果是这样,一个简单的解决方案是跟踪他们的用户存在时间,根据他们获取资源的速率计算资源量,并减去他们总共花费的资源数量。但是,如果速率可以改变,那么如果您使用此解决方案,您就基本上被困在选择的速率中,除非您完全重写处理(例如下面的处理方式)。

如果人们获得资源的速度不同,您需要定期更新数据。cronjob/计划任务可以很好地确保每个人都得到更新,但在某些情况下,直接测量自上次更新每个用户的资源已经过去了多长时间,然后通过将他们离开的时间乘以他们获得资源的速率来更新他们的资源,可能会更好 - 这样,您避免了在实际需要新值之前进行更新。


1
你还可以每次页面或JavaScript请求时计算资源。你需要存储上次更新的时间。

1

对于像Travian一样的资源管理,您需要跟踪上次更新用户资源的时间。如果您读取资源值(用于页面刷新或其他操作),则需要根据用户获取的资源字段和奖励数量添加“自上次更新时间以来获得的资源量”,并将该值发送到浏览器。您还可以让浏览器脚本计算这些金额。

您可能需要考虑以某种方式缓存所有资源金额,因为这些值非常重要,可以提高与数据库的通信效率。

如果用户完成建造资源领域、使用市场、建造结构等操作,则需要更新资源数量(和“上次更新时间”),因为您无法简单地跟踪这些事件。

通过计算资源,可以减少数据库负载,因为您不需要在用户刷新浏览器页面时每次写入新值。它也更准确,因为您有更少的舍入误差。

为了在页面刷新之间保持资源增加,您需要像Frank Farmer描述的那样采用一种方法。只需将资源金额和“增益频率”嵌入某些JavaScript中,并且每隔“增益频率”就将资源金额增加一。


0

这可能是一篇旧帖子,但它在谷歌上很容易被找到,所以这里提供另一个选项,这也是我正在开发的游戏使用的方法。

我使用客户端JavaScript,使用Flash套接字从主机上运行的专用游戏服务器获取实时更新。

我使用http://devpro.it/xmlsocket/提供的xmlsocket工具包。


该解决方案效果并不是很好,因为移动浏览器不支持Flash。而现代浏览器则支持WebSockets。 - Raptor
在回答时,仍有许多运行Windows XP的计算机,这些计算机对Web套接字的支持有限,因为XP无法在IE 8上运行,所以我才发表了这篇文章。更不用说3年前移动HTML5的支持也非常不稳定,更不用说Vista也无法运行支持它们的最低版本IE 10。 - Jacqueline Loriault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接