为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
犯罪嫌疑人X 2021-06-04 09:10:09
表格1.csnamespace 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>不包含底部的定义。
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

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

首先,永远不要写那个。说“如果这些碰撞是真的”看起来很业余。说“如果这些东西发生碰撞”:


if (IsColliding(player, pirate))

同样,喜欢if (!whatever)到if (whatever == false)。


其次,集合请使用复数名词。那应该是pirates,不是pirate。您想向读者强调它们的集合。


“海盗”中的错误表示它无法从“列表”转换为“敌人”


你IsColliding需要一个射手和一个敌人,但你给它一个射手和一个敌人列表。 IsColliding不知道如何处理。


您已经知道如何修复它。你想移动每一个敌人,所以你写道:


foreach (Enemy p in pirate)

{

    p.Move();

}

现在你想检查每个敌人的碰撞,所以做同样的事情:


foreach (Enemy p in pirate)

{

    if (IsColliding(player, p)) { ... }

}

您最终将学习的一项高级技术是对序列使用查询推导式:


var collisions = from p in pirate 

                 where IsColliding(player, p) 

                 select p;

foreach (Enemy p in collisions)

{

  ... handle the collision...

}

但是在尝试跑步之前先学会走路。


查看完整回答
反对 回复 2021-06-05
  • 1 回答
  • 0 关注
  • 193 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信