objective-c - 检测 Sprite 套件中数组中的对象之间的碰撞

标签 objective-c xcode5 collision-detection sprite-kit collision

我正在尝试制作一款游戏,其中障碍物从屏幕顶部落下,玩家必须尝试避开它们,但是 didBeginContact 方法没有被调用,这让我发疯。这是我的代码中与节点冲突相关的部分...

//myScene.h
@interface MyScene : SKScene <SKPhysicsContactDelegate>

//myScene.m
@implementation MyScene

static const uint32_t playerCategory = 0x1 << 0;
static const uint32_t obstacleCategory = 0x1 << 1;

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        //setup scene
        self.backgroundColor = [SKColor whiteColor];
        self.physicsWorld.gravity = CGVectorMake(0, 0);
        self.physicsWorld.contactDelegate = self;
        obstacles = [NSMutableArray array];

        //add player node
        player = [SKNode node];
        SKSpriteNode *spritePlayer = [SKSpriteNode spriteNodeWithImageNamed:@"black.png"];
        spritePlayer.size = CGSizeMake(50, 50);
        spritePlayer.position = CGPointMake(self.frame.size.width/2, 100);
        player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame.size];
        player.physicsBody.dynamic = NO;
        player.physicsBody.mass = 0.02;
        [player addChild:spritePlayer];

        player.physicsBody.categoryBitMask = playerCategory;
        player.physicsBody.contactTestBitMask = obstacleCategory;
        player.physicsBody.collisionBitMask = 0;
        player.physicsBody.usesPreciseCollisionDetection = YES;

        [self addChild:player];
        [self spawnNewObstacles];

    }
    return self;
}

- (void)spawnNewObstacles
{
    //spawn obstacles
    obstacle = [SKSpriteNode spriteNodeWithImageNamed:@"black.png"];

    obstacle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:obstacle.frame.size];
    obstacle.physicsBody.dynamic = YES;

    obstacle.physicsBody.categoryBitMask = obstacleCategory;
    obstacle.physicsBody.contactTestBitMask = playerCategory;
    obstacle.physicsBody.collisionBitMask = 0;
    obstacle.physicsBody.usesPreciseCollisionDetection = YES;
}

-(void)didBeginContact:(SKPhysicsContact *)contact
{
    NSLog(@"didBeginContact Called!");

}

didBeginContact 方法没有被调用,我找不到我的代码有什么问题 感谢所有帮助...

最佳答案

sknode 大小未正确设置,因为没有图像引用,如果您记录其大小,则应为 inf,当我测试您的代码时,我返回了异常。

要修复此错误,请更改以下行

player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame.size]; change that to 

下面的内容应该可以工作

player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spritePlayer.size];

正如我在下面所说的,只需放弃播放器 sknode,它只是多余的,除非有充分的理由使用它。 ///////之前的答案

我忍不住注意到您没有将障碍物节点添加到任何父节点(即场景),就像您使用此行对玩家节点所做的那样

[self addChild:player];

你需要对障碍节点做同样的事情

[self addChild:obstacle];

,令我惊讶的是,您没有提到在屏幕上看不到这些节点,除非您将它们添加到代码中未包含的不同部分中,那么此时我建议您记录两个节点的位置节点以了解事物在屏幕上的位置。

至于数组,你不需要它,你所要做的就是为每个障碍节点命名,例如@“obstacle”,然后你可以使用以下方法访问具有该名称的所有节点

obstacle.name = @"obstacle";

/////later when you want to check for node removal

[self enumerateChildNodesWithName:@"obstacle" usingBlock:^(SKNode *node, BOOL *stop) {
    SKSpriteNode *child = (SKSpriteNode*)node;
    if (child.position.y <0){ //or any arbitrary condition
         [child removeFromParent];
    }
}];

最后,我看不出使用播放器作为 sknode 然后向其添加 skspritenode 的意义,除非我遗漏了一些东西! :) 。您可以简单地放弃玩家 sknode 并简单地使用 spritePlayer 节点。 希望这会有所帮助。

关于objective-c - 检测 Sprite 套件中数组中的对象之间的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803052/

相关文章:

即使使用相同的RGB,Xcode也会使颜色变暗一些阴影

ios - 归档我的项目时 Apple Mach-O 链接器错误

ios - 使用 CLPlacemark、administrativeArea、iOS6/iOS7 改变内容

安卓 : AndEngine pixel perfect collision GLES2?

objective-c - 自定义 NSView 中的 initWithtFrame 方法中未设置标识符

objective-c - 如何根据 iOS 上的 touchMove 事件在屏幕上绘制动态矩形

objective-c - UIWebView 缩放页面,无需水平滚动

ios - 如何清除 iPad 中 iOS 7.1 中的 UIWebView 缓存?

algorithm - Sphere - 球体碰撞检测 -> react

javascript - Createjs碰撞问题localToLocal not a function错误