骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 996|回复: 1

[功能与代码] 【骑砍2】分享三个计时器的写法

[复制链接]

30

主题

227

回帖

192

积分

见习骑士

Rank: 3

UID
2758789
第纳尔
2148
精华
0
互助
21
荣誉
1
贡献
0
魅力
201
注册时间
2016-7-18
鲜花(22) 鸡蛋(0)
发表于 2024-2-21 10:54:36 | 显示全部楼层 |阅读模式
本帖最后由 路过的罗格 于 2024-2-21 10:56 编辑

代码写在module_mission_templates.py自己创建的,继承了MissionLogic的类,的重写的OnMissionTick方法里。后面没提供代码的两个方法,需要在类里面创建变量。
  1.         public override void OnMissionTick(float dt)
  2.         {
  3.             base.OnMissionTick(dt);
  4.             //创建一些bool值,我们的代码没有直接写在计时器里面,所以需要用布尔值来传递已经到时间了的消息
  5.             bool hasElapsed500Ms = false;
  6.             bool hasElapsed100Ms = false;
  7.             bool hasElapsed1000Ms = false;
  8.             int Time = (int)(Mission.Current.CurrentTime * 1000f);//记录当前游戏时间,×1000后转int类型
  9.             int Dt = (int)(dt * 1000f);//记录距上一个OnMissionTick触发后经过了多少时间,×1000后转int类型
  10.             //之前直接简单的去用(当前游戏时间 取余 需求间隔时间 == 0)去判定是否满足间隔时间,不过这个法子在这边完全不行。
  11.             //首先是问题的成因。我们获取的CurrentTime,是在OnMissionTick里面进行的获取,所以我们获取的时间被限定在了游戏逻辑帧tick里,不能获取到两个tick之间的时间。  
  12.             //因此常用的每过多少时间间隔触发一次的代码:if(游戏时间%间隔时间==0) 这种办法就受到了很大的影响,比如获取CurrentTime的那个tick的时间不满足取余后等于零的判定,就不会执行代码。
  13.             //所以我们需要把逻辑帧的间隔也全部遍历一遍,来看一下除了获取CurrentTime的那个tick外,从上一个tick到这一个tick之间的时间里有没有能满足判定条件的。
  14.             for (int i = 0; i < Dt; i++)
  15.             {
  16.                 int num = Time - i;
  17.                 if (num % 500 == 0) hasElapsed500Ms = true;
  18.                 if (num % 100 == 0)
  19.                 { hasElapsed100Ms = true; }
  20.                 if (num % 1000 == 0) hasElapsed1000Ms = true;

  21.             }
  22.             //对比测试代码,可以打个断点看一下for循环那边触发了if后,这边的数值是多少。
  23.             if ((int)(Mission.Current.CurrentTime * 1000f) % 100 == 0)
  24.             {
  25.                 //比如我这里的一组数据,time=123051,dt=53,所以for循环执行到i=51时,num=123000,表示两个tick之间经过了这个时间点,所以可以触发if里面的代码
  26.                 //而这边的代码里,因为(int)(Mission.Current.CurrentTime * 1000f )==123051,所以%100后还剩51,导致了无法触发这里面的代码
  27.                 int k = 0;
  28.             }
  29.             //省时间占空间的写法,需要在类里面写变量
  30.             //另一种计时器写法
  31.             //整体逻辑:记录上一次触发的时间,这个值写在外面的类里。每个tick检查当前时间-上次触发时间后,是否大于需要的时间值(比如1s触发一次),如果大于就说明需要把上次触发的时间+需要的时间值1s,并且执行后续代码。


  32.             //另一种计时器
  33.             //整体逻辑:在类里面创建一个变量,累加每个逻辑帧的dt,如果累加值大于需求的时间值后,就把累加值减去需求的时间值,然后触发后续代码。
复制代码
(点击展开 / 收起)

评分

参与人数 1第纳尔 +20 互助 +1 魅力 +5 收起 理由
幼稚园殺手 + 20 + 1 + 5 您的帖子很有价值!

查看全部评分

28

主题

4158

回帖

3131

积分

子爵[版主]

世纪风云制作组[程序]

圣殿骑士团[KT]
战团ID:Epig

中级术士

Rank: 7Rank: 7Rank: 7

UID
1706215
第纳尔
34958
精华
3
互助
157
荣誉
79
贡献
2005
魅力
207
注册时间
2013-12-8

骑砍中文站APP会员勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章汉匈决战正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士精神之文韬勋章杰出版主勋章骑士美德之奉献勋章骑士美德之高贵勋章骑砍中文站微博会员勋章骑砍中文站微信会员勋章骑友真人秀勋章汉匈决战荣誉用户勋章元老骑士勋章霸主正版勋章

鲜花(2039) 鸡蛋(904)
发表于 2024-2-23 17:28:41 | 显示全部楼层
这个也可以用在数秒上
童鞋们,欢迎来到骑马与砍杀学院,我是你们的科任老师,猪猪老师,由我来为童鞋们介绍以下课程:
1、人间五十年life50 2.0测试版
2、永恒世界4.5.5公测版
3、永恒世界网页端 UCP2.0
4、大逃杀1.0公测版
5、永恒世界4.5特别版
6、常见PY报错解决方案
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-12-27 12:40 , Processed in 0.112702 second(s), 21 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表