2

我需要在 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

谢谢你的时间 :)

4

2 回答 2

2

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

它通过分析精灵的纹理自动计算基于多边形的物理体。它基本上围绕不透明像素绘制路径并将其用于碰撞。

而不是这个:

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

用这个:

spaceship.physicaBody = [SKPhysicsBody bodyWithTexture:spaceship.texture alphaThreshold:0.5f size:spaceship.size];
于 2015-04-29T00:12:47.730 回答
2

据我所知,iOS7 没有逐像素物理特性,这是由于 XCode 6 附带的,它处于 beta 测试阶段,现在可供开发人员使用。请记住,它是一个测试版并且确实有一些错误,它的完整版本可能会在 9 月与 iOS8 和新 iPhone 一起发布。

同时,您有两个选择,您可以下载 XCode 6 测试版并在其中针对每像素物理进行工作。然而,就我个人而言,我有点厌倦了使用 beta 进行完整开发,而是回到了 XCode 5。在 iOS7 和 XCode 5 中,您可以选择physicsBody使用路径定义 a,它可以准确描述精灵的物理形状。

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

我希望这有帮助!

于 2014-06-27T10:09:07.397 回答