【问题标题】:How to add a sprite that is always on the screen in Cocos2d?如何在 Cocos2d 中添加一个始终在屏幕上的精灵?
【发布时间】:2025-12-04 20:00:01
【问题描述】:

我正在使用 c++ 中的 cocos2d-x v3 做一个平台游戏,其中地图通常非常大,可见屏幕通过地图跟随对象。

假设我想在屏幕右上角显示一个精灵,即使屏幕跟随对象,它也会在这个位置。

使用对象位置是不行的。

有没有办法在屏幕上显示精灵或其他任何东西,即使屏幕在移动,它也会在屏幕上?

附言。我是游戏开发的超级菜鸟

【问题讨论】:

    标签: c++ cocos2d-x cocos2d-x-3.0


    【解决方案1】:

    正如here 所写,你应该使用convertToWorldSpace

    convertToWorldSpace 将节点上的坐标转换为 SCREEN 坐标。convertToWorldSpace 将始终返回我们精灵的 SCREEN 位置,如果您想捕获精灵上的点击但需要移动/缩放图层,这可能非常有用。 一般情况下,父节点调用该方法时会使用子节点位置,结果返回子节点的世界位置。如果调用者不是父级,调用这个方法似乎没有意义……

    如你所见,

    Point point = node1->convertToWorldSpace(node2->getPosition()); 
    

    上面的代码会将node2的坐标转换为屏幕上的坐标。 例如,如果 node1 的锚点位置是 node1 的左下角,但不一定在屏幕上。这会将 node2 的位置转换为该点相对于 node1 的屏幕坐标)。

    或者,如果您愿意,您可以使用函数convertToWorldSpaceAR 获取相对于场景锚点的位置。

    【讨论】:

    • 这是不正确的。 convertToWorldSpace 返回坐标,并且不将节点添加到世界空间。
    【解决方案2】:

    因此,必须做出一些假设才能回答这个问题。我假设您在包含地图的图层上使用跟随操作。例如检查here。比如:

    // If your playerNode is the node you want to follow, pass it to the create function.
    auto cameraFollowAction = Follow:create(playerNode);
    // running the action on the layer that has the game/map on it
    mapLayer->runAction(cameraFollowAction);
    

    上面的代码将导致视口“移动”到玩家在世界位置的位置。因此,在您的地图上跟随比当前视口更大的玩家。我为我的游戏内菜单/hud 所做的是将 Hud 添加到不同的层,并将其添加到主游戏场景的根目录。没有在其上运行跟随动作的场景。如下所示。

    // Hud inherits from layer and has all the elements you need on it.
    auto inGameHud = HudLayer::create();
    // Add the map/game layer to the root of main game scene
    this->addChild(mapLayer, 0);
    // Add the hud to the root layer
    this->addChild(inGameHud, 1);
    

    上面的代码假定“this”是您的 MainGameScene。这会限制 Follow 操作将元素滚动到屏幕外。无论您的场景当前位于世界空间的哪个位置,您的元素都会出现在屏幕上。

    让我知道这是否足够清楚。如果您遇到困难,我可以为您提供更多帮助。

    【讨论】:

      【解决方案3】:

      我已经设法使用视差节点并使用精灵到达 Vec2(0,0) 的速度来做到这一点,这样它就始终保持在屏幕上的同一位置。

      【讨论】:

      • 这是一个非常全面的做法。为此有内置功能。但是,如果它对您有用,那就太好了 :) 当您开始针对其他平台进行优化时,请牢记其他选项。
      【解决方案4】:

      您总是可以将该精灵放入与其他所有内容不同的节点/层中。这样移动这个层/节点不会移动精灵

      【讨论】:

        最近更新 更多