在spritekit中反复跳转时停止反弹

时间:2016-11-10 03:05:55

标签: ios swift sprite-kit

我有一个玩家角色和一个地砖。在这两个物理实体上,我将restitution设置为0.

要跳转,我直接设置播放器的velocity.dy。当玩家由于重力而重新回到地面时,大多数情况下它可以工作,或者似乎。

当我反复跳跃时出现问题。如果我在玩家降落时向右跳,则会有一些反弹,玩家在下次反弹时达到的高度并不总是与初始反弹相匹配。

当用户登陆时,我尝试了各种方法强制velocity.dy为0,但没有任何方法可以解决奇怪的跳跃问题。如何才能正确,平稳地进行物理跳跃?

gif of issue

1 个答案:

答案 0 :(得分:2)

老实说,我不确定你要完成什么。通常我们不应该混淆物体的速度。在典型的Spritekit游戏中,我们必须将其视为“真实世界”的情况,并且通常对该对象施加压力或冲动。

我怀疑你正试图制作类似马里奥的游戏。你所要做的就是对物理世界施加足够大的重力,并在精灵上施加冲动以跳跃(在touchesBegan委托上)。

刚才我继续在Spritekit中做了一个简单的马里奥跳转场景。这就是我通过为y分量设置重力-30并在mario精灵上设置脉冲y = 100而得到的结果。 (帧速率很差。在模拟器/设备上看起来更好)

enter image description here

PhysicsWorld设置:

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

Mario和平台精灵设置代码:

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)];