【问题标题】:- (void)didBeginContact:(SKPhysicsContact *) refuses to fire- (void)didBeginContact:(SKPhysicsContact *) 拒绝触发
【发布时间】:2013-12-30 22:59:29
【问题描述】:

1) 我在 SKScene 标头上设置了委托协议:

@interface WorldScene : SKScene <SKPhysicsContactDelegate>

2) 我将委托设置为物理世界:

- (id) init
{
    self = [super init];
    if (self)
    {
        self.physicsWorld.gravity = CGVectorMake(0,0);
        self.physicsWorld.contactDelegate = self;
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    }
    return self;
}

3) 我设置了位掩码:

static const uint32_t playerCategory  =  0x1 << 0;
static const uint32_t wallsCategory  =  0x1 << 1;
static const uint32_t endCategory  =  0x1 << 2;

4) 我做我的播放器:

    SKSpriteNode *player = [[SKSpriteNode alloc] initWithColor:[SKColor blueColor] size:CGSizeMake(PLAYERSIZE, PLAYERSIZE)];
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size];
player.name = @"player";
player.physicsBody.dynamic = YES;
player.physicsBody.categoryBitMask = playerCategory;
player.physicsBody.collisionBitMask = wallsCategory;
player.physicsBody.contactTestBitMask = endCategory;

5)我做我的结束瓷砖:

SKSpriteNode *tile = [[SKSpriteNode alloc] initWithColor: [SKColor whiteColor] size:CGSizeMake(TILESIZE,TILESIZE)];

if ([cell isEnd]){
    tile.color = [SKColor greenColor];
    tile.name = @"endTile";
    tile.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: tile.size];
    NSLog(@"END TILE OF SIZE %f x %f", tile.size.width, tile.size.height);
    tile.physicsBody.dynamic = YES;
    tile.physicsBody.affectedByGravity = NO;
    tile.physicsBody.categoryBitMask = endCategory;
    tile.physicsBody.collisionBitMask = 0;
    tile.physicsBody.contactTestBitMask = playerCategory;

}

6) 但这永远不会被调用! :(

- (void)didBeginContact:(SKPhysicsContact *)contact
{

    NSLog(@"Touched!");
    [self removeAllChildren];
}

我正在做一个迷宫游戏。玩家当前与所有墙壁碰撞都很好,但我希望游戏在到达最后一个瓷砖时结束。目前,没有调用联系事件。我真的不知道出了什么问题,我将调试器输出设置为显示所有输出(无论如何,如果它到达事件,所有子级都应该被删除)。

为什么yyyyy

【问题讨论】:

  • 您确定if ([cell isEnd]) 块中的代码实际执行了吗?我们无法从您的代码中看出当时 isEnd 的设置是什么。
  • 是的,它正在执行——我的屏幕上确实出现了一个绿色磁贴。

标签: ios sprite-kit skphysicsbody


【解决方案1】:

已解决——原来从未调用过 init,因此实际上并未设置委托。将所有初始化代码移至 - (void) didMoveToView:(SKView *)view 并开始正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多