以特定速度旋转图片,像奖励轮一样减速停止

时间:2013-06-10 17:27:27

标签: c#

我有一个游戏,我需要一个轮子旋转,但我希望能够设置当我希望它停止哪个很好,如果我可以弄清楚如何减慢它而不使用像我那样的计时器我可以处理那部分。

到目前为止我所拥有的是一个rotateimage函数,我找到并使用一个计时器(更改间隔)来减慢它的速度。我要问的是winforms有没有更好的方法来做到这一点,因为我必须让它旋转几次然后慢下来然后停止。

我找到了帮助,这是许多不同的语言,但不是C#win形式。我想知道是否有可能。

private void timer1_Tick(object sender, EventArgs e)
{
    image = new Bitmap(@"C:\wheel.png");
    Wheel1.Image = (Bitmap)image.Clone();
    wheelspeed1 = wheelspeed1 + 5;
    angle = wheelspeed1;
    RotateImage(Wheel1, image, angle);
    Wheel1.Refresh();
    if (timer1.Interval < 150)
    {
        timer1.Interval++;
    }
    else
        timer1.Enabled = false;
}

public static Bitmap RotateImage(Image image, float angle)
{
    return RotateImage(image, new PointF((float)image.Width / 2, (float)image.Height / 2), angle);
}

public static Bitmap RotateImage(Image image, PointF offset, float angle)
{
    if (image == null)
        throw new ArgumentNullException("image");

    Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
    rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    Graphics g = Graphics.FromImage(rotatedBmp);

    g.TranslateTransform(offset.X, offset.Y);

    g.RotateTransform(angle);

    g.TranslateTransform(-offset.X, -offset.Y);

    g.DrawImage(image, new PointF(0, 0));

    return rotatedBmp;
}

这使它旋转,减速并停止,但这是一个非常糟糕的做法,我知道。而且,它实际上不允许我在减速和停止之前让它快速旋转一段时间。

2 个答案:

答案 0 :(得分:0)

如果您只想在开始减速之前以最高速度旋转一下,请创建一个计数器。然后开始快速旋转并在每个间隔减少计数器。当该计数器变为0时,开始增加间隔。

所以,比如:

private int _fastSpinCounter = 50; // spin fast for this many intervals
private void timer1_Tick(object sender, EventArgs e)
{
    image = new Bitmap(@"C:\wheel.png");
    Wheel1.Image = (Bitmap)image.Clone();
    // not sure why you're increasing the rotation angle here
    wheelspeed1 = wheelspeed1 + 5;
    angle = wheelspeed1;
    RotateImage(Wheel1, image, angle);
    Wheel1.Refresh();
    if (_fastSpinCounter > 0)
    {
        --_fastSpinCounter;
    else if (timer1.Interval < 150)
    {
        timer1.Interval++;
    }
    else
        timer1.Enabled = false;
}

在相关的说明中,您实际上不需要在每个计时器滴答时加载该图像。你可以只加载一次位图并保持缓存。实际上,你没有在图像上调用Dispose,如果计时器特别快,就会导致资源问题。

答案 1 :(得分:0)

我在我的方向盘中使用的解决方案 - 这是一个HTML5画布和Js滚轮 - 但这个想法可能在这里工作,是为了保持游戏循环的速度相同(所以定时器间隔相同),但改变轮子随时间旋转的角度。

最初车轮以大角度旋转,比如45度,然后随着时间的推移减小 - 30度,20度,15度,10度,5度等 - 这使得车轮减速并最终在目标角度为时停止达到。

我使用的阈值基于当前角度与最终目标角度的距离,而不是连续逐渐减速,因为我发现更容易将旋转的外观调整为减速动画。

或许可以在http://www.dougtesting.net

上看到胜利之轮