像素级碰撞算法2

(此为国外网站的自动英译中,- -!遗憾的是不能手动调回英文状态... 所以措词看的很不舒服! 但代码和他说的几个碰撞的介绍的地址,还是值得保留和参考的)

 

 

你将不得不自己,程序这和小心的像素碰撞可能是 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; 
                    } 
                } 
            } 
        } 
    } 
} 

 

你可能感兴趣的:(游戏,编程,算法,J#,Go)