【问题标题】:making my player sprite land on top of my platform sprite让我的玩家精灵降落在我的平台精灵之上
【发布时间】:2011-03-08 04:20:20
【问题描述】:

在我的 XNA 游戏中(顺便说一下,我对 XNA 还很陌生)我想让我的玩家精灵登陆一个平台。我有一个继承自我的常规精灵类的玩家精灵类,以及用于 基本的不可玩的精灵东西,比如盒子、背景东西和平台。但是,我不确定如何实现让我的玩家精灵登陆平台的方法。

我的玩家精灵可以跳跃和移动,但我不知道在哪里以及如何检查它是否在我的平台精灵之上。

我的玩家精灵跳转方法在这里

 private void Jump()
    {

        if (mCurrentState != State.Jumping)
        {

            mCurrentState = State.Jumping;


            mStartingPosition = Position;

            mDirection.Y = MOVE_UP;

            mSpeed = new Vector2(jumpSpeed, jumpSpeed);

        }

    }

mStartingPosition 是玩家精灵跳跃的起始位置,Position 是玩家精灵当前的位置。我认为我的代码用于检查我的玩家精灵是否在我的平台精灵之上。我不确定如何在 playersprite 类和 jump 方法中引用我的平台精灵。

我觉得应该是这样的

   //platformSprite.CollisonBox would be the rectangle around the platform, but im not 
    //sure how to check to see if player.Position is touching any point     
    //on platformSprite.CollisionBox
if(player.Position == platformSprite.CollisionBox)
    {
        player.mDirection = 0;

    }

我对编程和 XNA 还是很陌生,其中一些逻辑我不太了解,因此我们将不胜感激:D

谢谢

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    如果 player.Position 是 Point 而 CollisionBox 是 Rectangle,你可以使用

    if (platformSprite.CollisionBox.Contains (player.Position))
    

    【讨论】:

    • player.Position 是一个vector2 对象,有没有办法将vector2 对象转换为Point 对象?这可能吗?
    • @Stone:您可以使用Vector2.XVector2.Y 创建一个新的PointPoint myPoint = new Point(playerPosition.X, playerPosition.Y);
    • 使用反引号。在我的键盘上,它是数字 1 左侧的键。移动它,因为 ~.
    【解决方案2】:

    就在几天前,我还在玩这样的事情。 你所说的 CollisionBox 我称之为 BoundingBox。 BoundingBox 是一个Rectangle,表示精灵占据的区域。

    您可能会发现为您的精灵定义一个 BoundingBox 而不是仅仅使用它们的位置会很有帮助。

    您可以使用以下代码轻松测试矩形的碰撞:

    if (player.BoundingBox.Intersects(platform.BoundingBox)
    {
        // handle collision here...
    }
    

    为此,请确保 BoundingBox 的 XY 坐标正确反映了精灵的位置。

    【讨论】:

    • 好吧,今晚晚些时候我得试试边界框了。另外,我是否必须在播放器构造函数中初始化我的 platformSprite 对象?现在我初始化了game1类中的所有东西,并且对如何从玩家类中引用平台精灵感到困惑,我是否只需添加一个“精灵平台”?在我的游戏班上名列前茅?
    • 我设置了边界框,但我仍在试图弄清楚如何从播放器类中获取 platformSprite 的实例。我想我没有足够的编程知识来解决这个问题,哈哈。我在 Game1 类中创建了我的播放器和我的 platformSprite。
    • 我将尝试制作一个静态 platformSprite 类,看看它是如何工作的,我尝试在 Game1 类顶部的声明中将对象设置为静态,但它仍然超出我的范围猜测。
    • 好的,静态 platformSprite 类允许我编译,但我的边界框似乎没有按预期工作。现在必须弄清楚:(
    • Hrm,也许可以考虑重构一下你的代码。如何创建一个类来处理游戏中的所有物理?此类可以保留要更新的精灵列表和对当前地图的引用。当你创建一个需要监控碰撞的精灵时,你只需要将它添加到你的物理类中,它会处理所有事情。
    【解决方案3】:

    您可能想查看Platformer Starter Kit。它包括这一点以及检测玩家何时接触敌人、收集宝石等。

    【讨论】:

      【解决方案4】:

      关于 BoundingBox 的答案是正确的,但是恕我直言,如果您正在制作 2D 游戏而不是 BoundingBox,那么使用 Rectangle 会更容易,后者是为 3D 游戏而设计的。

      无论如何,这两个对象都有以 Vector2 或 Point 作为参数的相交/碰撞测试方法。

      现在您必须为播放器准备一个盒子,并为您的平台准备一个盒子。如果一个与另一个相撞,您必须检查从哪里(玩家可以从上、下、左、右或左上角的上和左击中平台)。

      如果玩家在平台顶部,那么就停止他的跌倒,可能通过将他的 Y 速度分量设置为 0。

      也许你需要玩家在跳跃时穿过平台(玩家从底部击中),但在下落时不需要(玩家从顶部击中)。

      【讨论】:

        猜你喜欢
        • 2020-05-11
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 2014-01-16
        相关资源
        最近更新 更多