像素级碰撞算法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; 
                    } 
                } 
            } 
        } 
    } 
} 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值