0

我有一个游戏,我需要一个轮子来旋转,但是我希望能够在我希望它停止的时候进行设置那部分。

到目前为止,我发现了一个 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;
}

这使它旋转并减速并停止,但我知道这是一种非常糟糕的方式。此外,它真的不允许我在减速和停止之前让它快速旋转一段时间。

4

1 回答 1

1

如果您只想在开始减速之前以最高速度旋转一下,请创建一个计数器。然后开始快速旋转并在每个间隔递减计数器。当该计数器变为 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图像,如果计时器计时特别快,这可能会导致您遇到资源问题。

于 2013-06-10T21:09:34.997 回答