我很幸运能够使用免费引擎Kobold2d(建立在cocos2d之上)。
我和其他人一样,在我们的设备上遇到KKPixelMaskSprite类和Pixel Perfect碰撞检测问题。以下结果来自我的个人项目,以及Kobold2d像素完美碰撞检测示例项目。
在iOS模拟器(ipad或iphone)中一切正常,但在我部署到的任何设备上都崩溃了。我尝试在调试和发布模式下进行部署,将构建目标更改为4,5和6,所有这些都崩溃了。
有趣的是,如果我在设备上使用“配置文件”运行应用程序,它会按预期工作。
我的团队和我已经成功扩展了Kobold2d的扩展,以在精灵帧上执行像素完美碰撞。我们还扩展了CCSpriteFrame类来保存它的相应像素掩码,并在精灵帧改变时自动更新精灵。
是否有人可以帮助我们解决在模拟器上工作的像素完美碰撞检测与设备之间的问题(运行配置文件构建时除外)?我们希望分享我们的代码并推动上游,以便所有人都能从中受益。 Steffen做得非常出色,我讨厌因为模拟器和设备之间的差异而导致这样一个很棒的课程失败。
它失败并带有一个断言消息:“其他pixelMask索引越过x,y的界限”。我感觉它与交叉矩形原点在检查之间变得偏斜有关,但我不确定。
我花了几周的时间试图解决这个问题,我愿意尝试任何人提供的任何东西。
我正在使用最新的Kobold v.2.1.0并使用OSX Mountain Lion和Xcode 4.6.1。
更新
在使用示例项目碰撞两个精灵时,探查器中的进一步测试检测到以下内存泄漏:
Leaked Object # Address Size Responsible Library Responsible Frame
Malloc 144 Bytes 1 0x2b41f0 144 Bytes QuartzCore mem_alloc
CALayer 1 0x1e061730 48 Bytes UIKit -[UIView _createLayerWithFrame:]
UIImageView 1 0x1e0615f0 96 Bytes UIKit -[UIClassicController _newChromeViewForOrientation:]
不确定是否有帮助......但我会继续调查..
更新2:初始解决方案
在KKPixelMaskSprite.m文件中,如果您查看函数内部:
-(BOOL) pixelMaskIntersectsPixelMaskSprite:(KKPixelMaskSprite*)other
寻找原点偏移变量:
NSUInteger originOffsetX = intersectOther.origin.x - intersectSelf.origin.x;
NSUInteger originOffsetY = intersectOther.origin.y - intersectSelf.origin.y;
现在,我们可以看到这些(当然)是无符号变量。通过设备(视网膜或非视网膜)进行调试,我注意到intersectSelf.origin.x
和/或intersectSelf.origin.y
的值具有小于各自intersectOther.origin.x
和/的情况。或intersectOther.origin.y
值。
这些情况目前由无符号变量处理,循环到最大值并倒计时,从而导致“其他像素掩码索引越界”错误。
因此,我建议负偏移值确实是有效的情况,并且应该通过将上述可变代码行更改为:
NSInteger originOffsetX = intersectOther.origin.x - intersectSelf.origin.x;
NSInteger originOffsetY = intersectOther.origin.y - intersectSelf.origin.y;
到目前为止,我们已经在视网膜和非视网膜模拟器以及iPad设备(第2代和第3代)上成功测试了这一变化。我们将继续测试以确定此修复程序是否成立,但到目前为止,它看起来非常有前景并给我们预期的结果!
我希望这些信息可以帮助人们!