
转圈算法
发布日期:2022-03-03 10:44:07
浏览次数:8
分类:技术文章
本文共 1770 字,大约阅读时间需要 5 分钟。
在斗牛游戏中,有一个抢庄的阶段。会有一个亮框周期性循环转的效果,最终转到抢到庄家的那个人头像上。我要实现这个功能,假定整个动画过程就是3秒,没一个框亮后再灭持续时间是0.1秒。现在比如说有4个人都抢了4倍。那就是1234 1234 1234 不停的转动知道转到庄家位置比如3. 如果都是0.1秒按序执行的话就是转30次动画就结束了,怎么保证最后一次恰好落在庄家的位置上?
可以假想一下,大概是前面都是按0.1秒一个步调在执行动画流程。后面快到庄家那几步改下时间间隔比如调成0.2s。 所以需要每次执行函数的时候去计算当前还剩余多少圈leftCircle = leftTime / durarion 如果这个圈数小于等于数组的长度这里就是4了(需要特别注意浮点数误差的问题),那么警惕是否需要修改时间间隔了,如果
现在距离庄家的圈数为step 。如果step*duration < leftTime 那么我们就要刹车了 duration = leftTime / leftCircle 然后继续执行函数流程 知道时间结束,时间结束的时候圈正好就在庄家上面。
class Program
{
static int[] a = {0,1,2,3};
static int targtPos = 2;
static float totalTime = a.Length;
static int nCount = 0;
//实际项目中第一个参数是结构化数据 后面用了很复杂的机制这里我都简化了 另外参数最后一个是callback函数在递归退出前调用
static void PlayAnim(int[] data, int nIdx, float time, float duration, bool checkTime)
{
StringBuilder sb = new StringBuilder();
sb.Append("执行第" + nCount.ToString() + "当前的时间间隔是" + duration + "开始时间" + (time).ToString());
if (nIdx > 3)
{
sb.Append("位置--0");
}
else
{
sb.Append("位置--" + (nIdx).ToString());
}
Console.WriteLine(sb.ToString());
if(time >= a.Length)
{
//调用回调函数 某个事件函数
return;
}
if(nIdx > 3)
{
nIdx = 0;
}
if(checkTime)
{
float leftTime = totalTime - time;
double leftCicle = 0;
if(duration != 0)
{
leftCicle = leftTime / duration; //按这个时间间隔的剩余步骤
}
leftCicle = Math.Floor(leftCicle+0.5d);
if(leftCicle < a.Length || (leftCicle - a.Length <= 0.000001f && leftCicle -a.Length >= -0.000001f))
{
int curPos = nIdx;
int step = 0; //当前的位置距离目标的剩余的步骤数
for (int i = curPos; i != targtPos; )
{
i = (i + 1) % data.Length;
step++;
}
if(leftTime > step*duration)
{
duration = leftTime / step;
checkTime = false;
}
}
}
nCount++;
PlayAnim(data, nIdx + 1, time + duration, duration, checkTime);
}
static void Main(string[] args)
{
PlayAnim(a,
0,0f, //总耗费时间
0.1f, //持续时间
true //检查时间
);
Console.ReadLine();
}
转载地址:https://blog.csdn.net/yangjie6898862/article/details/78242551 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2023年09月10日 19时42分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JavaScript开发优化技巧
2019-03-07
2020 DASCTF&BJD MISC WriteUp
2019-03-07
HTML基础_1
2019-03-07
HTML基础_2
2019-03-07
列表、表格和媒体元素
2019-03-07
CSS_1
2019-03-07
css_2
2019-03-07
选择结构
2019-03-07
多重循环
2019-03-07
一维数组和应用
2019-03-07
冒泡排序和二维数组
2019-03-07
多线程
2019-03-07
虚拟机、mysql、hadoop伪分布式、高可用集群
2019-03-07
使用jdbc操作数据库
2019-03-07
hive分区、分桶、视图、侧视图
2019-03-07
【java面试经(架构师&设计师)-第5课】JAVA基础之多线程(一)
2019-03-07
ACL访问控制列表和NAT网络地址转换
2019-03-07
边界网关协议-BGP
2019-03-07
Linux-基本命令2-1
2019-03-07
关于CSS
2019-03-07