cocos2d - 如何在3d中定位CCSprite?

时间:2012-08-06 03:55:47

标签: objective-c opengl cocos2d-iphone ccsprite

我有一个圆盘精灵,它总是绕着它的中心旋转,像一个轮子一样旋转。我想在3d空间中重新定位它并保持其旋转。我曾尝试弄乱网格属性,skewX / Y,相机,我能找到的一切,但我无法弄清楚如何通过旋转来产生这种效果。

example http://i46.tinypic.com/23m76yx.png

2 个答案:

答案 0 :(得分:2)

几条路线:

  • 计算出数学以获得旋转值的正确偏斜值。 (我不知道我的头脑,对不起,虽然你可以从选项-2反向工程)

  • 您可以对CCSprite进行子类化,覆盖CCNode的{​​{1}}方法,并且必须首先应用倾斜,然后旋转,以获得所需的效果。这使您无法计算出适当的偏斜计算,而代价是一个相当笨重的精灵子类。

- (CGAffineTransform)nodeToParentTransform,您可以了解其当前的运营顺序:

CCNode.h

以下是该方法的黑客攻击版本,首先是偏斜:(缺少 /* Order in transformations with grid disabled -# The node will be translated (position) -# The node will be rotated (rotation) -# The node will be skewed (skewX, skewY) -# The node will be scaled (scale, scaleX, scaleY) -# The node will be moved according to the camera values (camera) ... etc. */ 中原始方法中的优化

CCNode.m

答案 1 :(得分:2)

HachiEthan的答案很好,并允许您在保持旋转的同时使用skewX / skewY设置透视。但是,我认为使用相机设置透视图更容易。在这种情况下,您可以通过将旋转精灵包装在父节点中来实现效果。

例如:

CCNode *node3D;
CCSprite *sprite;

node3D = [CCNode node];
sprite = [CCSprite spriteWithFile:@"HugeDisc_Red.png"];

//[[node3D camera] setCenterX:15 centerY:45 centerZ:40]; // You can use the camera
[node3D setSkewX:25]; // Skew also works if you prefer it
[node3D setRotation:145]; // Skew + rotation looks pretty convincing
[node3D setPosition:ccp(middleX+105, middleY-110)];

[node3D setIgnoreAnchorPointForPosition:NO];
[node3D setAnchorPoint:ccp(0.5f,0.5f)];

[sprite setPosition:ccp(node3D.contentSize.width/2, node3D.contentSize.height/2)];
[sprite runAction:rotate];

[node3D addChild:sprite];

归根结底,这取决于偏好。你想为此制作一个自定义的精灵对象吗?你喜欢相机还是歪斜?根据您的需求,其中一个应该符合您的需求。