G'day all,
简而言之,我正在使用for循环创建一堆相同的精灵,我想在屏幕上反弹。问题是如何为精灵编写碰撞检测过程。我已经使用了在sprite周围放置矩形的过程,并使用.intersects方法来处理矩形,但在这种情况下,我分别创建了每个sprite并且可以唯一地识别每个sprite。现在我有一堆精灵,但没有明显的方法从另一个中选择一个。
详细地说,如果我创建一个名为Bouncer.cs的对象并在其update()方法中给它移动指令,那么在Game.cs中使用它创建一堆sprite:
for (int i = 1; i < 5; ++i)
{
Vector2 position = new Vector2(i * 50, i * 50);
Vector2 direction = new Vector2(i * 10, i * 10);
Vector2 velocity = new Vector2(10);
Components.Add(new Bouncer(this, position, direction, velocity, i));
}
base.Initialize();
我可以使用以下方法在每个周围绘制一个矩形:
foreach (Bouncer component1 in Components)
{
Bouncer thing = (Bouncer)component1;
Rectangle thingRectangle;
thingRectangle = new Rectangle((int)thing.position.X, (int)thing.position.Y, thing.sprite.Width, thing.sprite.Height);
但是现在,我该如何检查碰撞?我几乎无法使用:
if (thingRectangle.Intersects(thingRectangle))
我应该指出我是一名交易老师,并且通过编码来防止我的大脑变得糊里糊涂。最近我一直在使用Python和Python,我可以把所有精灵放到一个列表中:
sprites[];
然后我可以简单地将每个引用为sprite [1]或sprite [2]或其列表中的索引。 XNA有这样的东西吗?
如果需要发布更多代码,请告诉我。
谢谢, 安德鲁。
答案 0 :(得分:1)
我在游戏引擎中使用的一个解决方案是在每个游戏更新的对象内部运行逻辑代码,即。每一帧。根据变量名称,您似乎已经这样做了,这表明您在对象中运行了一些物理代码来更新它们的位置。
你可能还想在Bouncer的构造函数中创建碰撞矩形,这样它就更容易访问,你可以很好地利用面向对象的编程,甚至可以使它成为一个访问器,所以你可以在每次调用它时更新它而不是手动更新边界/碰撞框。例如:
public Rectangle @BoundingBox {
get { return new Rectangle(_Position.X, _Position.Y, width, height); }
}
无论哪种方式有效,但碰撞检查都可以在Bouncer对象内部运行。您可以将Bouncer对象的引用列表设置为静态,也可以将其传递给对象本身。碰撞代码非常简单:
foreach(Bouncer bouncer in Components) //Components can be a static List or you can pass it on in the constructor of the Bouncer object
{
if (bouncer.BoundingBox.Intersects(this.BoundingBox))
{
//they collided
}
}