【问题标题】:Detecting collision between objects in array in sprite kit检测精灵套件中数组中对象之间的碰撞
【发布时间】:2014-05-13 05:46:13
【问题描述】:

我正在尝试制作一个游戏,其中障碍物从屏幕顶部落下,玩家必须尝试避开它们,但 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 方法,我找不到我的代码有什么问题 感谢所有帮助...

【问题讨论】:

  • 您能检测到与此代码的冲突吗?您在使用此代码时遇到的确切问题是什么?你需要什么帮助?
  • 不,我无法检测到任何碰撞(我检查了 NSLogs)并且没有调用 didBeginContact 方法,plc 帮助
  • 不要像您的情况那样不必要地设置类别位掩码,请参阅:stackoverflow.com/a/22804376/201863
  • 好吧,这有点道理,所以你建议我去掉类别位掩码行? @LearnCocos2D

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


【解决方案1】:

sknode 大小设置不正确,因为没有图像参考,如果你记录它的大小 if 应该是 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 节点。 希望这会有所帮助。

【讨论】:

  • 不,我确实有那行,我只是认为很明显我有它,而且我有一堆与碰撞无关的其他代码,所以我把它排除在帖子之外。我的错。
  • 您是否在代码中以任何方式缩放节点或操纵物理体?
  • 不,我不知道,你觉得分配位掩码的部分有什么问题吗?
  • 我想我首先发现了问题,其次我复制并粘贴了您的代码的位分配没有问题,问题出在以下行 player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame。尺寸];将其更改为以下行,它应该可以工作 player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spritePlayer.size];
  • 这有什么问题吗?顺便说一句,感谢您解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多