我目前的一项工作是为 iOS Cocos2D 创建一个 2D 可破坏地形引擎(参见https://github.com/crebstar/PWNDestructibleTerrain)。毫无疑问,它处于婴儿阶段,但自几周前开始以来,我已经取得了重大进展。但是,我在计算表面法线时遇到了一些性能障碍。
注意:对于我的可破坏地形引擎,0 的 alpha 被认为不是实心地面。
下面发布的方法在给定小矩形时效果很好,例如 n < 30。任何高于 30 的值都会导致帧速率下降。如果您接近 100x100,那么您不妨在精灵尝试穿越地形时阅读一本书。目前,这是我能想到的最好的方法来改变精灵在地形上漫游时的角度(要获得精灵方向的角度,只需采用 100 * normal * (1,0) 向量的点积)。
-(CGPoint)getAverageSurfaceNormalAt:(CGPoint)pt withRect:(CGRect)area {
float avgX = 0;
float avgY = 0;
ccColor4B color = ccc4(0, 0, 0, 0);
CGPoint normal;
float len;
for (int w = area.size.width; w >= -area.size.width; w--) {
for (int h = area.size.height; h >= -area.size.height; h--) {
CGPoint pixPt = ccp(w + pt.x, h + pt.y);
if ([self pixelAt:pixPt colorCache:&color]) {
if (color.a != 0) {
avgX -= w;
avgY -= h;
} // end inner if
} // end outer if
} // end inner for
} // end outer for
len = sqrtf(avgX * avgX + avgY * avgY);
if (len == 0) {
normal = ccp(avgX, avgY);
} else {
normal = ccp(avgX/len, avgY/len);
} // end if
return normal;
} // end get
我的问题是我的精灵需要更大的矩形才能使其运动看起来逼真。我考虑过缓存所有表面法线,但这会导致知道何时重新计算表面法线的问题,而且这些计算也非常昂贵(块应该有多大?)。另一个较小的问题是我不知道如何正确处理长度 = 0 的情况。
所以我被困住了......来自社区的任何建议将不胜感激!我的方法是最好的吗?还是我应该重新考虑算法?我是游戏开发的新手,一直在寻求学习新的技巧和窍门。