2013-09-27 2 views
2

У меня возникли проблемы с тем, что мое физическое тело стены непроницаемо. Если физическое тело игрового узла сталкивается со стенкой с медленной «скоростью», оно останавливается. Однако, если он идет с быстрой «скоростью», он проходит через стену. Мой игрок перемещается на PanGestureRecognizer. По скорости я в основном имею в виду, если происходит внезапное «быстрое» салфетки или если жест не является приличным медленным движением, то игрок проходит через стену. Это мои узловые свойства:Изготовление SKPhysicsBody непроницаемо?

self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.player.size]; 
    self.player.physicsBody.categoryBitMask = SVGPlayerCategory; 
    self.player.physicsBody.contactTestBitMask = SVGWallCategory; 
    self.player.physicsBody.collisionBitMask = SVGWallCategory; 
    self.player.physicsBody.dynamic = YES; 
    self.player.physicsBody.usesPreciseCollisionDetection = YES; 
    self.player.physicsBody.velocity = CGVectorMake(0, 0); 

     self.leftWall.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftWall.size]; 
     self.leftWall.physicsBody.categoryBitMask = SVGWallCategory; 
     self.leftWall.physicsBody.contactTestBitMask = SVGPlayerCategory; 
     self.leftWall.physicsBody.collisionBitMask = SVGPlayerCategory; 
     self.leftWall.physicsBody.dynamic = NO; 
     self.leftWall.physicsBody.resting = YES; 

Если это помогает, это мой метод ход:

-(void)dragPlayer: (UIPanGestureRecognizer *)gesture { 

     CGPoint translation = [gesture translationInView:self.view]; 

     SKAction *move = [SKAction moveByX:translation.x y:-translation.y duration:0]; 
     [self.player runAction:move]; 
     [gesture setTranslation:CGPointMake(0, 0) inView:self.view]; 
    } 

Есть ли что-то мне не хватает?

ответ

4

Обычно в чисто физическом мире, обеспечивающем точное обнаружение столкновения, достаточно.

Однако, поскольку вы позволяете пользователю позиционировать тело, ничего не мешает пользователю установить положение тела где-то внутри стены или просто полностью пропустить стену. Затем контактное разрешение Box2D входит в систему и перемещает тело вне столкновения, которое в зависимости от того, где было размещено тело внутри стены, приведет к перемещению тела на другую сторону.

Использование действий в этом случае является контрпродуктивным. Если прикосновения создают новую позицию в каждом кадре, движение не происходит, но это приводит к тому, что тело устанавливается в заданное положение. Попробуйте изменить код, чтобы установить позицию игрока напрямую, чтобы узнать, не имеет значения.

Также обратите внимание, что действия перемещения полностью игнорируют мир физики. Если вы произведете движение, идущее от одной стороны стены к другой, то действие перемещения продолжит обновлять положение тела физиков в каждом кадре, а тело затем разрешает свои контакты по пути, и в конечном итоге это будет «квантовый туннель», от одной стороны стены до другой.

Частично ответственным за эту проблему могут быть большие расстояния между двумя точками касания, когда пользователь быстро проводит поиск. Возможно, вы должны использовать физический мир bodyAlongRayStart: end: метод для проверки наличия блокирующего тела между текущей и целевой позицией (перевод жестов), и если это так, отмените движение.