0

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

在此处输入图像描述

在 3D 游戏中,这将在具有 3D 矩阵的图形引擎和游戏中光源的位置中得到处理。但是我的游戏要简单得多,不需要任何 3D 图形,所以我需要找到一个程序化的近似值。

首先尝试覆盖“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 实现,如果有,有什么常见的模式可以解决这个问题吗?

4

1 回答 1

0

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

于 2013-02-23T18:43:48.087 回答