2013-11-12 2 views
0

У меня есть рыба SKSpriteNode и расширенный крюк класса SKSpriteNode; Я пытаюсь объединить их вместе, когда они вступают в контакт, а затем они перемещаются вместе. Я использую этот код:Почему мои SKPhysicsJoints не работают?

[fish removeAllActions]; 
NSLog(@"Fish anchor is is (%f,%f)", fish.anchorPoint.x, fish.anchorPoint.y); 

CGPoint hp = CGPointMake(self.hook.frame.size.width/2, 0); 

fish.anchorPoint = CGPointMake(1, .5); 

CGPoint hookPoint = [self.scene convertPoint:hp fromNode:self.hook]; 
NSLog(@"Current fish position is (%f,%f)", fish.position.x, fish.position.y); 

NSLog(@"Hook point is (%f,%f)", hookPoint.x, hookPoint.y); 

SKAction *moveAction = [SKAction moveTo:hookPoint duration:.1]; 

SKAction * flip; 
if (fish.direction) //if going to the right, then turn -90 degrees 
    flip = [SKAction rotateToAngle:M_PI_4 duration:.1 ]; 
else 
    flip = [SKAction rotateToAngle:(-M_PI_2) duration:.1 ]; 

//[fish runAction:moveAction]; 
[fish runAction:[SKAction sequence:@[moveAction, flip]]]; 

SKPhysicsJointFixed *joint = 
      [SKPhysicsJointFixed jointWithBodyA:self.hook.physicsBody 
              bodyB:fish.physicsBody 
             anchor:hookPoint]; 



[self.physicsWorld addJoint:joint]; 
NSLog(@"Joined"); 

Я рыба разработана как таковые:

self.anchorPoint = CGPointMake(1, .05); 
[self setFishSize:[self getRandomSize]]; 
self.xScale *= .3; 
self.yScale *= .3;  
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size]; // 1 
self.physicsBody.collisionBitMask = 0; 
self.physicsBody.contactTestBitMask = hookCategory; 
self.physicsBody.categoryBitMask = fishCategory; 
self.physicsBody.usesPreciseCollisionDetection = true; 

и крюк как таковые:

_hook = [SKSpriteNode spriteNodeWithImageNamed:@"hook"]; 
    _hook.anchorPoint = CGPointMake(.5, 0); 


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

    _hook.position = CGPointMake(100, self.frame.size.height - self.hook.size.height/2); 
    _hook.physicsBody.dynamic = YES; 
    _hook.physicsBody.categoryBitMask = hookCategory; 
    _hook.physicsBody.contactTestBitMask = fishCategory; 
    _hook.physicsBody.collisionBitMask = 0; 
    _hook.physicsBody.usesPreciseCollisionDetection = YES; 
    _hook.physicsBody.affectedByGravity = false; 
    _hook.physicsBody.allowsRotation = false; 
    self.physicsWorld.gravity = CGVectorMake(0,0); 
    self.physicsWorld.contactDelegate = self; 

и все же, когда они соединяются, и я переместите крючок, рыба не придет. Есть ли какие-то вопиющие ошибки, которые я делаю?

Любая помощь очень ценится.

ответ

1

Вы должны иметь совместное образование в блоке действий, я предлагаю что-то вроде этого,

SKPhysicsJointFixed *joint = [SKPhysicsJointFixed jointWithBodyA:self.hook.physicsBody bodyB:fish.physicsBody anchor:hookPoint]; 

SKAction *createJoint = [SKAction runBlock:^{ 
[self.physicsWorld addJoint:joint];}] 

// run this action when the condition is met 
[fish runAction:[SKAction createJoint]]; 

Кроме того, я вижу, что вы используете много столкновений настройки (например, групп столкновений, ограничения вращения и т.д.) Я предлагаю вам использовать минимум (или не) для запуска и получения этой работы, а затем добавить настройку один за другим, чтобы гарантировать, что все это работает.

+0

спасибо, я попробую это. В чем разница между добавлением действия обычно, а не с помощью блока действий? – marina

+0

Таким образом вы также можете отсоединить и удалить сустав с помощью действия, чтобы он снова освободился. Так как я предполагаю, что крюк остается, но рыба должна отсоединиться от крючка и пойти в корзину или что-то еще. – user2421700

Смежные вопросы