大家好我最近开始制作自己的平台游戏,我设法使用2D阵列创建地图,并且还创建了我的播放器。 我现在坚持如何接近矩形碰撞方面,非常感谢任何帮助。
以下是我创建地图的方法,现在我只需要弄清楚如何处理碰撞。
List<Texture2D> tileTextures = new List<Texture2D>();
private const int tileWidth = 64;
private const int tileHeight = 64;
public void Draw(SpriteBatch spriteBatch, Camera camera)
{
int tileMapWidth = tileMap.GetLength(1);
int tileMapHeight = tileMap.GetLength(0);
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int textureIndex = tileMap[y, x];
Texture2D texture = tileTextures[textureIndex];
spriteBatch.Draw(
texture,
new Rectangle(x * tileWidth - (int)camera.cameraPosition.X,
y * tileHeight - (int)camera.cameraPosition.Y,
tileWidth,
tileHeight),
Color.White);
}
}
}
答案 0 :(得分:1)
您可以使用对象的Rectangle并使用它的Intersect方法检查它们是否发生了碰撞。
你可以找到一个非常简单的例子,说明如何检查blog上的矩形碰撞,用户点击敌人来摧毁它:
if (mouseState.LeftButton == ButtonState.Pressed)
{
for (int index = this.enemies.Count - 1; index >= 0; index--)
{
if (this.enemies[index].Intersects(
new Rectangle((int)this.mouseCoordinates.X,
(int)this.mouseCoordinates.Y,
this.mouseTexture.Width,
this.mouseTexture.Height)))
{
this.enemies.RemoveAt(index);
}
}
}
答案 1 :(得分:0)
@Nahuel Ianni所说的非常适合检测碰撞。现在,你没有指定你需要碰撞的东西,我可以看到你很可能需要它来摧毁敌人和子弹,@ Nahuel Ianni很好地解释了,但我想你呢? ll还需要玩家和墙壁之间的碰撞。
Shaun Spalding在this tutorial(对于GameMaker)中提出了如何在平台游戏中检测和解决碰撞的一个很好的观点,它也可用于鸟瞰游戏。简而言之,在他的教程中,他向您解释了如何获得玩家的nextRectangle
*并检查其是否与任何墙碰撞,如果是,则只需将玩家移到该墙旁边即可。这样你就不会在墙内看到一个框架/玩家的玩家不会卡在墙上。
* nextRectangle
代表你的玩家的Rectangle
(身体),由速度/力量(无论什么逻辑适合你)移动。那是下一帧中的主体。因此,您可以说,您需要了解游戏流程的未来,以获得最佳的碰撞效果(并避免玩家在墙内)。
答案 2 :(得分:0)
要检查冲突的每个对象都应包含Rectangle
。这样,你可以做到
bool isHit=obj1.Rect.Intersects(obj2.Rect);