C#如何识别两个对象之间的碰撞

表格1.cs


namespace SpaceInvadersV3

{

public partial class Form1 : Form

{

    public bool isPressed;

    Shooter player;

    List<Missile> bullet;

    List<Enemy> pirate;

    Boundary bottom;

    Boundary top;

    Boundary left;

    Boundary right;




    public Form1()

    {

        InitializeComponent();


        player = new Shooter(450,460);

        bullet = new List<Missile>();

        pirate = new List<Enemy>();

        for (int i = 0; i < 10; i++)

        {

            Enemy temp = new Enemy();

            pirate.Add(temp);         

        }

    }


    private void timer1_Tick(object sender, EventArgs e)

    {

        player.Move();

        foreach (Missile b in bullet)

        {

            b.Move();

        }


        foreach (Enemy p in pirate)

        {

            p.Move();

        }


        pictureBox1.Invalidate();


        if (IsColliding(player, pirate) == true) 

        {

            gameOver();

        }

    }

错误是"pirate"说它不能从'System.Collections.Generic.List<SpaceInvadersV3.Enemy>'to转换'SpaceInvadersV3.Enemy'我尝试将'IsColliding'下面的函数从(Enemy b)to更改,(List<Enemy> b)但后来它无法识别b.Bottom并说它List<Enemy>不包含底部的定义。


犯罪嫌疑人X
浏览 198回答 1
1回答

catspeake

if (IsColliding(player, pirate) == true)&nbsp;首先,永远不要写那个。说“如果这些碰撞是真的”看起来很业余。说“如果这些东西发生碰撞”:if (IsColliding(player, pirate))同样,喜欢if (!whatever)到if (whatever == false)。其次,集合请使用复数名词。那应该是pirates,不是pirate。您想向读者强调它们的集合。“海盗”中的错误表示它无法从“列表”转换为“敌人”你IsColliding需要一个射手和一个敌人,但你给它一个射手和一个敌人列表。 IsColliding不知道如何处理。您已经知道如何修复它。你想移动每一个敌人,所以你写道:foreach (Enemy p in pirate){&nbsp; &nbsp; p.Move();}现在你想检查每个敌人的碰撞,所以做同样的事情:foreach (Enemy p in pirate){&nbsp; &nbsp; if (IsColliding(player, p)) { ... }}您最终将学习的一项高级技术是对序列使用查询推导式:var collisions = from p in pirate&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where IsColliding(player, p)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select p;foreach (Enemy p in collisions){&nbsp; ... handle the collision...}但是在尝试跑步之前先学会走路。
打开App,查看更多内容
随时随地看视频慕课网APP