当前位置: 首页 > 知识库问答 >
问题:

XNA与多个类相交/碰撞?

段干博明
2023-03-14

在过去的12个小时里,我一直在尝试“所有”我能想到的不同方法,以便在XNA (4.0)中让两个矩形正确相交/测试碰撞。

我有三个类(只是名称示例):

  • Game1.cs
  • 玩家。cs
  • Man.cs

在游戏1中,我像这样加载内容:

//在第一场比赛的开始:

    Player player;
    Man man;

// LoadContent:

    man = new Man(Content.Load<Texture2D>("ManImage"), new Rectangle(440, 310, 150, 98));
    player = new Player(Content.Load<Texture2D>("playerSheet"), new Vector2(40, 420), 50, 44);

但是,我想检查人和玩家之间的碰撞,但我不知道如何“加入”这两个类,以便能够在Game1中执行if(相交)(如果这是这样做的地方)。

播放器矩形看起来像这样:

playerRect = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);

我只是在这里完全“盲码”了,还是什么?任何能够帮助我的人,经过12个小时的碰撞测试后,动力就下降了。

共有1个答案

司空默
2023-03-14

对于这两个类,您可以添加一个属性

public Rectangle PositionRectangle { get; private set; }

然后,在相关的构造函数中,您需要启动此属性

public Man(..., Rectangle rectangle)
{
    PositionRectangle = rectangle;
}

public Player(..., Vector2 position, int width, int height)
{
    PositionRectangle = new rectangle((int)position.X, (int)position.Y, width, height);
}

您不需要担心您正在显示什么帧,因为这与源矩形有关,而不是与目标矩形有关(这是您需要测试碰撞的地方)。

然后,您可以轻松测试这些碰撞

if(man.PositionRectangle.Intersects(player.PositionRectangle))
{
    //collision logic
}

当然,您需要注意随时更新这些矩形的位置(或宽度和高度,如果可以更改的话)

如果您想轻松定位人和玩家,而不必担心他们的矩形如何更新,您可以这样设置:

class Man
{
    Texture2D _texture;

    public Vector2 Position { get; set; }
    public int Width { get; set; } 
    public int Height { get; set; }

    public Rectangle PositionRectangle
    {
        get
        {
            return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
        }
    }

    public Man(Texture2D texture)
    {
        this._texture = texture;
        this.Width = texture.Width;
        this.Height = texture.Height;
    }

    ... //other man related logic!
}

class Player
{
    Texture2D _texture;
    int _frameCount;
    int _currentFrame;
    //other frame related logic...

    public Vector2 Position { get; set; }
    public int Width { get; set; } 
    public int Height { get; set; }

    public Rectangle PositionRectangle
    {
        get
        {
            return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
        }
    }

    public Rectangle SourceRectangle
    {
        get
        {
            return new Rectangle(Width * _currentFrame, 0, Width, Height);
        }
    }

    public Player(Texture2D texture, int frameWidth, int frameCount)
    {
        this._texture = texture;
        this.Width = frameWidth;
        this.Height = texture.Height;
        this._frameCount = frameCount;
        this._currentFrame = 0;
        //etc...
    }

    ... //other player related logic! such as updating _currentFrame

    public Draw(SpriteBatch spriteBatch)
    {
         spriteBatch.Draw(_texture, PositionRectangle, SourceRectangle, Color.White);
    }
}

在这里,我已经为您提供了如何使用属性访问器动态生成相关矩形的示例!

您使用< code>PositionRectangle来确定您的玩家(或人)在屏幕上的位置,并使用< code>SourceRectangle来确定您要绘制纹理的哪一部分。

此外,如果您的男人和玩家的宽度和高度不会改变,那么您应该将他们的设置访问器设置为私有

当您需要更改位置时,只需设置它们的位置属性

man.Position = new Vector2(100, 100); //i.e.

您的碰撞和绘制逻辑将自动使用新的矩形,而无需任何进一步的干预!

希望你喜欢!

关于源矩形是公开的,你只需要从外部绘制这些(即Game1调用spriteBatch.Draw(player.Textureplayer.PositionRectangleplayer.SourceRectangleColor.White);)。

如果你像在示例中一样(从内部)绘制它,你可以废弃整个公共的Recangle SourceRectangle{...}的东西,然后直接在绘制中使用那个矩形:

    public Draw(SpriteBatch spriteBatch)
    {
         spriteBatch.Draw(_texture, PositionRectangle, new Rectangle(Width * _currentFrame, 0, Width, Height), Color.White);
    }
 类似资料:
  • 在一个小行星游戏中,我在旋转精灵时尝试使用XNA进行2D碰撞检测时遇到了一些问题。在子弹击中小行星之前,碰撞一直在发生(看起来是从各个方向),当飞船撞上小行星时,碰撞也是不准确的。我使用一个矩阵来旋转飞船发射的子弹,然后是一个小行星的矩阵,并且在一个Xbox独立游戏论坛上使用了每像素碰撞检测样本。 这是我的子弹矩阵…原点和位置是子弹的矢量2属性 和小行星... 我是编程新手,在过去的几天里,我一直

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 问题内容: 我有两个表,它们的列数相同,没有主键(我知道,这不是我的错)。现在,我需要删除表B中存在的表A中的所有行(它们相等,每行30列)。 我认为最直接的方法是执行并解决我的问题。但是,所有列的写条件(担心)也不尽人意(也许是因为我的表也不尽人意)。 我要用。我不知道该怎么做?这是我的第一个问题: 我试过了(SQL Fiddle): 但是所有行均已从table中删除。 这使我想到第二个问题:为

  • D/OpenGlRenderer:0x702565A400(RippleDrawable)上的endAllActiveAnimators,句柄0x701D23CC60 D/AndroidRuntime:正在关闭VM 致命异常:java.lang.IllegalStateException:指定的消息队列同步屏障令牌尚未发布或已被删除。在android.os.messagequee.removesy

  • 我正在as3中编写一个冲突检测系统。它的目的很简单:我有一些移动的矩形和一些静态的矩形。当一个移动的矩形与另一个矩形碰撞时,我想将源(碰撞)矩形移动到碰撞区域之外,但仍然尽可能靠近(基于源的轨迹)。 在每一帧中,我更新移动矩形的位置,并检查所有矩形之间的接触。 下图代表以下内容: A:方框#1正以45度角向静态矩形(#2)移动。 b:经过几次“刻度”后,我们看到矩形#1移动到矩形#2(静态)的空间

  • 问题内容: 我主要专注于图形方面,以创建一些2DGame。我看过/看过几本教程,但是没有一部教程那么令人满意。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形碰撞。重力等。 如果在屏幕上看到的对象太多(30 * 20),则一切正常。但是,如果我将其增加到300 * 300,则该程序开始运行非常慢,因为它必须检查许多对象。 我真的不知道Minecraft之类的游戏如何与ALL THOSE块一