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

C#如何识别两个对象之间的碰撞,c#,.net,winforms,oop,C#,.net,Winforms,Oop,Form1.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; Bounda

Form1.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();
        }
    }
Box.cs,其中敌方和射手类均继承自

using System.Drawing;

namespace SpaceInvadersV3
{
class Box
{
    public Image pic;
    public float x;
    public float y;
    public float speed;





    public Box()
    {
        x = 0;
        y = 0;
        speed = 0;
    }
    // Image Resizing Code
    public static Image resizeImage(Image imgToResize, Size size)
    {
        return (Image)(new Bitmap(imgToResize, size));
    }
    // image resizing code


    public void Draw(Graphics g)
    {
        g.DrawImage(pic, x, y);
    }

    public float Width()
    {
        return pic.Width;
    }

    public float Height()
    {
        return pic.Height;
    }

    public float Left()
    {
        return x;
    }

    public float Right()
    {
        return x + Width();
    }

    public float Top()
    {
        return y;
    }

    public float Bottom()
    {
        return y + Height();
    }



}
}
我不认为射击类和敌人类是否真的相关,但如果你需要它们,我会发布它们。谢谢你的帮助

if (IsColliding(player, pirate) == true) 
首先,不要写那个。说“如果这些碰撞是真的”,这看起来很业余。说“如果这些东西发生碰撞”:

类似地,更喜欢
if(!whatever)
而不是
if(whatever==false)

第二,请对收藏使用复数名词。那应该是
海盗
,而不是
海盗
。你要强调的是,有一个收集他们给读者

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

你的
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...
}
但是在你尝试跑步之前先学会走路

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

类似地,更喜欢
if(!whatever)
而不是
if(whatever==false)

第二,请对收藏使用复数名词。那应该是
海盗
,而不是
海盗
。你要强调的是,有一个收集他们给读者

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

你的
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...
}

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

你是在学习编程还是编写游戏?如果游戏关闭winforms,看看我在做什么大学作业。我不知道你的意图是什么,但我猜你想让它检查每个海盗,看看它是否与玩家发生冲突。如果是这样,您需要将该支票移动到您的循环中。现在,你正试图将玩家与海盗列表进行比较,然后仍然试图将列表当作一个海盗来使用。@stephen.vakil是的,好的,我该怎么做?如果你在精灵周围有矩形,矩形类具有检测交叉点的内置方法,并包含学习编程或编写游戏的etcAre?如果游戏关闭winforms,看看我在做什么大学作业。我不知道你的意图是什么,但我猜你想让它检查每个海盗,看看它是否与玩家发生冲突。如果是这样,您需要将该支票移动到您的循环中。现在,您正在尝试将玩家与海盗列表进行比较,然后仍然尝试将该列表当作单个海盗来使用。@stephen.vakil是的,好的,我该怎么做?如果您在精灵周围获得矩形,则矩形类具有内置的方法来检测交叉点并包含etc@AlcoGoblin:不客气。这里有一个更大的教训:某些类型的存在是为了向其他类型添加功能<代码>列表允许您对多个整数执行操作,而不仅仅是一个整数<代码>任务允许您在将来知道的INT上执行操作
Nullable
让我们对可能丢失的int执行操作。这些“放大器”中的每一个都增加了新的功能,但在计算整数之前,你必须知道如何将整数取出来。@AlcoGoblin:不客气。这里有一个更大的教训:某些类型的存在是为了向其他类型添加功能<代码>列表允许您对多个整数执行操作,而不仅仅是一个整数<代码>任务允许您在将来知道的INT上执行操作
Nullable
让我们对可能丢失的int执行操作。这些“放大器”中的每一个都增加了新的功能,但在对它们进行计算之前,您必须知道如何将整数取回来。