private void ingame_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
bullet = new PictureBox();
bullet.Image = WindowsFormsApplication1.Properties.Resources.bullet;
bullet.Size = new Size(8, 30);
bullet.Location = new Point(246, 364);
bullet.SizeMode = PictureBoxSizeMode.StretchImage;
bullet.BackColor = Color.Transparent;
this.Controls.Add(bullet);
this.SuspendLayout();
bullet.Location = new Point(bullet.Location.X, bullet.Location.Y - 10);
this.ResumeLayout();
timer1.Interval = 10;
timer1.Start();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
bullet.Location = new Point(bullet.Location.X, bullet.Location.Y-1);
}
每次单击空格键时都会创建一个新的项目符号,但是如果屏幕上已有项目符号,则它会冻结并且新项目会移动。有没有办法让他们两个/更多移动?
答案 0 :(得分:1)
你拥有的是PictureBox
。你想要的是List<PictureBox>
。例如:
public List<PictureBox> bullets = new List<PictureBox>();
(我会推荐一个私人会员,甚至是一个属性,但只是为了保持当前代码的最小变化,这应该没问题。)
首先,从KeyDown事件中删除您的计时器逻辑,并将其放在仅执行一次的位置,例如FormLoad。你只需要一个计时器滴答。
然后在KeyDown事件中,将新的“项目符号”添加到列表中。像这样:
if (e.KeyCode == Keys.Space)
{
// declare a local variable
var bullet = new PictureBox();
// set the rest of the properties and add the control to the form like you normally do
// but also add it to the new class-level list:
bullets.Add(bullet);
}
然后在你的计时器刻度事件中,只需遍历列表:
foreach (var bullet in bullets)
bullet.Location = new Point(bullet.Location.X, bullet.Location.Y-1);