我不同意不使用物理学来处理碰撞和接触。您实际上只是想通过不使用物理学并实现自己的自定义代码来重新发明轮子。
如果您使用的是 Tiled 应用程序,那么分配物理体是一项简单的任务。使用平铺中的对象来分配各种身体类型。然后,您可以在您的代码中为每种对象类型创建一个特定的主体。
例如:
在上图中,我创建了一个 45 度右侧倾斜的地板。我添加的对象称为 floor45R。
下一步是解析您的地图对象。在 45floorR 的情况下,您可以创建一个像这样的物理体:
NSArray *arrayObjects = [group objectsNamed:@"floor45R"];
for (NSDictionary *dicObj in arrayObjects) {
CGFloat x = [dicObj[@"x"] floatValue];
CGFloat y = [dicObj[@"y"] floatValue];
CGFloat w = [dicObj[@"width"] floatValue];
CGFloat h = [dicObj[@"height"] floatValue];
SKSpriteNode *myNode = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(w, h)];
myNode.position = CGPointMake(x, y);
myNode.zPosition = 100;
CGMutablePathRef trianglePath = CGPathCreateMutable();
CGPathMoveToPoint(trianglePath, nil, -myNode.size.width/2, myNode.size.height/2);
CGPathAddLineToPoint(trianglePath, nil, myNode.size.width/2, -myNode.size.height/2);
CGPathAddLineToPoint(trianglePath, nil, -myNode.size.width/2, -myNode.size.height/2);
CGPathAddLineToPoint(trianglePath, nil, -myNode.size.width/2, myNode.size.height/2);
myNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:trianglePath];
myNode.physicsBody.dynamic = NO;
myNode.physicsBody.restitution = 0;
myNode.physicsBody.friction = 0.0;
myNode.physicsBody.categoryBitMask = CategoryFloor45;
myNode.physicsBody.collisionBitMask = 0x00000000;
CGPathRelease(trianglePath);
[worldNode addChild:myNode];
}
这适用于任何程度的地板坡度。请记住将您的播放器和任何其他节点的碰撞位掩码设置为与地板碰撞。
为了让你的玩家在倾斜的地板上平稳移动,我建议将玩家的物理身体分成两部分。底部是一个圆形,顶部是一个矩形。圆圈将防止卡在由 2 个连接物理体引起的任何潜在裂缝中。
SKPhysicsBody *firstBody = [SKPhysicsBody bodyWithCircleOfRadius:10 center:CGPointMake(0, 0)];
SKPhysicsBody *secondBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(5, 50) center:CGPointMake(0, 10)];
self.physicsBody = [SKPhysicsBody bodyWithBodies:@[firstBody, secondBody]];
您必须调整位置和中心坐标以匹配您的精灵图像。