我正在尝试让图片框在 4 个图像之间切换来模拟旋转轮动画,但我不知道如何使其工作

问题描述 投票:0回答:1

我必须使用位图和图片框。我是 C# 新手,仍在尝试弄清楚一切是如何工作的。我已经被这个问题困扰了两天了,没有成功

namespace WheelOfFortune
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Spin_wheel()
        {
            // 1.Create Bitmap Array to loop pictures 
            //Create data set to hold strings which the user can change


            //Array for wheel
            //2-1-4-3(order of pictures)
            string image1 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel2.png");
            string image2 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel1.png");
            string image3 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel4.png");
            string image4 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel3.png");

            //Array
            string[] arr = new string[4];
            arr[0] = image1;
            arr[1] = image2;
            arr[2] = image3;
            arr[3] = image4;

            if (File.Exists(image4))
            {
                //Random count to randomize rotation
                //Bitmap pictures
                Bitmap picture = new Bitmap(arr[0]);
                wheelPictureBox.Image = picture;
                Random rnd = new Random(4);
                int rotation = rnd.Next();
                for (int i = 0; i < rotation; i++)
                {
                    while (i == 0) ;
                    picture = new Bitmap(arr[0]);
                    Thread.Sleep(100);
                    while (i == 1) ;
                    picture = new Bitmap(arr[1]);
                    Thread.Sleep(100);
                    while (i == 2) ;
                    picture = new Bitmap(arr[2]);
                    Thread.Sleep(100);
                    while (i == 3) ;
                    picture = new Bitmap(arr[3]);
                    Thread.Sleep(100);

                }
                
                
            }
            else
            {
                MessageBox.Show("Please make sure the file integrity is intact");
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Spin_wheel();
        }
    }
}
c# arrays visual-studio image bitmap
1个回答
0
投票

您的代码没有多大意义,所以让我们一次仔细检查一下:

//Array for wheel
//2-1-4-3(order of pictures)
string image1 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel2.png");
string image2 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel1.png");
string image3 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel4.png");
string image4 = (@"C:\Users\adm1\Documents\Programing\WheelOfFortune\WheelOfFortune\Resources\wheel3.png");

//Array
string[] arr = new string[4];
arr[0] = image1;
arr[1] = image2;
arr[2] = image3;
arr[3] = image4;

这里我们最好使用位图而不是字符串的

List
结构。我们需要在位图之间交换来生成动画,而不是每次要显示图像时都构建位图。理想情况下,它应该使用相对路径,该路径在调试期间或运行可执行文件的任何地方来自 ./Bin/Debug。位图可以是程序集中嵌入的资源,也可以保存在 /Resources 子文件夹中。
List
是一个更简单的结构,因为我们可以轻松地追加项目,同时仍然像数组一样通过索引访问项目。无论是
List
还是数组,我们都应该使用一组位图而不仅仅是文件名。

列表图像 = new List(); if (File.Exists("资源/wheel2.png")) images.Add(new Bitmap("Resources/wheel2.png"); if (File.Exists("资源/wheel1.png")) images.Add(new Bitmap("Resources/wheel1.png"); if (File.Exists("资源/wheel4.png")) images.Add(new Bitmap("Resources/wheel4.png"); if (File.Exists("资源/wheel3.png")) images.Add(new Bitmap("Resources/wheel3.png");

我不知道为什么你需要将图像加载为 2-1-4-3,而如果文件顺序不正确,则只需重命名文件...

现在我们有一组实际的位图可以旋转。下一篇:

Random rnd = new Random(4);
int rotation = rnd.Next();

这表示:“制作一个种子为 4 的随机生成器,并给我一个从 0 到 int.Max 的随机整数”。如果你想要一个 0-3 之间的随机数,你真正需要的是:

Random rnd = new Random();
int rotation = rnd.Next(0,4);

“种子”只是一个要使用的起始值,不是限制器或直接链接到 Next 返回的值。它仅在您需要初始

Random.Next
值的可预测、可重复模式的情况下提供。

之后我们可以从随机数轮换中回到你想要的。

for (int i = 0; i < rotation; i++)
{
    while (i == 0) ;
    picture = new Bitmap(arr[0]);
    Thread.Sleep(100);
    while (i == 1) ;
    picture = new Bitmap(arr[1]);
    Thread.Sleep(100);
    while (i == 2) ;
    picture = new Bitmap(arr[2]);
    Thread.Sleep(100);
    while (i == 3) ;
    picture = new Bitmap(arr[3]);
    Thread.Sleep(100);
}

上面的代码有几个错误。

while
是一个循环结构,看起来就像你想要一个带有is
if
:

的条件结构
    if (i == 0)
    {
        picture = new Bitmap(arr[0]);
    }
    else if (i == 1)
    {
        picture = new Bitmap(arr[1]);
    }
    ...

然而,这实际上无非是:

    picture = new Bitmap(arr[i]);

这是将图片设置为新的 Bitmap 实例,但您没有更新实际控件的图像引用,因此在此处设置“图片”不会执行任何操作。

使用新的

List<Bitmap> images
,这可以得到简化。例如,如果我们想要进行一次完整旋转:

 for (int count = 0; count < 4; count ++)
 {
     wheelPictureBox.Image = images[count];
     Thread.Sleep(100);
 }

现在,如果您想引入随机旋转次数,例如 1-4 次完整旋转:

 int rotations = new Random().Next(1,5); // 1-4
 int index = 0;
 for (int count = 0; count < rotations * 4; count ++)
 {
     wheelPictureBox.Image = images[index++];
     if (index > 3) index = 0;
     Thread.Sleep(100);
 }

这将为您提供 1-4 整圈的随机旋转。这里我们使用“index”变量来记录图像列表中的旋转索引的计数,从 0 到 3,然后返回到 0。我们不能使用“count”,因为这将超过 3 并导致索引超出范围例外,因为我们想要循环遍历列表中的 4 个位图,然后返回到第一个图像。

index++
表示“获取当前索引值,然后在使用它后递增”。之后我们检查它是否已增加超过 3,如果是,则将其重置为 0。

如果您想包含最多 4 次完整旋转的部分旋转:

 int rotationTicks = new Random().Next(1,17); // 1-4 full rotations (16 quarter rotations)
 int index = 0;
 for (int count = 0; count < rotationTicks; count ++)
 {
     wheelPictureBox.Image = images[index++];
     if (index > 3) index = 0;
     Thread.Sleep(100);
 }

这有望让您朝着正确的方向前进,了解如何运行简单的动画循环。

© www.soinside.com 2019 - 2024. All rights reserved.