Cocos2d:以逼真的方式获取CCSprite之后的阴影的算法

时间:2013-02-22 18:07:06

标签: cocos2d-iphone rotation sprite shadow light

我正在使用Cocos2d 2.0而没有其他(没有BOX2D等...)。我有一个角色并为它添加了一个阴影作为CCSprite子节点。当它移动时它会给出一个很好的“飞行效果”但不幸的是,当角色旋转时,孩子们也会这样做,并且阴影孩子以不切实际的方式移动。看到这张图片:

enter image description here

在3D游戏中,这将在图形引擎中使用3D矩阵和游戏中光源的位置。然而,我的游戏更简单,不需要任何3D图形,所以我需要找到一个程序化的近似。

首先尝试ovverride“setPosition”和“setRotation”方法,但没有多大帮助(阴影不会改变位置)。

-(void) setPosition:(CGPoint)position
{
    [super setPosition:position];


    CCSprite * shadow = (CCSprite *)[self getChildByTag:belowByOneZFirst];
    if (shadow!=nil) {
        [shadow setPosition:shadowOriginalPosition];
        CCLOG(@"Setting shadow position");
    }

}

-(void) setRotation:(float)rotation
{
    [super setRotation:rotation];
    CCSprite * shadow = (CCSprite *)[self getChildByTag:belowByOneZFirst];
    if (shadow!=nil) {
        [shadow setRotation:0];
        CCLOG(@"Setting shadow rotation");
    }

}

我现在有两条可能的路径。一种是使阴影成为独立的CCSprite(而不是将其添加为子),另一种是尝试修改设置者修改“SET_DIRTY_RECURSIVELY()”宏(它可以检查子项是否具有特定标记,如果是不适用变更)。

第一种方法有点过于复杂,第二种方法听起来还不错,但仍然有点过于复杂。

另外,只是不“改变”阴影相对位置并不能完全解决问题。我应该编写一些代码来调整阴影相对位置,同时考虑到Sprite在屏幕内的相对位置(假设我将太阳设置在左上角,然后阴影将根据相对位置改变形状。太阳)。

是否还有其他人使用Cocos2d实现了类似的算法?如果有的话,是否有任何常见的模式可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

提示:将精灵和阴影(带位置偏移)添加为ccnode的子级。移动节点,只旋转精灵,阴影位置仍然是精灵位置的偏移量。问题解决了(据我所知)。