如何跳过物理 body(如平台)并降落在上面 (SpriteKit)

How to jump through a physic body (like a platform) and land on it (SpriteKit)

我正在尝试在 Objective-C 中创建一款游戏,例如 Mario / Sonic。

目前它运行良好,但我仍然无法弄清楚如何让我的英雄在他站在下面但可以站在上面时跳过物理 body。

我试图在英雄位置高于平台时创建物理 [​​=18=] 并再次禁用它。

这个问题的答案实际上并不太难,但是将其实施到一个成熟的游戏中对您来说会困难得多。这不是新手程序员可以开始的东西。

第一个相同的代码项目(tap/click 在屏幕上跳转):

#import "GameScene.h"

typedef NS_OPTIONS(uint32_t, Level1PhysicsCategory) {
    CategoryPlayer  = 1 << 0,
    CategoryFloor0  = 1 << 1,
    CategoryFloor1  = 1 << 2,
};

@implementation GameScene {
    int playerFloorLevel;
    SKSpriteNode *node0;
    SKSpriteNode *node1;
    SKSpriteNode *node2;
}

-(void)didMoveToView:(SKView *)view {
    self.backgroundColor = [SKColor whiteColor];

    node0 = [SKSpriteNode spriteNodeWithColor:[SKColor grayColor] size:CGSizeMake(400, 10)];
    node0.position = CGPointMake(300, 200);
    node0.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node0.size];
    node0.physicsBody.dynamic = NO;
    node0.physicsBody.categoryBitMask = CategoryFloor0;
    node0.physicsBody.collisionBitMask = CategoryPlayer;
    [self addChild:node0];

    node1 = [SKSpriteNode spriteNodeWithColor:[SKColor grayColor] size:CGSizeMake(400, 10)];
    node1.position = CGPointMake(300, 300);
    node1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node1.size];
    node1.physicsBody.dynamic = NO;
    node1.physicsBody.categoryBitMask = CategoryFloor1;
    node1.physicsBody.collisionBitMask = CategoryPlayer;
    [self addChild:node1];

    node2 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(50, 50)];
    node2.position = CGPointMake(300, 250);
    node2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node2.size];
    node2.physicsBody.categoryBitMask = CategoryPlayer;
    node2.physicsBody.collisionBitMask = CategoryFloor0;
    [self addChild:node2];

    playerFloorLevel = 0;
}

-(void)update:(CFTimeInterval)currentTime {
    if(((node2.position.y-25) > (node1.position.y+10)) && (playerFloorLevel == 0)) {
        node2.physicsBody.collisionBitMask = CategoryFloor0 | CategoryFloor1;
        playerFloorLevel = 1;
    }
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     for (UITouch *touch in touches) {
         CGPoint touchLocation = [touch locationInNode:self];
        //SKNode *node = [self nodeAtPoint:touchLocation];

        // change 75 value to 50 to see player jump half way up through floor 1
        [node2.physicsBody applyImpulse:CGVectorMake(0, 75)];
    }
}

代码的要点是玩家节点 (node2) 必须不断检查其相对于其他楼层的 y 位置(更新方法)。在示例中,玩家通过 floor1 跳起来。一旦玩家高于 floor1,玩家节点的物理体修改其碰撞位掩码以包括 floor1。

听起来很简单。但是,在真实游戏中,您将拥有大量楼层,并且所有楼层的间距可能不均匀。编码时必须牢记所有这些。