Есть ли способ визуально увидеть комплект спрайтов SKPhysicsbody?

Я использую bodyWithPolygonFromPath для определения объема физического тела и использовал

http://dazchong.com/spritekit/

чтобы получить требуемые пути. Но путь не кажется правильным, и я хочу видеть границу пути физики, чтобы увидеть, правильная ли форма.

Есть ли способ увидеть контур громкости физического тела?

Я попробовал следующий код, но он не работает.

ship = [SKSpriteNode spriteNodeWithImageNamed: @ "Spaceship" ];

CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);

CGPathCloseSubpath(path);

SKShapeNode *yourline = [SKShapeNode node];
yourline.name = @"yourline";
yourline.path = path;
[yourline setStrokeColor:[UIColor redColor]];
 [self addChild:yourline];


ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
//[ship setScale:0.5];
ship.zRotation = - M_PI / 2;
26
задан user2832367 19 янв. '14 в 9:05
источник поделиться
6 ответов

Для Objective-C и iOS < 7.1

В вашем ViewController.m найдите этот код

SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;

После последней строки добавьте

skView.showsPhysics = YES;

Построить и запустить, и вы должны увидеть всю физическую границу тела

я заметил, что вы добавляете shapeNode в self вместо spriteNode, поэтому попробуйте следующее

SKSpriteNode *ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);
CGPathCloseSubpath(path);

ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

[self addChild:ship];

SKShapeNode *shape = [SKShapeNode node];
shape.path = path;
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5];
shape.lineWidth = 1.0;
[ship addChild:shape];

Для Swift и iOS >= 8.0

let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = true

И если вам нужна пользовательская граница

let ship = SKSpriteNode(imageNamed: "Spaceship")
let offsetX = ship.frame.size.width * ship.anchorPoint.x
let offsetY = ship.frame.size.height * ship.anchorPoint.y

let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, 50 - offsetX, 110 - offsetY)
CGPathAddLineToPoint(path, nil, 18 - offsetX, 16 - offsetY)
CGPathAddLineToPoint(path, nil, 140 - offsetX, 15 - offsetY)
CGPathCloseSubpath(path)

ship.physicsBody = SKPhysicsBody(polygonFromPath: path)
addChild(ship)

let shape = SKShapeNode()
shape.path = path
shape.strokeColor = SKColor(red: 1.0, green: 0, blue: 0, alpha: 0.5)
shape.lineWidth = 1.0
addChild(shape)

Уже тестировалось:]

Удачи!!

61
ответ дан Julio Montoya 23 янв. '14 в 1:25
источник поделиться

В целях тестирования я бы установил корабль как SKShapeNode, закомментировал ваш SKShapeNode и установил путь ship.path к тому же пути, который вы используете для своего SKPhysicsBody.

Или вы можете использовать это:

https://github.com/ymc-thzi/physicsDebugger

1
ответ дан joshd 19 янв. '14 в 11:36
источник поделиться

В новой версии 7.1 есть функциональность, позволяющая это, как указано выше.

1
ответ дан Stuart Welsh 23 янв. '14 в 14:32
источник поделиться

Я знаю, что это немного поздно, но я подумал, что вы можете быть заинтересованы в моем новом инструменте, который автоматически создает путь вокруг спрайта (так что вам не нужно вручную вручную набирать очки), а затем вы может регулировать различные настройки, чтобы лучше соответствовать вашим требованиям. Инструмент также выводит программный код Objective C и Swift для добавления пути к физическому телу спрайта. Надеюсь, что это поможет некоторым людям. Спасибо:

http://www.radicalphase.com/pathgen/

1
ответ дан Clive Minnican 26 апр. '15 в 22:18
источник поделиться

Ваша форма node верна. Похоже, что yourline может быть добавлен к месту происшествия перед фактическим кораблем, поэтому корабль спрайт будет нарисован поверх него, делая его закрытым. Убедитесь, что вы установили yourline.zPosition в самое верхнее значение или убедитесь, что [self addChild:yourline] выполняется после [self addChild:ship].

0
ответ дан Batalia 22 янв. '14 в 15:48
источник поделиться

Это добавит красную фигуру поверх вашего node. Используйте тот же путь, который вы определили для физического тела вашего node.

+(void)debugPath:(CGPathRef)path onNode:(SKNode*)node {
    SKShapeNode *yourline = [SKShapeNode node];
    yourline.name = @"yourline";
    yourline.path = path;
    [yourline setStrokeColor:[UIColor redColor]];
    [node addChild:yourline];
}

т.е. Использование:

[[self class] debugPath:ship.physicsBody.path onNode:ship];
0
ответ дан Jonny 16 февр. '14 в 4:19
источник поделиться

Другие вопросы по меткам