我正在尝试用 C#(Windows 形式)制作一个迷你游戏,例如太空入侵者。飞船飞得很好,但我没有得到多个镜头,我有一个方法 timer_Tick
来制作动画,当我按空格键拍摄时,第一个镜头工作正常,但第二个镜头。这个半位置的第一个镜头消失了。镜头是pictureBox
,我尝试了pictureBox
列表,但没有成功。
我有这样的东西:
public void Form1_Load(object sender, EventArgs e)
{
shootP = new PictureBox();
shootP.Image = Properties.Resources.shoot_1;
shootP.SizeMode = PictureBoxSizeMode.Zoom;
shootP.Size = new Size(10, 72);
ListShoot = new List<PictureBox>();
int i = -1;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
control = false;
i++;
ListShoot.Add(shootP);
timeShoot.Start();
}
private void timeShoot_Tick(object sender, EventArgs e)
{
if (control == false)
{
ListShoot[i].Location = new Point(spacecraft._imageBox.Location.X + 50, spacecraft._imageBox.Location.Y - 55); // align the shoot with spacecraft
control = true;
}
ListShoot[i].Top -= 40;
}
我做错了什么?
最佳答案
您每次都需要创建一个新图像,就像在aliassce的答案中一样。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
control = false;
shootP = new PictureBox();
shootP.Image = Properties.Resources.shoot_1;
shootP.SizeMode = PictureBoxSizeMode.Zoom;
shootP.Size = new Size(10, 72);
ListShoot.Add(shootP);
timeShoot.Start();
}
}
然后您需要更新列表中所有图像的位置。使用 foreach 循环并放弃 int 迭代器。
private void timeShoot_Tick(object sender, EventArgs e)
{
if (control == false)
{
foreach PictureBox shot in ListShot
{
shot.Location = new Point(spacecraft._imageBox.Location.X + 50, spacecraft._imageBox.Location.Y - 55); // align the shoot with spacecraft
shot.Top -= 40;
}
control = true;
}
}
您可能还需要更新绘制图像以循环遍历列表的代码。像这样的东西:
foreach PictureBox shot in ListShoot
{
draw(shot);
}
最后,您可能需要时不时地清理列表,以删除不再出现在屏幕上并且不再需要更新或绘制的任何镜头。
关于c# - 小游戏形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992006/