2011-10-18 77 views
11

好的,我正在用cocos2d在目标c中制作一个棒球数字的游戏...... 不同的东西需要动画,所以请给我一个关于完成这些事情的最佳方式的建议:移动一个简笔画,定位点,动画或其他东西......?

  1. 主要character-他在左下角的射手谁不走动,但因为你需要改变你在哪里拍摄的角度的角度,他会移动他的上半身..

  2. 敌人 - 来自你的具有碰撞检测和死亡时的箭头精灵射击的棒图的成群。

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

回答

44

我的一般建议:永远不要修改默认的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. 向右/左/上/下对齐标签,按钮或图像以对齐修改的图像(即艺术家更新)而不修改节点位置。

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只有这使得它更容易地对齐与其他节点或屏幕/窗口边框节点,或微调最终的艺术,而不会影响游戏的可玩性。

在所有其他情况下,专门用于移动节点

+0

假设我正在连接两条小线,就像这样_和/或用胳膊胳膊做出一种手臂......以便手臂可以四处移动。所以它看起来像_ /。你认为设置/ to ccp(0.5f,0.0f)的锚点会导致任何问题吗?我的意思是它看起来好像它的工作原理......但是你对这个主题有什么意见:) – Gabe

+3

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

+1

除了一个方面的评论,除非你有证据表明人们发布垃圾邮件或对特定问题没有答案,否则我们宁愿不预先保护问题。我们可以保护他们,一旦他们开始成为问题,但我们不希望不必要地阻止新用户回答更老的问题。 –