11

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

  1. 主角-他是左下角的弓箭手,不会四处走动,只是他会移动上半身,因为您需要更改拍摄角度的角度...

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

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

4

1 回答 1

46

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

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

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

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

* 标记纹理的锚点。如果将此精灵放置在 (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。

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

于 2011-10-18T15:57:39.187 回答