Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查我的播放器是否为';不要与物体碰撞?_C#_Xna_Collision - Fatal编程技术网

C# 如何检查我的播放器是否为';不要与物体碰撞?

C# 如何检查我的播放器是否为';不要与物体碰撞?,c#,xna,collision,C#,Xna,Collision,我正在完成XNA游戏中的另一项功能,但我想知道您应该如何检查并查看玩家是否停止与对象相交 目前,我有一个bool,当玩家与小行星相交,即隐藏在小行星后面时,这是真实的。但我需要找出玩家何时停止与上述小行星相交,以允许bool返回false并允许我的敌人使用不同的移动路径 迄今为止的代码: Rectangle rectangle1; Rectangle rectangle2; rectangle1 = new Rectangle((int)player.Position.

我正在完成XNA游戏中的另一项功能,但我想知道您应该如何检查并查看玩家是否停止与对象相交

目前,我有一个
bool
,当玩家与小行星相交,即隐藏在小行星后面时,这是真实的。但我需要找出玩家何时停止与上述小行星相交,以允许
bool
返回false并允许我的敌人使用不同的移动路径

迄今为止的代码:

    Rectangle rectangle1;
    Rectangle rectangle2;

    rectangle1 = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Width, player.Height);

    for (int i = 0; i < asteroids.Count; i++)
    {
        rectangle2 = new Rectangle((int)asteroids[i].Position.X, (int)asteroids[i].Position.Y, asteroids[i].Width, asteroids[i].Height);

        if (rectangle1.Intersects(rectangle2))
        {
            hidden = true;
        }
    }
矩形矩形1;
矩形2;
矩形1=新矩形((int)player.Position.X,(int)player.Position.Y,player.Width,player.Height);
对于(int i=0;i<小行星数;i++)
{
矩形2=新矩形((int)小行星[i]。位置.X,(int)小行星[i]。位置.Y,小行星[i]。宽度,小行星[i]。高度);
if(矩形1.相交(矩形2))
{
隐藏=真实;
}
}

我只是不知道如何检查其他状态。有什么想法吗?

我想稍微改变一下这种方法

首先,不要每帧声明一个矩形。而是在创建星号和播放器时创建矩形。然后在每个相应的更新中,使用实体位置更新矩形的位置

因此,rectangle1现在是player.rectangle(我建议获取集合,但出于这个目的,这不是一个问题),而rectangle2是asteroid.rectangle

接下来,我将进行两个更改之一。如果您只关心检查是否发生了冲突,请在执行检查之前,在开始时将布尔值更改为false。如果没有发生冲突,该布尔值将保持为false,但如果执行了冲突,则该布尔值应更改为true,然后需要使用break关键字退出循环

// ensure rectangle's positions reflect the entity's position before checking.
hidden = false;

for (int i = 0; i < asteroids.Count; i++)
{
    if (player.rectangle.Intersects(asteroids[i].rectangle))
    {
        hidden = true;
    }
}
//检查前,确保矩形的位置反映实体的位置。
隐藏=错误;
对于(int i=0;i<小行星数;i++)
{
if(player.rectangle.Intersects(小行星[i].rectangle))
{
隐藏=真实;
}
}
或者,如果您需要检查多个碰撞,我将使用稍微不同的方法。如果发生碰撞,我会存储小行星的位置,以便稍后确定如何影响玩家移动。这将允许同时处理多个碰撞。出于其他原因,您可能仍然需要布尔值,所以我保留了它,但您可以检查列表中有多少个元素。我还要指出,为了更精确地处理碰撞,需要更多的数据,如质量、重力等,但这是一个完全不同的主题

// ensure rectangle's positions reflect the entity's position before checking.

List<Vector2> collisionPositions = new List<Vector2> positions;
hidden = false;

for (int i = 0; i < asteroids.Count; i++)
{
    if (player.rectangle.Intersects(asteroids[i].rectangle))
    {
        hidden = true;
        collisionPositions.add(asteroids[i].position);

    }
}
//检查前,确保矩形的位置反映实体的位置。
列表冲突位置=新列表位置;
隐藏=错误;
对于(int i=0;i<小行星数;i++)
{
if(player.rectangle.Intersects(小行星[i].rectangle))
{
隐藏=真实;
添加(小行星[i].位置);
}
}