我必须使用位图和图片框。我是 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();
}
}
}
您的代码没有多大意义,所以让我们一次仔细检查一下:
//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);
}
这有望让您朝着正确的方向前进,了解如何运行简单的动画循环。