早上好/下午/晚上,互联网。 我目前正在开发一个wap游戏并遇到了一个问题:对其他玩家施加长期影响。让我解释一下。
如果用户使用'即时'功能,它只是执行executeAbility()
的正常命令链接;
如果用户施放咒语,则脚本执行以下操作:
setPlayerState('casting');
sleep($cast_time);
executeAbility();
但这只是一个简单的部分。现在,如果我们去一些更高级的技术,比如对玩家施加诅咒,我会迷失方向。我已经考虑过以下可能性:
$time=$_SERVER['REQUEST_TIME'];
$time_when_the_curse_finishes=$time+$curseDuration;
updateEnemyCurses($curseID,$endTime);
if ($time<$endTime) removeCurse();
这可能看起来很漂亮,但它不需要考虑两件事:如果用户注销并在2小时内重新登录,他将花费整整两个小时诅咒和这种方法不能支持效果每x秒y秒类型的curses。例如:
诅咒之一。你每2秒受到1点伤害,持续10秒。
总而言之,我只需要一两个提示,我可以如何使上面的线成为可能。诅咒本身需要全局检查其时间(而不是页面重新加载),并且能够每隔x秒完成一次查询(在这种情况下是伤害记录),直到它在10秒内被删除。
我提前感谢这里提供的任何提示!
答案 0 :(得分:5)
您可能希望研究为此类“维护”工作设置cron脚本。
它可以以固定的间隔(即每秒)运行,并为所有玩家处理诅咒等效果
从这里开始:) http://en.wikipedia.org/wiki/Cron
编辑:正如其他人提到的那样(@ mark-b),最好澄清:使用cronjob管理所有工作的单个脚本,而不是每个部分的多个cronjobs工作
答案 1 :(得分:2)
我完全理解你的问题,因为在工作中我必须处理一个需要可能对你有帮助的解决方案的功能。我所做的是设置一个db表,存储所有必需/待处理的操作和操作的所有者。该表有一个时间戳,在一定的时间间隔内,我检查了该用户需要执行哪些操作。其他用户也检查了该表并删除了未检索的过去操作(即该操作的所有者已被注销)。这里的问题是如果没有用户完全登录该怎么办,我做的是当用户登录时,它首先检查待处理的动作表并在需要时清除它。我希望我能给你一些见解。祝你好运!
答案 2 :(得分:2)
您最好在数据库中实现事件队列。您只需在数据库作业队列中添加一个条目,而不是为需要在用户或用户上完成的每个操作创建一个cron作业。
然后,一个SINGLE cron作业可以从该队列中取出作业并处理它们。因此,对于您的“诅咒”事件,您需要在用户上设置诅咒标志,并安排在now + 5 minutes
处执行的作业说“从用户Y移除诅咒X”。
cron作业会定期启动(无论你的游戏中的'tick'是什么),并请求在该特定时间段内需要执行的作业列表。
答案 3 :(得分:0)