战斗游戏-如何制作无限导弹?

时间:2020-03-16 14:57:32

标签: c# arrays winforms

我正在制作类似《战城》的游戏,我希望我的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();
    }

导弹数组不能为空,它必须具有数组大小或其他大小。我将如何使其无限发射导弹?

很抱歉,我无法正确解释它,而且我的英语也不太好。

1 个答案:

答案 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#(此链接只是您可以在线找到的许多资源之一。

相关问题