2014-05-07 2 views
1

Я работаю над простой тестовой игрой. У меня есть динамический объект, который сталкивается со стеной. Если скорость динамического объекта высока (я думаю, что это причина), объект идет через стену. Кто-нибудь знает, как это исправить?SpriteKIt - Динамический объект сталкивается со стеной и прогулочным корытом

Стена:

// Create wall ... 
    CGRect rect = CGRectMake(0, 0, 25, self.frame.size.height); 
    SKNode *wallNode = [SKNode node]; 
    wallNode.position = CGPointMake(CGRectGetMidX(self.frame) + rect.size.width * 0.5,          250); 
    wallNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rect.size]; 
    wallNode.physicsBody.dynamic = NO; 
    wallNode.physicsBody.categoryBitMask = CollisionTypeNet; 
    [self addChild:wallNode]; 

игрока:

SKSpriteNode *player = [SKSpriteNode spriteNodeWithImageNamed:@"player"]; 

player.name = playerCategoryName; 

player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame.size]; 
player.physicsBody.restitution = 0.1f; 
player.physicsBody.friction = 0.0f; 
player.physicsBody.dynamic = YES; 

player.physicsBody.categoryBitMask = CollisionTypePlayer; 
player.physicsBody.collisionBitMask = CollisionTypeNet ; 
player.physicsBody.contactTestBitMask = CollisionTypeWall; 
[self addChild:player]; 
+1

Хммм без согласования (ненулевой) контакта битмаски не может быть никакого столкновения. Для высокой скорости используйте точное столкновение: https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/Reference/Reference.html#//apple_ref/occ/instp/SKPhysicsBody/usesPreciseCollisionDetection – LearnCocos2D

ответ

0

Высокая скорость "проходят проходные" являются распространенной проблемой. Как указано в Cocos, установите usesPreciseCollisionDetection в true для вашего игрового объекта.

Вы также должны применять ограничение скорости для более быстрых движущихся объектов, так как usesPreciseCollisionDetection не гарантирует работу на очень быстро движущихся объектах.

Вы можете использовать колпачок скорости, как это:

if(mySpriteA.physicsBody.velocity.dx > 50) 
    mySpriteA.physicsBody.velocity = CGVectorMake(50, mySpriteA.physicsBody.velocity.dy); 
if(mySpriteA.physicsBody.velocity.dx < -50) 
    mySpriteA.physicsBody.velocity = CGVectorMake(-50, mySpriteA.physicsBody.velocity.dy); 
if(mySpriteA.physicsBody.velocity.dy > 50) 
    mySpriteA.physicsBody.velocity = CGVectorMake(mySpriteA.physicsBody.velocity.dx, 50); 
if(mySpriteA.physicsBody.velocity.dy < -50) 
    mySpriteA.physicsBody.velocity = CGVectorMake(mySpriteA.physicsBody.velocity.dx, -50); 
+0

как это сделать применить ограничение скорости? –

+0

Дополнительный вопрос по теме. Я обновляю позицию объекта, когда «touchesMoved» Я зарегистрировал скорость объекта и независимо от того, какая скорость все еще равна dx: 0.0 и dy 0.0. Является ли способ, которым я вообще обновляю позицию объекта? – DeVladinci

+0

@DeVladinci - Что? – sangony

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