转圈算法
发布日期:2022-03-03 10:44:07 浏览次数:10 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:优化C++制作的简易密码管理工具
下一篇:上班人员必读:“五险一金”详解!(转载)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月23日 13时22分14秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【Leetcode刷题篇】剑指offer51 数组中的逆序对 2019-04-26
【Leetcode刷题篇】剑指offer55-平衡二叉树 2019-04-26
【Leetcode刷题篇】leetcode98 判断一棵树是否为二叉搜索树 2021-06-29
Java中arraylist和数组的相互转换 2021-06-29
【Leetcode刷题篇 】leetcode147 对链表进行插入排序 2021-06-29
【Leetcode刷题篇】leetcode148 排序链表 2019-04-26
【面试篇】Java中String、StringBuilder与StringBuffer的区别? 2019-04-26
【面试篇】Java对象的hashCode()相同,equals()一定为true吗? 2019-04-26
【面试篇】Java中static和final关键字的作用是什么? 2019-04-26
【面试篇】Java中接口和抽象类的区别是什么? 2019-04-26
【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流 2019-04-26
【Java网络编程与IO流】Java中BIO、NIO、AIO的区别是什么? 2019-04-26
【Leetcode刷题篇】leetcode136 只出现一次的数字 2019-04-26
spring boot整合thymeleaf,支持JSP和HTML页面开发 2019-04-26
【Java网络编程与IO流】Spring boot整合SSE实现服务器实时推送流信息 2019-04-26
【Java网络编程与IO流】SpringBoot + WebSocket + Netty实现实时的服务器消息推送 2019-04-26
【Leetcode刷题篇】leetcode141 环形链表II 2019-04-26
【Leetcode刷题篇】leetcode160 相交链表 2019-04-26
【Leetcode刷题篇】leetcode169 多数元素 2019-04-26
【Leetcode刷题篇】leetcode461 汉明距离 2019-04-26