gpt4 book ai didi

iPhone SDK : Collision detection, 它必须是矩形吗?

转载 作者:行者123 更新时间:2023-12-03 21:00:07 26 4
gpt4 key购买 nike

我正在为 iPhone 制作一款基本平台游戏,但我的碰撞检测遇到了问题。

if (CGRectIntersectsRect(player.frame, platform.frame))
pos2 = CGPointMake(0.0, +0.0);
else
pos2 = CGPointMake(0.0, +10.0);

碰撞检测是为了阻止玩家在平台上时存在的游戏重力,问题在于碰撞检测是玩家周围的矩形,有没有办法对实际的物体进行碰撞检测图像的形状(具有透明度)而不是其周围的矩形?

最佳答案

您必须自己对此进行编程,并且要注意逐像素碰撞对于 iPhone 来说可能太昂贵了。我的建议是编写一个 Collidable 协议(protocol)(在所有其他编程语言中称为接口(interface)),给它一个 collidedWith:(Collidable *)c 函数,然后为您想要允许碰撞的任何对象实现该函数。然后您可以编写具体情况的碰撞逻辑。类似地,您可以创建一个大型父类(super class),其中包含碰撞所需的所有信息(在您的情况下是 X、Y、宽度和高度,或者 X、Y 和像素数据数组)和 collidesWith 方法。无论哪种方式,你都可以编写一堆不同的碰撞方法 - 如果你只为一些事情进行像素碰撞,那么它不会对性能造成太大影响。不过,通常情况下,最好进行边界框碰撞或基于几何形状的其他碰撞,因为它明显更快。

Metanetsoftware 的人们制作了一些关于碰撞技术的精彩教程,其中 axis separation collsiongrid based collision ,后者听起来对您的游戏更可行。但是,如果您想坚持使用强力碰撞检测(对照每个其他对象检查每个对象),那么制作一个比图像的边界框通常是正确的方法。许多成功的平台游戏都是这样做的,包括《 super 马里奥兄弟》。您还可以考虑加权边界框 - 也就是说,您为一种类型的对象使用一个边界框,为其他类型的对象使用不同大小的边界框。例如,在《马里奥》中,你可以用比敌人更大的盒子来击中硬币。

现在,尽管我已经警告过您不要这样做,但我还是会答应您并介绍如何进行基于像素的碰撞。你会想要access the pixel data的 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;
}
}
}
}
}
}

我这样做是为了 PixelIsOpaque 采用全局坐标而不是局部坐标,因此当您对该部分进行编程时,您必须小心地再次从中减去 x 和 y,否则您将超出范围您的图像。

关于iPhone SDK : Collision detection, 它必须是矩形吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com