我的一般建议:永远不要修改默认的anchorPoint(0.5f,0.5f),除非你对它的功能有很好的理解,以及它如何帮助你完成任务。在所有其他情况下,修改职位属性。
特别是如果您执行基于边界框或半径的碰撞检测,修改锚点将会适得其反。
让我们假设你的矩形精灵形象使用默认的定位点,这是在纹理的中心:
._______.
| |
| |
| * |
| |
| |
°-------°
的*标志着纹理的anchorPoint。如果你将这个精灵放置在位置(250,100),那么精灵的anchorPoint将位于坐标(250,100)。
比方说,你移动到anchorPoint(0.1F,0.1F):
._______.
| |
. | . |
| |
| |
| * |
°-------°
° °
精灵的位置保持在(250,100)不变。 anchorPoint的位置也不会改变。纹理如何以这一点为中心进行变化。在通过查看浮点来修改锚点之前,您可以看到之前的图像位置。实际上,通过修改anchorPoint所做的全部工作就是移动(偏移)节点的纹理相对于节点位置的位置。
在上述情况下,纹理现在位于节点位置的左下角居中。您不能再依靠标出精灵图像中心的精灵位置。如果您为游戏中的每个节点任意修改anchorPoint,则节点的视觉表示与其位置之间不再有任何关联。因此修改游戏对象的anchorPoint是一个糟糕的设计。
此外,旋转或缩放将始终以anchorPoint为中心。在旋转或缩放节点时,修改anchorPoint可能会导致不良行为。
让我们假设一个奇怪的,最糟糕的情况,但完全有可能的情形,其中anchorPoint不再纹理内:
._______.
| |
| |
| |
* | |
| |
°-------°
这意味着,精灵的位置远偏移到实际的左图像正在显示。这可能导致碰撞检查差异,特别是上述情况完全无效基于半径的碰撞检查。这在发展过程中也是一个令人困惑的情况。
如果您可以确定精灵的位置始终位于其纹理的中心,而不是某些任何点,而您在没有某些调试绘图的帮助下甚至无法看到,则您的游戏将更容易开发。
问题仍然是:
你什么时候将要修改的锚点?
我只有在下列情况下这样做,避免它所有其他情况:
- 对齐非动画纹理与屏幕/窗口边框或类似
- 向右/左/上/下对齐标签,按钮或图像以对齐修改的图像(即艺术家更新)而不修改节点位置。
1)很容易解释。假设你有一个全屏背景图像。为了使其覆盖整个屏幕,你可以做两件事情之一:
- 变化的位置:(屏幕宽度/ 2,屏幕 高度/ 2)
- 变化anchorPoint为(0,0 )又名CGPointZero
你可以想象后者更容易做到。如果你永远不会移动背景,那很好。但是对于滚动背景我不会改变anchorPoint。
2)假设您的菜单系统要求各种按钮和图像与屏幕的右边缘完全对齐。所有按钮和图像的宽度都不相同:即玩游戏,积分,设置,更酷的游戏!
而不是找出每个图像/按钮的个别位置,通过修改anchorPoint到(1.0f,0.5f),然后将图像/按钮精确定位在屏幕宽度(和可变屏幕高度):位置=(屏幕宽度,100)。
让我们假设以下图像的位置是在(屏幕宽度,屏幕高度/ 2)具有默认anchorPoint(0.5F,0.5F)。你可以看到图像的右半部分是屏幕区域外:
__________.
|
.___|___.
| | |
| | |
| * |
| | |
| | |
°---|---°
|
----------°
随着修改anchorPoint(1.0F,0.5F)的图像可以是与正确的屏幕/窗口边框整齐右对齐,无论其纹理的宽度如何。位置保持不变:(屏幕宽度,屏幕高度/ 2)。
__________.
|
._______.
| |
| |
| *
| |
| |
°-------°
|
----------°
只是为了进行比较,如果你想为右对齐这个图像,菜单按钮,或标签不修改anchorPoint,你就必须按照这个公式来设置其位置:
(screen width - contentSize.width * anchorPoint.x, screen height/2)
该公式仍然非常简单,但如果节点的contentSize发生变化(这通常是标签的情况),则会变得杂乱,例如,分数以1位数开头,但随着时间的推移会增加为2,3和4位数。在这种情况下,通过修改anchorPoint来正确对齐节点是合理的,因为它避免了每次节点的contentSize发生更改时都不得不重新计算位置。
3)有一些艺术家为我提供了游戏对象的更新图像。图像大小发生了变化,因此它不再适合游戏的图形。另一方面,该对象的位置已经通过游戏测试已经确立,不应该改变以避免重新测试游戏。
在这种情况下,调整anchorPoint以使新图像与其他图形很好地对齐,而不影响游戏玩法,这是有保证的。这是一个安全的最后修改。不要在制作阶段开始这样做,否则在整个项目的整个生命周期中,最终都会出现anchorPoint-tweaking-hell。不要去那里!
总结:
修改anchorPoint只有这使得它更容易地对齐与其他节点或屏幕/窗口边框节点,或微调最终的艺术,而不会影响游戏的可玩性。
在所有其他情况下,专门用于移动节点。
假设我正在连接两条小线,就像这样_和/或用胳膊胳膊做出一种手臂......以便手臂可以四处移动。所以它看起来像_ /。你认为设置/ to ccp(0.5f,0.0f)的锚点会导致任何问题吗?我的意思是它看起来好像它的工作原理......但是你对这个主题有什么意见:) – Gabe
@Gabe:arm示例很有意义,因为旋转以anchorPoint为中心,所以在这种情况下移动anchorPoint可以让你获得在肘关节旋转。对于更复杂的设计,我会使用CCNode对象作为肘关节,并将下臂添加到肘关节的偏移处。这使您可以旋转肘关节并为您提供更大的灵活性。特别是如果每个肢体都应该进行自己的碰撞测试来添加这样的“关节节点”。 – LearnCocos2D
除了一个方面的评论,除非你有证据表明人们发布垃圾邮件或对特定问题没有答案,否则我们宁愿不预先保护问题。我们可以保护他们,一旦他们开始成为问题,但我们不希望不必要地阻止新用户回答更老的问题。 –