我正在制作类似《战城》的游戏,我希望我的Tank每当碰到空格键时就继续释放导弹。我使用过Array,但我不能让索引留空,因为我拥有整数个导弹。
PictureBox[] missileArray = new PictureBox[10];
int missileNumber = -1;
PictureBox missile = new PictureBox();
Boolean startshooting = false;
private void shootingTimer_Tick(object sender, EventArgs e)
{
for(int i = 0; i < missileNumber; i++)
{
missileArray[i].Top -= 20;
}
}
private void Game_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Space)
{
this.Controls.Add(missile);
missile.Width = 10;
missile.Height = 10;
missile.BackColor = Color.Black;
missile.Top = MainTank.Top + MainTank.Height / 2 - missile.Height / 2;
missile.Left = MainTank.Left + MainTank.Width / 2 - missile.Width / 2;
missile.BringToFront();
missileNumber += 1;
missileArray[missileNumber] = missile;
shootingTimer.Start();
}
导弹数组不能为空,它必须具有数组大小或其他大小。我将如何使其无限发射导弹?
很抱歉,我无法正确解释它,而且我的英语也不太好。
答案 0 :(得分:1)
回答您的问题
我用过Array,但不能让索引留空
这种情况(即集合中元素的数量不确定)是开发人员通常在数组(List<T>
)上使用列表(T[]
)的确切原因。这不是唯一的原因,但是使用列表的最大原因(如果不是最大的话)。
修改代码以使用列表(我省略了所有其他代码)
List<PictureBox> missiles = new List<PictureBox>();
private void shootingTimer_Tick(object sender, EventArgs e)
{
foreach(var missile in missiles)
{
missile.Top -= 20;
}
}
private void Game_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Space)
{
missiles.Add(missile);
}
}
虽然用法稍有不同,但列表的行为与数组完全相同(甚至允许索引访问),但其附加好处是可以容纳您放入其中的任何数量的项目。
回复您的评论
因此,即使不返回原位,它也会继续发射?就像现在当我按下空格键一样,图片框将被发回
您不断重复添加相同的missile
对象,每当要发射另一枚导弹时,都会重置现有导弹的属性。您应该在每次按下空格键时实例化新导弹。没有必要在班上开设导弹场,可以将其范围限制为空格键按下事件:
private void Game_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Space)
{
var missile = new PictureBox();
// set all the new missile's properties like in your code
missiles.Add(missile);
}
}
您也不应该每次按下空格键都启动shootingTimer
。计时器应一次启动,然后它将自动迭代列表中的所有导弹。按下空格键时,您只需要在列表中添加导弹即可自动处理。
您面临的问题的根源是对引用类型在C#中的工作方式的误解。这超出了StackOverflow的答案范围,但我建议您阅读reference types versus value types in C#(此链接只是您可以在线找到的许多资源之一。