2014-06-28 103 views
0

你好开发伙伴,雪碧套件忽略有时联系

我是新来的雪碧套件,刚开始实施物理到我的游戏。我只有两个需要接触的精灵。一个是主角,一个是蝴蝶“萤火虫”,另一个是能量球,在接触时给予主角健康。

但是我的游戏中发生了一些奇怪的事情,尽管我实现了我所有的物理线路工作,有时候,在某些我不明白的条件下,能量球会穿过主角并忽略联系人和联系人实施的效果应该发生。然后,我必须积极寻找能量球,以便它发生,并尝试触摸它不同的时间才能成功。

我希望接触总是会发生,不管能量是否偶然碰到我,或者我主动寻找它。当这两个精灵以任何方式接触时都应该发生接触。我试了一切,最后决定寻求帮助。

这里是我的委托:

@interface CloudScene() <SKPhysicsContactDelegate> 

请注意,我在固定的问题,希望增加这些属性,但问题是在他们之前:

@property(assign, nonatomic) uint32_t contactTestBitMask; 
@property(nonatomic) BOOL usesPreciseCollisionDetection; 

static const uint32_t bflyCategory = 0x1 << 0; 
static const uint32_t energyCategory = 0x1 << 1; 

initWithSize方法:

self.physicsWorld.gravity = CGVectorMake(0, 0); 
self.physicsWorld.contactDelegate = self; 

两者的物理(通知碰撞被设置为0之前和问题仍然存在,我只增加他们在希望的弹跳效果至少会不会让球笔直地穿过bfly字符,但没有工作):

_bfly.name = @"bflyNode"; 
    _bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 
    _bfly.physicsBody.categoryBitMask = bflyCategory; 
    _bfly.physicsBody.contactTestBitMask = energyCategory; 
    _bfly.physicsBody.collisionBitMask = bflyCategory | energyCategory; 
    _bfly.physicsBody.usesPreciseCollisionDetection = YES; 
    _bfly.physicsBody.dynamic = YES; 
    _bfly.physicsBody.affectedByGravity = NO; 
    _bfly.physicsBody.mass = 1; 


energyball.name = @"energyballNode"; 
energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 
energyball.physicsBody.categoryBitMask = energyCategory; 
energyball.physicsBody.contactTestBitMask = bflyCategory; 
energyball.physicsBody.collisionBitMask = energyCategory | bflyCategory; 
energyball.physicsBody.usesPreciseCollisionDetection = YES; 
energyball.physicsBody.dynamic = YES; 
energyball.physicsBody.affectedByGravity = NO; 
energyball.physicsBody.mass = 1; 

最后这里是我的didBeginContact方法:提前

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

SKPhysicsBody *bfly; 
SKPhysicsBody *energyball; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    bfly = contact.bodyA; 
    energyball = contact.bodyB; 
} 
else 
{ 
    bfly = contact.bodyB; 
    energyball = contact.bodyA; 
} 

if ((bfly.categoryBitMask & bflyCategory) != 0) 
{ 

    SKNode * energyball = (contact.bodyA.categoryBitMask & bflyCategory) ? contact.bodyB.node : contact.bodyA.node; 
    SKAction*energySound = [SKAction playSoundFileNamed:@"Energybell.m4a" waitForCompletion:NO]; 
    [energyball runAction:energySound]; 
    energyball.hidden = YES; 
    [self addChild:[self FenergyNode:@"energy"]]; 
    [self adjustScoreBy:2]; 
    [scoreLabel setText: [NSString stringWithFormat:@"Score: %d", [GameState sharedInstance].score]]; 
    _bflyHP =MAX(0, _bflyHP+100); 
    [energyball runAction:[SKAction removeFromParent]]; 


} 

} 

谢谢!

回答

0

我想你搬起石头砸自己的脚这一行:

SKNode * energyball = (contact.bodyA.categoryBitMask & bflyCategory) ? 
              contact.bodyB.node : contact.bodyA.node; 

如果我正确理解你的代码,能量球categoryBitMask永远不会设置为bflyCategory。因此你总是选择bodyA的节点。由于A和B可以随时改变,依靠energyBall总是身体A在某个时刻很容易失败。

此外,您之前已选择SKPhysicsBody* energyBall,您应该使用它。这也应该带来一个编译器警告,如“x shadows局部变量y”,因为它们使用相同的标识符(变量名)。

尝试更换上面的行:

SKNode* ball = energyball.node; 

和变化的SKNode* energyball任何用来ball

0

即使修复代码后问题仍然存在。但我现在更深入地研究它,并可以解释接触如何失败。

看来只有当主角(bfly)离开它时,能量球才会检测到接触。一切都变得完美了。

但是,如果我朝它走,接触是完全忽略。

就好像能量球正在选择框架的特定部分,或运动成为一个有效的球体。

我的目标是让这两个精灵接触,无论我朝着什么方向前进,或者接触什么角度的精灵。

我的猜测是,这个问题可能在于以下几行代码:

_bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 

energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 

或许我应该与其他类型的物理机构的实验吗?或者问题可能在另一个区域?

不管怎么说,这是我的新代码:

@interface CloudScene() <SKPhysicsContactDelegate> 

@property(assign, nonatomic) uint32_t contactTestBitMask; 
@property(nonatomic) BOOL usesPreciseCollisionDetection; 

static const uint32_t bflyCategory = 0x1 << 1; 
static const uint32_t energyCategory = 0x1 << 2; 

- (ID)initWithSize: “...”:

self.physicsWorld.gravity = CGVectorMake(0, 0); 
    self.physicsWorld.contactDelegate = self; 

    _bfly.name = @"bflyNode"; 
    _bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 
    _bfly.physicsBody.categoryBitMask = bflyCategory; 
    _bfly.physicsBody.contactTestBitMask = energyCategory; 
    _bfly.physicsBody.collisionBitMask = 0; 
    _bfly.physicsBody.usesPreciseCollisionDetection = YES; 
    _bfly.physicsBody.dynamic = YES; 
    _bfly.physicsBody.affectedByGravity = NO; 

energyball.name = @"energyballNode"; 
energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 
energyball.physicsBody.categoryBitMask = energyCategory; 
energyball.physicsBody.contactTestBitMask = bflyCategory; 
energyball.physicsBody.collisionBitMask = 0; 
energyball.physicsBody.usesPreciseCollisionDetection = YES; 
energyball.physicsBody.dynamic = YES; 
energyball.physicsBody.affectedByGravity = NO; 

,最后我的新didBeginContact方法:

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

SKPhysicsBody *bfly; 
SKPhysicsBody *energyball; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    bfly = contact.bodyA; 
    energyball = contact.bodyB; 
} 
else 
{ 
    bfly = contact.bodyB; 
    energyball = contact.bodyA; 
} 



if ((bfly.categoryBitMask & bflyCategory) != 0 && 
    (energyball.categoryBitMask & energyCategory) != 0) 
{ 
    //EDITED HERE 

SKNode* ball = energyball.node; 
SKAction*energySound = [SKAction playSoundFileNamed:@"Energybell.m4a" waitForCompletion:NO]; 
[ball runAction:energySound]; 
[self addChild:[self FenergyNode:@"energy"]]; 
[self adjustScoreBy:2]; 
[scoreLabel setText: [NSString stringWithFormat:@"Score: %d", [GameState sharedInstance].score]]; 
_bflyHP =MAX(0, _bflyHP+100); 
[ball runAction:[SKAction removeFromParent]]; 


} 

} 

希望有人可以找到解决这个问题的解决方案,因为我一直在努力与我的代码8天withou现在取得任何结果。

我试图在评论中写这篇文章,但是这个网站使它们太短,所以我无法解释我的情况的深度。

再次提前致谢。