【问题标题】:Basic Collision Code in C#- Collision not DetectingC# 中的基本碰撞代码 - 未检测到碰撞
【发布时间】:2018-11-05 10:15:41
【问题描述】:

我在尝试制作一个相当基本的平台游戏时遇到了一些问题。我正在尝试编写碰撞代码,以便玩家可以降落在来自列表的个人随机平台上,但是尽管我尝试了各种方法,但我用来控制角色是否正在经历重力的布尔值不是' 当角色离开平台时不会达到 false 值,因此他们可以在任何方向上漂浮在空中。他们也沉入平台,但我想让他们站在上面。

player 类接受一个位置向量、一个速度向量、一个方向字符串和一个布尔值作为参数。 update 方法中的代码如下,但我也会放入判断一个对象是否在顶部的代码。

character.position += character.velocity;

 if (character.landed == false)
                    character.velocity.Y = character.velocity.Y + 0.15f;
                else character.velocity.Y = 0;
            foreach (Platform p in Platforms)
            {
                for (int i = 0; i < p.size; i++)
                {
                    if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                        || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true))
                    {
                        character.landed = true;
                    }
                    if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true) 
                        && character.position.X + 3f > p.xPos + (32*p.size)
                      || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                        && character.position.X -3f < p.xPos)
                    {
                        character.landed = false;
                    }

                } 

            }
            if (InputHandler.KeyPressed(Keys.Left))
            {
                character.velocity.X = -3f;
                character.direction = "Left";
            }
            if (InputHandler.KeyPressed(Keys.Right))
            {
                character.velocity.X = +3f;
                character.direction = "Right";
            }
            if ((InputHandler.KeyPressed(Keys.Space) || InputHandler.KeyPressed(Keys.W)) && character.landed == true)
            {
                character.position.Y = character.position.Y - 10f;
                character.velocity.Y = -7.5f;
                character.landed = false;
            }
            if (character.position.Y > 3000)
            {
                GameRef.Exit();
            }
        }

碰撞布尔值如下:

    public bool isOnTopOf(Vector2 item1Position, Texture2D item1Sprite, Vector2 item2Position, Texture2D item2Sprite)
    {
        area1.X = (int)item1Position.X;
        area1.Y = (int)item1Position.Y;
        area2.X = (int)item2Position.X;
        area2.Y = (int)item2Position.Y;
        area1.Width = item1Sprite.Width;
        area1.Height = item1Sprite.Height;
        area2.Width = item2Sprite.Width;
        area2.Height = item2Sprite.Height;

        return (area1.Bottom >= area2.Top - 3 && area1.Bottom <= area2.Top + 3 && area1.Right >= area2.Left - 3 
            && area1.Left <= area2.Right + 3);
    }

我非常感谢任何不需要我删除到目前为止我所做的所有代码的帮助,但会让我稍微调整一下。我受到时间限制......另外,以下代码(包含在第一个代码段中)是我添加的一部分,以阻止角色从平台上走出来,由于某种原因没有返回 true。

if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true) 
                    && character.position.X + 3f > p.xPos + (32*p.size)
                  || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                    && character.position.X -3f < p.xPos)
                {
                    character.landed = false;
                }

【问题讨论】:

  • 我假设对 IsOnTopOf() 的调用总是返回 false。可能值得坚持 System.Diagnostic.Debug.WriteLine() 以在它返回 false 时输出字符 Y 位置。我的猜测是您的偏移量可能略微未对齐,或者您的检查不一致(如果不旋转它并运行代码很难判断,但我注意到您在某些地方有 >= 而在其他地方有 >)
  • 我对编程很陌生,所以我不太确定如何使用 Debug.WriteLine()... 我尝试调整 isOnTopOf 的偏移量,但如果我让它们更大的值角色悬浮在平台上方,但值 3 或更低会使他们沉入平台。我只是使用 > 作为一个单独的测试来查看如果角色移动,角色是否会越过平台边界,我意识到这可能不是一个好的系统。我不明白为什么我添加的最后一段代码永远不起作用,因为 isontopof 代码与前一个相同,它返回 true。
  • 基本上,你在paramenthesis里面放了一些东西;例如: System.Diagnostic.Debug.WriteLine(character.position.x);并且生成的调试信息将显示在您的输出窗口中(如果您看不到,则在 VS View -> 输出中)
  • 有道理......但对我来说,系统中显然不存在诊断。感谢您迄今为止的所有帮助!
  • 抱歉 - 这是诊断程序:docs.microsoft.com/en-us/dotnet/api/… 如果您在命名空间中看不到任何内容,请在 VS 中使用 ctrl-space - 它有时会让您知道您想要什么。

标签: c# xna collision-detection


【解决方案1】:

遍历每个平台并选择与玩家的速度/位置最接近的平台进行碰撞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多