public PbsWheel(AnimatedPictureBox.AnimatedPictureBoxs[] pbs, AnimatedPictureBox.AnimatedPictureBoxs pb, int delta,Label label2)
{
for (int i = 0; i < pbs.Length; i++)
{
if (delta > 0)
{
pbs[i].AnimateRate += 1/60 * 1000;
1/60 * 1000是每秒60帧?
这就是我将图片框内部图像设置为动画的方式。我为每个图片框使用计时器:
public class AnimatedPictureBoxs : PictureBox
{
public static bool images;
List<string> imageFilenames;
Timer t = new Timer();
public AnimatedPictureBoxs()
{
images = false;
AnimateRate = 100; //It's up to you, the smaller, the faster.
t.Tick += Tick_Animate;
}
public int AnimateRate
{
get { return t.Interval; }
set { t.Interval = value; }
}
public void Animate(List<string> imageFilenames)
{
this.imageFilenames = imageFilenames;
t.Start();
}
public void StopAnimate()
{
t.Stop();
i = 0;
}
int i;
private void Tick_Animate(object sender, EventArgs e)
{
if (images == true)
{
imageFilenames = null;
}
if (imageFilenames == null)
{
return;
}
else
{
try
{
if (i >= imageFilenames.Count)
{
i = 0;
}
else
{
Load(imageFilenames[i]);
i = (i + 1) % imageFilenames.Count;
}
}
catch (Exception err)
{
}
}
}
速率设置为100,我想要显示的是当我向上移动鼠标滚轮以按每秒帧数更改图像的速度时。
pbs是pictureBoxes的数组。
答案 0 :(得分:4)
pbs[i].AnimateRate += 1/60 * 1000;
现在,AnimateRate
是一个整数属性。名字非常糟糕。这不是一个比率。这是一个计时器间隔。在数学术语中,它是一个时期。命名它使它听起来好像是一个速率或频率。
周期T和频率f之间的数学关系是:
T = 1/f
所以,这是你应该做的:
AnimationInterval
。请注意,您需要考虑频率是以每秒的帧数进行测量的事实,但您的间隔以毫秒为单位进行测量。所以你的代码应该是:
pbs[i].AnimationInterval += 1000/60;
这与你所拥有的非常相似,但有一个微妙的区别。在数学中,公式是相同的。但在C#中,/
运算符的行为取决于其操作数的类型。您提供两个整数,因此/
是整数除法。 1/60
的结果为零。所以你的代码不会修改属性。
我认为您需要稍微修改一下逻辑。就目前而言,您的原始数据是一个间隔。但实际上你想控制帧速率。所以我认为你应该维护一个保持帧速率的变量。如果要修改它,请对帧速率变量进行修改。然后像这样设置间隔:
pbs[i].AnimationInterval = 1000/frameRate;