我正在使用 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 实现,如果有,有什么常见的模式可以解决这个问题吗?