我有一个玩家角色和一个地砖。在这两个物理实体上,我将restitution
设置为0.
要跳转,我直接设置播放器的velocity.dy
。当玩家由于重力而重新回到地面时,大多数情况下它可以工作,或者似乎。
当我反复跳跃时出现问题。如果我在玩家降落时向右跳,则会有一些反弹,玩家在下次反弹时达到的高度并不总是与初始反弹相匹配。
当用户登陆时,我尝试了各种方法强制velocity.dy
为0,但没有任何方法可以解决奇怪的跳跃问题。如何才能正确,平稳地进行物理跳跃?
答案 0 :(得分:2)
老实说,我不确定你要完成什么。通常我们不应该混淆物体的速度。在典型的Spritekit游戏中,我们必须将其视为“真实世界”的情况,并且通常对该对象施加压力或冲动。
我怀疑你正试图制作类似马里奥的游戏。你所要做的就是对物理世界施加足够大的重力,并在精灵上施加冲动以跳跃(在touchesBegan委托上)。
刚才我继续在Spritekit中做了一个简单的马里奥跳转场景。这就是我通过为y分量设置重力-30并在mario精灵上设置脉冲y = 100而得到的结果。 (帧速率很差。在模拟器/设备上看起来更好)
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)];