Я создал SKSpriteNode
, позвони, скажем Карта, у которой есть путь кромки, который я определил (некоторая простая форма многоугольника).SpriteKit SKPhysicsBody с внутренними краями
То, что я пытаюсь выяснить, как добавить несколько других краев дорожки, которые будут действовать в качестве внутренних краев Карты. Как будто «карта» в целом действительно имела отверстия. Своего рода внутренних граничных форм, которые могли бы действовать с Карта в целом: один реберный путь (как показано ниже)
Я понимаю, что есть метод, который позволяет для создания SKPhysicsBody
с (некоторые NSArray), такие как
Map.physicsBody = [SKPhysicsBody bodyWithBodies:bodiesArray];
Этот метод фактически генерирует то, что я показал на изображении? Предполагая, что bodiesArray
содержит каждый 3 SKSpriteNode
«s с определенной траекторией с использования такого метода:
+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path
, с созданием пути такого
SKSpriteNode *innerNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"map"];
CGMutablePathRef innerNode1Path = CGPathCreateMutable();
CGPathMoveToPoint(mapPath, NULL, 1110, 1110);
CGPathAddLineToPoint(mapPath, NULL, <some x1>, <some y1>);
CGPathAddLineToPoint(mapPath, NULL, <some x2>, <some y2>);
CGPathAddLineToPoint(mapPath, NULL, <some x3>, <some y3>);
.
.
.
CGPathCloseSubpath(mapPath);
innerNode1.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:innerNode1Path];
[bodiesArray addObject:innerNode1];
// Repeat for other 2 nodes
Я понимаю, что альтернатива была бы создать- отдельные узлы с расположением и формой предполагаемых «дыр», но я привязываюсь, чтобы не создавать больше узлов, чем мне нужно. Если кто-то может подтвердить, что я пытаюсь сделать, это правильно или, возможно, предложите альтернативу, о которой я не знаю.
ПРИМЕЧАНИЕ: ЕСЛИ то, что я делаю, правильно, но я что-то упускаю, я был бы признателен, внутренний квадрат меньшего размера был бы большим). Благодаря!
EDIT 1: Ниже приведен фрагмент кода, который я использую как попытку создания «внутренних границ». Эта проблема здесь заключается в том, что, хотя внешние и внутренние прямоугольники вырисовываются и отображаются, когда я добавляю внутренний прямоугольник к карте bodyWithBodies
, он полностью контролирует обнаружение столкновения, удаляя все управление контактами из внешней прямоугольной оболочки. Когда я удалить bodyWithBodies
он возвращается в нормальное русло с показом как прямоугольники, наружный имеет обнаружение столкновений (не позволяет мне пройти), в то время как внутренние один не имеет ничего ... так близко
// 1 Create large outer shell Map
CGRect mapWithRect = CGRectMake(map.frame.origin.x + offsetX, map.frame.origin.y + offsetY, map.frame.size.width * shrinkage, map.frame.size.height * shrinkage);
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
self.physicsWorld.contactDelegate = self;
// 2 Create smaller inner boundary
CGRect innerRect = CGRectMake(100, 100, 300, 300);
SKPhysicsBody *body = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
body.categoryBitMask = wallCategory;
NSArray *bodyArray = [NSArray arrayWithObject:body];
// 3 Add bodies to main Map body
myWorld.physicsBody = [SKPhysicsBody bodyWithBodies:bodyArray];
myWorld.physicsBody.categoryBitMask = wallCategory;
if ([[levelDict objectForKey:@"DebugBorder"] boolValue] == YES) {
// This will draw the boundaries for visual reference during testing
[self debugPath:mapWithRect];
[self debugPath:innerRect];
}
EDIT 2 Этот подход works..by просто добавить новый узел с теми же свойствами, что и внешнего прямоугольника:
SKPhysicsBody *innerRectBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
innerRectBody.collisionBitMask = playerCategory;
innerRectBody.categoryBitMask = wallCategory;
SKNode *innerBoundary = [SKNode node];
innerBoundary.physicsBody = innerRectBody;
[myWorld addChild: innerBoundary];
... но я очень хотел бы более чистое решение, которое не требует дополнительных узлов .. мысли?
Это может быть то, что вы ищете https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/#//apple_ref/occ/clm/SKPhysicsBody/bodyWithTexture: alphaThreshold: size: – 0x141E
В моем редактировании я показал, что сделал, но (как объяснено) просто не совсем. Я знаю, что могу создать отдельный «узел», который может имитировать производительность большей внешней оболочки, но опять же, я просто стараюсь избегать большего напряжения процессора. Я понял, что что-то вроде этого должно быть возможно, учитывая диапазон удобства использования Яблока с помощью SpriteKit .. :( –
перепроверьте ваши столкновения и маски для контактов – dragoneye