(此为国外网站的自动英译中,- -!遗憾的是不能手动调回英文状态... 所以措词看的很不舒服! 但代码和他说的几个碰撞的介绍的地址,还是值得保留和参考的)
你将不得不自己,程序这和小心的像素碰撞可能是 iPhone 来说太贵了。 我的建议是写 (称为在每个其他编程语言中的接口) 的 Collidable 协议,给它一个 collidedWith:(Collidable *) c 函数然后为您要允许的碰撞的任何对象只是实现的。 然后,您可以编写个案的碰撞逻辑。 同样地,您可以将您需要的碰撞的所有信息的大超类 (你的情况是一个 X、 Y、 宽度,和高度,或 X、 Y 和一个像素数据数组) 和 collidesWith 方法。 多表演的两种方法,您可以编写一束不同碰撞方法.如果你只做的几件事像素碰撞,它不会被命中。 通常,不过,这是做边界框碰撞或基于几何,一些其他碰撞,因为很 明显 更快更好的。
在 metanetsoftware 上的人们作出一些伟大的教程,它们之间的碰撞技术 轴分离碰撞 和 基于网格的碰撞,后者的这听起来像它会更可行的游戏。 如果您希望但是坚持使用强力的碰撞检测 (检查每个针对每个其他对象的对象) 然后使外框,是只 小 不是图像通常是正确的路来走。 这是多少成功 platformers 做到包括超级马里奥 Brothers.You 也可考虑加权外框-就是有一个边界框的一种类型的对象,另一种大小为他人的其中一个。例如马里奥,您有一个较大的框,以打硬币,比你的敌人。
现在,即使我已经警告过你不这样做,我会帮你,放在如何基于像素的碰撞。你会想要您的 CGImage 的 像素数据的访问,然后循环访问看如果此图像与任何其他图像共享位置的所有像素。这里的一些规范
for (int i = 0; i < [objects count]; i++) { MyObject *obj1 = [objects objectAtIndex:i]; //Compare every object against every other object. for (int j = i+1; j < [objects count]; j++) { MyObject *obj2 = [objects objectAtIndex:j]; //Store whether or not we've collided. BOOL collided = NO; //First, do bounding box collision. We don't want to bother checking //Pixels unless we are within each others' bounds. if (obj1.x + obj1.imageWidth >= obj2.x && obj2.x + obj2.imageWidth >= obj1.x && obj1.y + obj1.imageHeight >= obj2.y && obj2.y + obj2.imageGeight >= obj1.y) { //We want to iterate only along the object with the smallest image. //This way, the collision checking will take the least time possible. MyObject *check = (obj1.imageWidth * obj1.imageHeight < obj2.imageWidth * obj2.imageHeight) ? obj1 : obj2; //Go through the pixel data of the two objects. for (int x = check.x; x < check.x + check.imageWidth && !collided; x++) { for (int y = check.y; y < check.y + check.imageHeight && !collided; y++) { if ([obj1 pixelIsOpaqueAtX:x andY:y] && [obj2 pixelIsOpaqueAtX:x andY:y]) { collided = YES; } } } } } }