Ipad Sprite套件(iOS7)是否有像素完美的碰撞检测?

Ipad Sprite套件(iOS7)是否有像素完美的碰撞检测?,ipad,ios7,sprite-kit,collision-detection,pixel-perfect,Ipad,Ios7,Sprite Kit,Collision Detection,Pixel Perfect,我需要在iPad精灵游戏中随机生成8个精灵对象。这些物体相当大,大小不一。它们不应该重叠。如果场景上的“繁殖”覆盖了一个,则会将其移除(可选),这将移除参考底图。 我一直在寻找一个像素完美的碰撞检测框架或帮助类的精灵工具包。到目前为止,我还没有找到一个教程或类似的东西。大多数人使用普通的碰撞检测,这对我的物体很大,没有任何帮助。我测试了标准方法,但它创建了矩形,这使得我的例子中的精灵区域更大。这是我的精灵套件模板测试项目: #import "WBMMyScene.h" static const

我需要在iPad精灵游戏中随机生成8个精灵对象。这些物体相当大,大小不一。它们不应该重叠。如果场景上的“繁殖”覆盖了一个,则会将其移除(可选),这将移除参考底图。 我一直在寻找一个像素完美的碰撞检测框架或帮助类的精灵工具包。到目前为止,我还没有找到一个教程或类似的东西。大多数人使用普通的碰撞检测,这对我的物体很大,没有任何帮助。我测试了标准方法,但它创建了矩形,这使得我的例子中的精灵区域更大。这是我的精灵套件模板测试项目:

#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

感谢您的时间:

据我所知,iOS7没有每像素物理特性,这是因为XCode 6已经进入测试阶段,现在开发者可以使用它。请记住,这是一个测试版,确实有一些bug,它的完整版本可能会在9月份发布iOS8和新的iPhone

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

我使用的工具是,可以拖放图像,然后以图形方式定义路径点并返回代码,它非常方便


我希望这有帮助

据我所知,iOS7没有每像素物理特性,这是因为XCode 6已经进入beta测试阶段,现在开发者可以使用。请记住,这是一个测试版,确实有一些bug,它的完整版本可能会在9月份发布iOS8和新的iPhone

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

我使用的工具是,可以拖放图像,然后以图形方式定义路径点并返回代码,它非常方便


我希望这有帮助

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

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

与此相反:

spaceship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spaceship.size];
使用以下命令:

spaceship.physicaBody = [SKPhysicsBody bodyWithTexture:spaceship.texture alphaThreshold:0.5f size:spaceship.size];

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

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

与此相反:

spaceship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spaceship.size];
使用以下命令:

spaceship.physicaBody = [SKPhysicsBody bodyWithTexture:spaceship.texture alphaThreshold:0.5f size:spaceship.size];

Gj@Andy,我会试试你用的工具。我正处于开发的最后阶段,不希望IDE bug干扰开发/发布的最后阶段。我在Xcode 5.1中遇到了错误,不需要新的错误:。很高兴知道iOS8/Xcode6将修复此问题。Gj@Andy,我将尝试您正在使用的工具。我正处于开发的最后阶段,不希望IDE bug干扰开发/发布的最后阶段。我在Xcode 5.1中遇到了错误,不需要新的错误:。很高兴知道iOS8/Xcode6会解决这个问题。嘿,jhabbott,我也在努力,我也尝试使用基于纹理和基于多边形的身体,它们在碰撞时工作得很好,但不适用于触摸Moved and didBeginContact,如果你想用自己的手来处理精灵,这实际上更重要,不依赖物理世界。请看我关于touchesMoved的问题。事实上,它也适用于didBeginContact,但不适用于touchesMoved。嘿,贾伯特,我也在努力,我也尝试使用基于纹理和基于多边形的身体,它们适用于碰撞,但不适用于touchesMoved和didBeginContact,如果你想用自己的双手来对付精灵,而不是依赖物理世界,那么这一点实际上更重要。请看我关于touchesMoved的问题。实际上,它对didBeginContact也很有效,但对touchesMoved不起作用。