2016-11-10 3 views
1

У меня есть персонаж игрока и наземная плитка. На обоих физических телах у меня есть restitution, установленный в 0.Остановка отскока при повторном прыжке в spritekit

Чтобы прыгать, я прямо установил velocity.dy плеера. Когда игрок возвращается на землю из-за силы тяжести, по большей части он работает или кажется.

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

Я пробовал различные способы заставить velocity.dy 0, когда пользователь приземлился, но ничего не исправляет странную проблему прыжка. Как я могу правильно и плавно провести последовательный переход физики?

gif of issue

+1

Я предлагаю вам использовать импульс для прыжка. Не изменяя скорость напрямую. – GeneCode

+1

вы можете использовать обнаружение столкновений с наземными плитами и установить player.physicsBody.velocity = CGvectorMake (0.0,0.0); что бы решить проблему ур – dragoneye

+0

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

ответ

1

Честно говоря, я не уверен, что вы пытаетесь достичь. Обычно мы не должны возиться со скоростями объектов. В типичной игре Spritekit мы должны относиться к ней как к ситуации «реального мира» и вообще применять силу или импульс к объекту.

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

Только что я пошел вперед и сделал простой сценарий перехода на Марио в Spritekit. И это то, что я закончил, установив гравитацию -30 для y-компонента и импульс y = 100 в мариовом спрайте. (Частота кадров плохо выглядит лучше на тренажере/устройства.) Настройка

enter image description here

PhysicsWorld:

[self.physicsWorld setGravity:CGVectorMake(0, -30)]; 
self.physicsWorld.contactDelegate = self; 

Марио и платформы код установки спрайтов:

SKSpriteNode *platform = [SKSpriteNode spriteNodeWithImageNamed:@"platform"]; 
platform.position = CGPointMake(view.frame.size.width/2.0,0); 
platform.name = @"platform"; 
platform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:platform.frame.size]; 
platform.physicsBody.categoryBitMask = platformCategory; 
platform.physicsBody.dynamic = NO; 
platform.physicsBody.usesPreciseCollisionDetection = YES; 
platform.physicsBody.affectedByGravity = NO; 
[self addChild:platform]; 

SKSpriteNode *mario = [SKSpriteNode spriteNodeWithImageNamed:@"mario"]; 
mario.position = CGPointMake(view.frame.size.width/2.0, 400); 
mario.name = @"mario"; 
mario.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:mario.frame.size]; 
mario.physicsBody.categoryBitMask = marioCategory; 
mario.physicsBody.dynamic = YES; 
mario.physicsBody.usesPreciseCollisionDetection = YES; 
mario.physicsBody.contactTestBitMask = platformCategory; 
mario.physicsBody.affectedByGravity = YES; 
[self addChild:mario]; 

touchesBegan:

SKSpriteNode *mario = (SKSpriteNode*)[self childNodeWithName:@"mario"]; 
[mario.physicsBody applyImpulse:CGVectorMake(0, 100)]; 
+0

Выключает ограничительную рамку, которую я использовал для столкновения, которая не была частью движения/физики, имела массу, линейное демпфирование и реституцию, которые приковывали мое движущееся физическое тело, вызвало все проблемы. Если вы сделаете это как отправленный @Rocotilos, это абсолютно сработает. –

+1

Спасибо, что приняли ответ. Рад мог помочь. Я хотел бы добавить, что вам нужно следить за делегатом physcontactact, чтобы запретить двойной прыжок (например, повторное нажатие на экране). (С другой стороны, в какой-то игре есть возможность удваивать прыжок). В любом случае вам нужно обработать это отдельно. – GeneCode

+0

пс. Удачи вам в вашей игре. : D – GeneCode

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