当前位置: 首页 > 知识库问答 >
问题:

Sprite Kit(iOS7)是否有像素级完美碰撞检测?

澹台逸明
2023-03-14

我需要在iPad精灵游戏中生成8个随机精灵对象。这些对象相当大,并且大小不同。它们不应该叠加。如果场景中生成的对象叠加,它将被删除(可选地,它会删除底层对象)。我一直在为Sprite Kit寻找一个像素完美的冲突检测框架或帮助类。到目前为止,我还没有找到教程或类似的东西。大多数人使用普通的冲突检测,这没有任何帮助,因为我的对象很大。我测试了标准方法,但它创建了矩形,使我的情况下的精灵区域更大。这是我的精灵工具包模板测试项目:

#import "WBMMyScene.h"

static const uint32_t randomObjectCategory     =  0x1 << 0;

@interface WBMMyScene () <SKPhysicsContactDelegate>

@end

@implementation WBMMyScene

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        /* Setup your scene here */
        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
        self.physicsWorld.gravity = CGVectorMake(0, 0);
        self.physicsWorld.contactDelegate = self;
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches)
    {
        CGPoint location = [touch locationInNode:self];
        SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
        //SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(50, 50)];
        spaceship.position = location;
        [spaceship setSize:CGSizeMake(50, 50)];
        [spaceship.texture setFilteringMode:SKTextureFilteringNearest];
        //spaceship.texture setFilteringMode
        spaceship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spaceship.size];
        spaceship.physicsBody.dynamic = YES;
        spaceship.physicsBody.categoryBitMask = randomObjectCategory;
        spaceship.physicsBody.contactTestBitMask = randomObjectCategory;
        spaceship.physicsBody.collisionBitMask = 0;
        [self addChild:spaceship];
    }
}

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    // 1
    SKPhysicsBody *firstBody, *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }

    // 2
    if (firstBody.categoryBitMask == secondBody.categoryBitMask)
    {
        [self projectile:(SKSpriteNode *) firstBody.node didColliteWithEachOther:(SKSpriteNode *) secondBody.node];
    }
}

- (void)projectile:(SKSpriteNode *)object1 didColliteWithEachOther:(SKSpriteNode *)object2
{
    NSLog(@"Hit");
    [object1 removeFromParent];
    [object2 removeFromParent];
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
}

@end

感谢您抽出宝贵时间:)

共有2个答案

郤令
2023-03-14

此解决方案不能提供像素完美的检测,因此可能不完全是您(或发现此问题的其他人)想要的,但它是一个非常好的替代方案,对某些人来说是理想的。

它通过分析精灵的纹理来自动计算基于多边形的物理体。它基本上是在不透明的像素周围画一条路径,并使用它进行碰撞。

而不是这个:

spaceship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spaceship.size];

使用这个:

spaceship.physicaBody = [SKPhysicsBody bodyWithTexture:spaceship.texture alphaThreshold:0.5f size:spaceship.size];
汪飞捷
2023-03-14

据我所知,iOS7没有每像素物理特性,这是因为XCode 6正在测试阶段,现在可供开发人员使用。请记住,这是一个测试版,确实有一些bug,它的完整版本可能会在9月份发布,其中包括iOS8和新款iPhone。

与此同时,你有两个选择,你可以下载XCode 6测试版,并在其中为每个像素的物理工作。然而,就我个人而言,我有点厌倦了使用测试版进行全面开发,而是回到了XCode 5。在iOS7和XCode 5中,你可以选择定义一个带有路径的物理体,它可以准确地描绘精灵的物理形状。

我使用的工具在这里,可以让您拖放图像,然后以图形方式定义路径点并返回代码,它真的很方便。

我希望这有帮助!

 类似资料:
  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个

  • 我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/ 这是我的Cocos2d-x版本代码 如果我将“pp”参数发送为false,则我的代码工作正常。也就是说

  • 问题内容: 我找到了像素完美碰撞检查的代码,并在我的代码中使用了它: 它运行完美,从来没有任何问题。直到我使用以下代码将图像设置为Config_Alpha_8为止(由于ram问题): 为什么什么都不会发生,它确实被CollisioDetected装入了,我已经检查了日志!但是它不会检测到冲突。有人可以使用config_alpha_8提供工作功能来检查位图的像素完美冲突吗? 问题答案: 在具有ALP

  • 问题内容: 你好。 我有多个碰撞问题。有一颗子弹击中了敌人(红色矩形)。然后,它+分数。有一个螺旋线(红色圆圈) 被推测为当敌人(红色矩形)触摸场景时触发场景结束。 在这种情况下,当敌人击中螺旋桨时,螺旋桨将起作用,场景结束,然后我们进入菜单屏幕。但是,当子弹击中敌人时,同样的事情也会发生,我也不知道为什么。 现在,这是我的代码: 现在,我知道那是一团糟,但是有人可以帮助我吗?我认为问题与body

  • 问题内容: 如何使用Pygame的模块检测具有透明背景的两个精灵的碰撞,以便仅在实际的精灵(而不是透明背景)碰撞时返回? 问题答案: 使用该函数为您的精灵赋予属性。 然后,您可以将回调函数传递给sprite碰撞函数之一,例如,碰撞检测将是完美的像素。 这是一个完整的示例(当两个精灵碰撞时,标题会更改):

  • 我有4个物理体,它们都很好地检测到碰撞。然而,有两个物理体不会检测到它们何时相互碰撞。不过,它们会检测到它们何时与其他物理体碰撞。我有所有这些物理体的联系人测试位掩码,所以我不明白为什么会有问题。以下是一些代码:这是我设置物理体的地方: 以下是我用于设置玩家物理体(其中一个问题物理体)的代码: 以下是检测碰撞的函数: 下面是我用来设置蓝球的代码。这是另一个有问题的物理体: 这里的任何想法都会有所帮