【问题标题】:Collision not being detected未检测到碰撞
【发布时间】:2014-05-15 21:05:23
【问题描述】:

我有两个精灵,我的玩家和一堵墙(来自瓷砖地图)发生碰撞。下面我粘贴了播放器和墙的代码

Player.m
    - (instancetype)init {
        SKTextureAtlas *atlas =
        [SKTextureAtlas atlasNamed: @"char"];
        SKTexture *texture = [atlas textureNamed:@"player"]; texture.filteringMode = SKTextureFilteringNearest;
        if (self = [super initWithTexture:texture])
        { self.name = @"player";
            CGFloat minDiam = MIN(self.size.width, self.size.height);
            minDiam = MAX(minDiam-16, 4);
            self.physicsBody =
            [SKPhysicsBody bodyWithCircleOfRadius:minDiam/2.0];
            self.physicsBody.categoryBitMask=PCPlayerCategory;    
            self.physicsBody.collisionBitMask =
            PCWallCategory;
            self.physicsBody.allowsRotation = NO;
            self.physicsBody.restitution = 0;
            self.physicsBody.friction = 0;
            self.physicsBody.linearDamping = 0;
        }
        return self;
    }

tilemap.m

        SKSpriteNode *tile = [layer tileAtCoord:coord];
        tile.name=@"wall";
        tile.physicsBody =
        [SKPhysicsBody bodyWithRectangleOfSize:tile.size];
        tile.physicsBody.categoryBitMask = PCWallCategory;
          tile.physicsBody.collisionBitMask =
          PCPlayerCategory;
        tile.physicsBody.dynamic = NO;
        tile.physicsBody.friction = 0;
          tile.physicsBody.restitution=0;

在我的 mainscene.m 中

- (void)didBeginContact:(SKPhysicsContact *)contact {
  uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
  if (collision == (PCWallCategory|PCPlayerCategory)) {
    NSLog(@"SUCCESS"); }

但是,即使我的播放器坐在我的墙上,我也看不到 NSLog 出现,希望得到一些帮助和洞察力。 谢谢

- (void)didBeginContact:(SKPhysicsContact *)contact {
  uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
  if (collision == (PCWallCategory|PCPlayerCategory)) {

    NSLog(@"SUCCESS");
    onGround=YES;
  }else
  {
    onGround=NO;
  }

}

【问题讨论】:

  • categoryBitMask使用不正确...stackoverflow.com/a/22804376/201863
  • 您需要使用相同的值设置contactTestBitMask,而不是collisionBitMask。
  • @LearnCocos2D 感谢阅读它解决了我的问题

标签: xcode5 sprite-kit


【解决方案1】:

collisionTestBitMask 只定义了哪些类型的物体可以与physicsBody 发生碰撞。为了在两个body碰撞时触发contact delegate,需要设置contactTestBitMask

所以,physicsBody 应该这样定义:

self.physicsBody.categoryBitMask=PCPlayerCategory;    
self.physicsBody.contactTestBitMask = PCWallCategory;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2015-03-27
    • 2015-03-07
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多