移动棒图,锚点,动画或其他东西......?

Gab*_*iel 11 iphone objective-c cocos2d-iphone ccnode

好了,所以我正在用棍子数字游戏,在目标C的cocos2d ......不同的事情需要这么动画请,给我的是什么将去完成这些事物运动的最佳方法建议:

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

  2. 敌人 - 成群结队的棍子数字会发生碰撞检测并在被箭头精灵射击时死亡.

我该怎么做1和2移动?我应该掌握锚点并使用它们吗?(我真的很讨厌笨anchorpoints他们是如此难以得到工作...但我会使用这些,如果他们是更好的),或者使吨动画,或者是有其他许多精灵合并成一个单一的运动更简单的方法?

Lea*_*s2D 45

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

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

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

._______.
|       |
|       |
|   *   |
|       |
|       |
°-------°
Run Code Online (Sandbox Code Playgroud)

*标记纹理的anchorPoint.如果你将这个精灵放在位置(250,100),那么精灵的anchorPoint将位于坐标(250,100).

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

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

°       ° 
Run Code Online (Sandbox Code Playgroud)

精灵的位置保持不变(250,100).anchorPoint位置也不会改变.纹理如何围绕该点居中发生了什么变化.在通过查看浮点修改锚点之前,您可以看到上一个图像位置.实际上,通过修改anchorPoint所做的就是移动(偏移)相对于节点位置绘制节点纹理的位置.

在上面的例子中,纹理现在以其左下角在节点位置上居中.您不能再依赖精灵的位置来标记精灵图像的中心.如果您为游戏中的每个节点任意修改anchorPoint,则不再在节点的可视表示与其位置之间存在任何关联.因此,修改游戏玩法对象的anchorPoint是不好的设计.

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

让我们假设一个奇怪的,最糟糕的情况,但完全可能的情况是anchorPoint不再在纹理内:

                     ._______.
                     |       |
                     |       |
                     |       |
  *                  |       |
                     |       |
                     °-------°
Run Code Online (Sandbox Code Playgroud)

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

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

问题仍然存在:

您何时想要修改锚点?

我只在以下情况下这样做,并在所有其他情况下避免使用它:

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

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

  • 将位置更改为:(屏幕宽度/ 2,屏幕高度/ 2)
  • 将anchorPoint更改为(0,0)又名CGPointZero

你可以想象后者更容易做到.如果你永远不会移动背景,那就好了.但是对于滚动背景,我不会更改anchorPoint.

2)假设您的菜单系统要求各种按钮和图像与屏幕的右边界正确对齐.所有按钮和图像的宽度不同:即玩游戏,积分,设置,更酷的游戏!

不是找出每个图像/按钮的各个位置,而是通过将anchorPoint修改为(1.0f,0.5f)然后将图像/按钮精确定位在屏幕宽度(和可变屏幕)来简单地对齐它们更容易height):position =(屏幕宽度,100).

让我们假设下面的图像的位置是(屏幕宽度,屏幕高度/ 2),默认的anchorPoint(0.5f,0.5f).您可以看到图像的右半部分位于屏幕区域之外:

__________.
          |
      .___|___.
      |   |   |
      |   |   |
      |   *   |
      |   |   |
      |   |   |
      °---|---°
          |
----------°
Run Code Online (Sandbox Code Playgroud)

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

__________.
          |
  ._______.
  |       |
  |       |
  |       *
  |       |
  |       |
  °-------°
          |
----------°
Run Code Online (Sandbox Code Playgroud)

仅作比较,如果您想在不修改anchorPoint的情况下右对齐此图像,菜单按钮或标签,则必须根据以下公式设置其位置:

(screen width - contentSize.width * anchorPoint.x, screen height / 2)
Run Code Online (Sandbox Code Playgroud)

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

3)在极少数情况下,艺术家向我提供了游戏对象的更新图像.图像尺寸已经改变,因此它不再适合游戏的图形.另一方面,通过游戏测试已经很好地建立了对象的位置,不应该改变以避免重新测试游戏.

在这种情况下,调整anchorPoint使得新图像与其他图形很好地对齐,而不影响游戏玩法,这是合理的.这是一个安全的,最后一分钟的修改.不要在生产阶段开始这样做,否则你将在项目的整个生命周期中最终进入anchorPoint-tweaking-hell.不要去那里!

综上所述:

仅在修改anchorPoint时,可以更轻松地将节点与其他节点或屏幕/窗口边界对齐,或者在不影响游戏玩法的情况下微调最终艺术.

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

  • @Gabe:手臂示例有意义,因为旋转以anchorPoint为中心,因此在这种情况下移动anchorPoint可以让你在肘关节处获得旋转.对于更复杂的设计,我会使用CCNode对象作为肘关节,并在偏移处将下臂添加到肘关节.这允许您旋转肘关节节点并为您提供更大的灵活性.特别是如果每​​个肢体都应该进行自己的碰撞测试以添加这样的"关节节点". (3认同)