【问题标题】:Moving a Stick figure, anchorpoints, animation, or something else...?移动简笔画、锚点、动画或其他东西……?
【发布时间】:2011-10-18 14:32:28
【问题描述】:

好的,所以我正在目标 c 中使用 cocos2d 制作一个带有简笔画的游戏... 需要对不同的事物进行动画处理,所以请给我一个建议,告诉我完成这些事物的运动的最佳方法是什么:

  1. 主角-他是左下角的弓箭手,不会四处走动,除了他会移动他的上半身,因为你需要改变你射击的角度……

  2. 敌人 - 成群结队向你袭来的人物,它们具有碰撞检测功能,并在被箭头精灵射击时死亡。

我应该如何让 1 和 2 移动?我应该掌握锚点并使用它们吗? (我真的很讨厌愚蠢的锚点,它们很难开始工作......但如果它们更好,我会使用它们) 或者制作大量动画,或者有另一种更简单的方法将许多精灵组合成一个动作?

【问题讨论】:

    标签: iphone objective-c cocos2d-iphone ccnode


    【解决方案1】:

    我的一般建议:永远不要修改默认锚点(0.5f,0.5f),除非您非常了解它的作用以及它如何帮助您完成任务。在所有其他情况下,修改 position 属性。

    特别是如果您进行基于边界框或半径的碰撞检测,修改锚点会适得其反。

    假设您的矩形精灵图像使用默认锚点,该锚点位于纹理的中心:

    ._______.
    |       |
    |       |
    |   *   |
    |       |
    |       |
    °-------°
    

    * 标记纹理的锚点。如果将此精灵放置在 (250, 100) 位置,则精灵的锚点将位于坐标 (250, 100)。

    假设您将锚点移动到 (0.1f, 0.1f):

      ._______.
      |       |
    . |     . |
      |       |
      |       |
      | *     |
      °-------°
    
    °       ° 
    

    精灵的位置在 (250, 100) 处保持不变。锚点位置也不会改变。改变的是纹理如何以该点为中心。您可以通过查看浮动点来查看修改锚点之前的先前图像位置。实际上,您通过修改anchorPoint 所做的就是移动(偏移)节点纹理相对于节点位置的绘制位置。

    在上述情况下,纹理现在居中,其左下角位于节点位置上方。您不能再依赖精灵的位置来标记精灵图像的中心。如果您为游戏中的每个节点任意修改锚点,则节点的视觉表示与其位置之间不再有任何关联。因此,修改游戏对象的锚点是糟糕的设计。

    此外,旋转或缩放将始终以锚点为中心。在旋转或缩放节点时,修改锚点可能会导致不良行为。

    让我们假设一个奇怪的、最坏的但完全可能的情况,即锚点不再位于纹理内:

                         ._______.
                         |       |
                         |       |
                         |       |
      *                  |       |
                         |       |
                         °-------°
    

    这意味着该精灵的位置偏移到实际图像显示位置的左侧。这可能导致碰撞检查差异,特别是上述情况将完全使基于半径的碰撞检查无效。在开发过程中,这也是一个令人困惑的情况。

    如果您可以确定精灵的位置始终位于其纹理的中心,而不是在没有调试绘图的帮助下甚至无法看到的任意点,您的游戏将更容易开发。

    问题依然存在:

    您希望何时修改锚点?

    我只在以下情况下这样做,在所有其他情况下都避免这样做:

    1. 将非动画纹理与屏幕/窗口边框或类似内容对齐
    2. 右/左/上/下对齐标签、按钮或图像
    3. 在不修改节点位置的情况下对齐修改后的图像(即艺术家更新)。

    1) 很容易解释。假设您有一个全屏背景图像。要使其覆盖整个屏幕,您可以执行以下两种操作之一:

    • 改变位置为:(屏幕宽度/2,屏幕 高度 / 2)
    • 将锚点更改为 (0, 0) 即 CGPointZero

    你可以想象后者更容易做到。如果您永远不会移动背景,那很好。但是对于滚动背景,我不会更改锚点。

    2) 假设您的菜单系统要求各种按钮和图像与屏幕的右边框完全右对齐。所有按钮和图像的宽度都不同:即玩游戏、积分、设置、更酷的游戏!

    与其计算每个图像/按钮的单独位置,更容易通过将 anchorPoint 修改为 (1.0f, 0.5f) 来简单地右对齐它们,然后将图像/按钮精确定位在屏幕宽度 (和可变屏幕高度):位置=(屏幕宽度,100)。

    假设下图的位置在(屏幕宽度,屏幕高度/2),默认锚点(0.5f,0.5f)。您可以看到图像的右半部分在屏幕区域之外:

    __________.
              |
          .___|___.
          |   |   |
          |   |   |
          |   *   |
          |   |   |
          |   |   |
          °---|---°
              |
    ----------°
    

    使用修改后的 (1.0f, 0.5f) 的锚点,无论其纹理的宽度如何,图像都可以与右侧屏幕/窗口边框整齐地右对齐。位置保持不变:(屏幕宽度,屏幕高度 / 2)。

    __________.
              |
      ._______.
      |       |
      |       |
      |       *
      |       |
      |       |
      °-------°
              |
    ----------°
    

    为了比较,如果你想在不修改锚点的情况下右对齐这个图像、菜单按钮或标签,你必须根据这个公式来设置它的位置:

    (screen width - contentSize.width * anchorPoint.x, screen height / 2)
    

    公式仍然很简单,但是如果节点的 contentSize 发生变化,这将成为一件苦差事,这通常是标签的情况,例如分数从 1 位开始,但随着时间的推移增加到 2、3 和 4 位.在这种情况下,通过修改 anchorPoint 来右对齐节点是合理的,因为它避免了每次节点的 contentSize 发生变化时都必须重新计算位置。

    3) 在极少数情况下,艺术家向我提供了游戏对象的更新图像。图像大小发生了变化,因此它不再自然地融入游戏的图形。另一方面,对象的位置已经通过游戏测试确定,不应更改以避免重新测试游戏。

    在这种情况下,需要调整 anchorPoint 以使新图像与其他图形很好地对齐,而不影响游戏玩法。这是一个安全的、最后一刻的修改。不要在生产阶段开始这样做,否则您将在项目的整个生命周期中陷入锚点调整地狱。不要去那里!

    总结:

    仅在更容易将节点与其他节点或屏幕/窗口边框对齐,或者在不影响游戏玩法的情况下微调最终艺术的情况下修改 anchorPoint。

    在所有其他情况下,仅使用位置来移动节点。

    【讨论】:

    • 假设我正在连接两条像这样 _ 和 / 的小线来制作一种手臂......带有肘部,以便手臂可以移动。所以它看起来像 _/ 。您认为将 / 的锚点设置为 ccp(0.5f,0.0f) 会导致任何问题吗?我的意思是它看起来好像有效......但是你对这个主题有什么意见吗:)
    • @Gabe:手臂示例很有意义,因为旋转以锚点为中心,因此在这种情况下移动锚点可以让您在肘关节处获得旋转。对于更复杂的设计,我会使用 CCNode 对象作为肘关节,并将下臂添加到肘关节的偏移处。这允许您旋转肘关节节点并为您提供更大的灵活性。特别是如果每​​个肢体都应该进行自己的碰撞测试以添加此类“关节节点”。
    • 除了旁注之外,除非您有证据表明人们发布了垃圾邮件或对给定问题没有答案,否则我们宁愿不先发制人地保护问题。一旦他们开始成为问题,我们可以保护他们,但我们不想不必要地阻止新用户回答更老的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多