在过去的12个小时里,我一直在尝试“所有”我能想到的不同方法,以便在XNA (4.0)中让两个矩形正确相交/测试碰撞。
我有三个类(只是名称示例):
在游戏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个小时的碰撞测试后,动力就下降了。
对于这两个类,您可以添加一个属性
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块一