C#如何识别两个对象之间的碰撞
Form1.csC#如何识别两个对象之间的碰撞,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
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执行操作。这些“放大器”中的每一个都增加了新的功能,但在对它们进行计算之前,您必须知道如何将整数取回来。