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

本文共 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++制作的简易密码管理工具
下一篇:上班人员必读:“五险一金”详解!(转载)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.36.148.129]2022年07月27日 10时25分29秒

关于作者

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

最新文章

COGS 859 数列 2019-12-03 18:27:09
COGS 1260 三元数对 2019-12-03 18:27:10
COGS 1266 借教室 2019-12-03 18:27:10
Software 2019-12-03 18:27:07
TYVJ 1434 黑匣子 2019-12-03 18:27:07
POJ 3063 Sherlock Holmes 2019-12-03 18:27:07
洛谷 1761 正方形 2019-12-03 18:27:08
洛谷 1485 火枪打怪 2019-12-03 18:27:08
Curves 2019-12-03 18:27:08
COGS 1022 防线 2019-12-03 18:27:08
星象仪 2019-12-03 18:27:08
超车 OVERTAKING 2022-02-05
最小奖励 MINAW 2022-02-05
POJ 2668 Game of Lines 2022-02-05
POJ 3623 Best Cow Line 2022-02-05
POJ 3666 Making the Grade 2022-02-05
VIJOS 1008 篝火晚会 2022-02-05
TYVJ 1443 油滴扩展 2022-02-05
COGS 613 火车站饭店 2022-02-05
VIJOS 1532 区间 2022-02-05