我想制作一个程序,其中有两个点同时闪烁(中断10ms),但一个延迟200ms,另一个延迟300ms。如何从头开始同时播放这两个点?以下是否有更好的方法:
for(int i=1;i<100;i++)
{
if (i%2==0)
circle(10,10,2);
if (i%3==0)
circle(20,10,2);
delay(10);
cleardevice();
delay(100);
}
我会做这样的事情:
int t0=0,t1=0,t=0,s0=0,s1=0,render=1;
for (;;)
{
if (some stop condition like keyboard hit ...) break;
// update time, state
if (t>=t0) { render=1; s0=!s0; if (s0) t0+=10; else t0+=200; }
if (t>=t1) { render=1; s1=!s1; if (s1) t1+=10; else t1+=300; }
// render
if (render)
{
render=0;
cleardevice();
if (s0) circle(10,10,2);
if (s1) circle(20,10,2);
}
// update main time
delay(10); // Sleep(10) would be better but I am not sure it is present in TC++
t+=10;
if (t>10000) // make sure overflow is not an issue
{
t -=10000;
t0-=10000;
t1-=10000;
}
}
请注意代码是未经测试的,因为我直接在这里编写它(因此可能存在语法错误或拼写错误)。
基本的想法是有一个全球时间t
具有足够小的粒度(10ms
)。并且对于每个对象都有事件的时间(t0,t1
)状态的对象(s0,s1
)和句点(10/200 , 10/300
)。
如果主时间到达事件时间,则打开/关闭状态并将事件时间更新为下一状态交换时间。
这样您就可以拥有任意数量的对象,只需确保主时间步长足够小。
渲染标志只确保场景仅在更改时渲染。
为了改善时序,您可以使用RDTSC而不是t+=10
,并实际测量CPU频率精度已经过了多少时间。
要在第一轮中同时显示两个圆,您必须同时满足条件i%2==0
和i%3==0
。你可以通过简单的改变来实现它
for(int i=1;i<100;i++)
至
for(int i=0;i<100;i++)
// ↑ zero here