我有一个普遍的问题,而不是一些代码。所以我只想要一个通用的方法。
在我的游戏中,我有一些基于时间的事件,例如常见的应用程序,例如Clash of Clans。用户可以选择提高角色的技能。假设角色“John”的攻击等级为1.要达到2的下一个等级,需要1天进行训练。
现在我的问题是,我怎样才能做到这一点。我不想通过简单的倒计时来处理这个客户端,因为风险太高,以至于他无法操纵计时器。我想将它存储在网上某个地方,客户端正在向服务器请求剩余的时间。
最好的方法是什么?
修改
我遇到的问题是,如果约翰开始接受培训,就必须在客户端进行倒计时。但这次倒计时不应该得到客户的剩余时间。应用程序应该从服务器获取时间。
有了这个事实,这并不是很困难,因为我只需要向服务器发出请求,获取触发事件的时间,并使用now()计算剩余时间。
但我也想建立一个实时数据库。例如,用户“Marc”可以访问John的个人资料。如果时间已经过去,John的个人资料中应该有2级。但是如果John没有登录,则没有对服务器的请求,因此它不会更新级别。
所以主要的问题是,一方面,如果用户通过简单地发布帖子请求并更新过去的训练来登录,我就可以更新数据库记录。但是如果John没有登录并且Marc想要在他的个人资料中看到他的等级,那么就没有帖子请求而且它显示的是1级而不是2级。
答案 0 :(得分:2)
假设您的意思是日历时间,有多种方式。最重要的组件是存储状态变化发生的时间。不要将其存储为" 1天",将其存储为特定的日期和时间。
然后,你基本上有三种选择。
首先是将时间构建到应用程序的逻辑中。将2级时间设置为1级时间加1天。然后使用now()
确定级别。这具有逻辑可能变得复杂的缺点。但是对于一个简单的例子,例如你的问题,它可能是正确的选择。
第二种方法是为每个状态更改生成一个事件,并在适当的时间安排它。当事情以悠闲的步伐进行时,这种方法很有效,但是规模确实很差。必须处理管理事件和其他性能查询是一项挑战。
第三种方法是计划作业,例如每小时运行一次。这可以一举做出所有必要的状态变化。
答案 1 :(得分:1)
这不是您的问题的答案。但我认为我的应用程序有一个用例。
用户级别是公开访问的属性。用户无法编辑级别的值,因为它是由服务器决定的。因此,无论何时向用户配置文件发出请求(无论用户是否登录),您都可以使用now()和存储在数据库中的该用户配置文件的startTime来检查级别。这将使得能够获得用户的当前更新级别。
为了使它有点简单,您可以在数据库中存储endTime而不是startTime。 endTime将存储升级级别的时间。
让我们说,我在x级。要达到x + 1级别,在进行级别升级请求后需要24小时。
将endTime存储为调用请求的时间总和+级别升级所用的时间。稍后您可以简单地检查now()> = endTime。
用例:
现在,考虑一个例子。我是一个用户,我发起了升级请求,我从应用程序注销。现在,无论谁访问我的个人资料,都会在当时看到我当前的更新级别。这解决了。 但是,如果在游戏中执行的动作(例如淘金)的速度取决于用户的等级呢?在这种情况下,假设我未在接下来的2天登录。但由于我的水平应该已经升级,因此在水平升级的瞬间,黄金开采速度应该变为两倍。
要处理这种情况,必须有一个服务器端脚本来处理用户进行基于时间的级别升级的活动。
您可以实现一个cron job,它可以在后台处理数据库的更新。
答案 2 :(得分:0)
正如戈登先前所说:
首先是将时间构建到应用程序的逻辑中。将2级时间设置为1级时间加1天。然后使用now()确定级别。这具有逻辑可能变得复杂的缺点。但是对于一个简单的例子,例如你的问题,它可能是正确的选择。
他的第一个选择可能是正确的实施选择,并具有高性能因素。如果正确实施,它应该可以很好地扩展。
解决您的疑虑:
所以主要的问题是,一方面,如果用户通过简单地发布帖子请求并更新已完成的培训来登录,我就可以更新数据库记录。但是如果John没有登录并且Marc想要在他的个人资料中看到他的等级,那么就没有帖子请求而且它显示的是1级而不是2级。
您只需将业务逻辑添加到业务逻辑层中,只要有人查询John的配置文件,就会执行该逻辑层。业务逻辑可以简单地评估下一级别的剩余时间,并在必要时显示更正的值。该逻辑还可能更新John的记录,表明他已达到下一级别。