【问题标题】:Collision Detection between two textures in XNAXNA 中两个纹理之间的碰撞检测
【发布时间】:2014-01-08 07:16:54
【问题描述】:

我正在使用 XNA 的 monogame 实现为 Windows 商店制作游戏,其中,我正在应用轻弹手势在屏幕上移动对象。

这是我在Update方法中编写的用于轻弹和更新对象位置和速度的代码

            while (TouchPanel.IsGestureAvailable)
            {
                GestureSample gesture = TouchPanel.ReadGesture();
                if (gesture.GestureType == GestureType.Flick)
                    velocity += gesture.Delta;
                if (gesture.GestureType == GestureType.Hold)
                    position = gesture.Position;
            }

             if (velocity != Vector2.Zero)
             {
                float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
                position += velocity * elapsedSeconds;
                float newMagnitude = velocity.Length() - DECELERATION * elapsedSeconds;
                velocity.Normalize();
                velocity *= Math.Max(0, newMagnitude);
            }
            UpdateSprite(gameTime, ref position, ref velocity);

        void UpdateSprite(GameTime gameTime, ref Vector2 spritePosition, ref Vector2 spriteSpeed)
        {
        // Move the sprite by speed, scaled by elapsed time.
        spritePosition += spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        int MaxX = GraphicsDevice.Viewport.Width - cat.Width;
        int MinX = 0;
        int MaxY = 500 - cat.Height;
        int MinY = 0;
        // Check for bounce.
        if (spritePosition.X > MaxX - 10)
        {
            if (spritePosition.Y <= 200 || spritePosition.Y >= 300)
            {
                spriteSpeed.X *= -1;
                spritePosition.X = MaxX;
            }
            else
            {
                PositionCount = 0;
            }
        }
        else if (spritePosition.X < MinX + 10)
        {
            if (spritePosition.Y <= 200 || spritePosition.Y >= 300)
            {
                spriteSpeed.X *= -1;
                spritePosition.X = MinX;
            }
            else
            {
                PositionCount = 0;
            }
        }
        if (spritePosition.Y > MaxY)
        {
            spriteSpeed.Y *= -1;
            spritePosition.Y = MaxY;
        }
        else if (spritePosition.Y < MinY)
        {
            spriteSpeed.Y *= -1;
            spritePosition.Y = MinY;
        }
    }

对象的轻弹与此代码完美配合。但我正在寻找的是,当用户轻弹对象时,如果被轻弹的对象与任何其他对象发生碰撞,那么第二个对象也应该移动,就像被轻弹的前锋与它们发生碰撞时卡罗姆硬币的移动方式一样。

我曾尝试为碰撞和移动设置逻辑但徒劳无功。

我们将不胜感激任何形式的帮助。

非常感谢。

【问题讨论】:

  • 根据您想要的真实感,您可能想要使用 2d 物理引擎,它可以轻松实现多个动态复杂碰撞。 box2d.org 是著名的物理框架,好用,我自己用过几次。
  • 很抱歉,您提供的链接是空白的。
  • 它现在应该可以工作了:)
  • 您要问的更多是关于碰撞响应,而不是碰撞检测。如果您所有的对象都是圆圈,那么是的,这并不复杂。但是,如果您的对象是任何其他形状,并且您想要一种真实感,那么您将要编写一个物理引擎。

标签: c# windows-8 xna windows-store-apps monogame


【解决方案1】:

使用Farseer Physics Engine。它是一个流行的基于 Box2D 的 C# 物理引擎,并且与 MonoGame 兼容。它有很多代码示例和好的文档。

【讨论】:

  • 是的,我已经声明要阅读它。但这确定我需要物理引擎吗?我的意思是不使用引擎就不能完成工作吗? (对不起,我很疑惑)
  • 您不需要物理引擎,但碰撞检测可能是一个复杂的主题,而物理引擎往往会对此有所帮助。或者,您可以开始谷歌搜索“2D 碰撞检测”并找到教程。例如:gamedevelopment.tutsplus.com/tutorials/…
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多