Физика на краю дуги UIBezierPath - PullRequest
0 голосов
/ 08 июня 2018

Я изо всех сил пытаюсь создать физику для дуги.Рисуя эту дугу, мне нужно только применить физику к показанной белой линии.Рисуется с помощью этого кода.

my arc

let position = CGPoint(x: 0, y: 0)
let width = CGFloat(5)
let inner = 300/2-width
let outer = 300/2+width
let start = 3*CGFloat.pi/2-offset
let end = 3*CGFloat.pi/2+offset

let arc = UIBezierPath(arcCenter: position, radius: inner, startAngle: start, endAngle: end, clockwise: true)

let shape = SKShapeNode(path: arc.cgPath)
shape.strokeColor = SKColor.white
shape.lineWidth = 2
shape.fillColor = SKColor.blue
shape.physicsBody = SKPhysicsBody(polygonFrom: arc.cgPath)
shape.physicsBody?.isDynamic = false

self.addChild(shape)

Естественно, физика применяется ко всей фигуре.Добавление в этот код дает мне что-то более красивое

fancier arc

arc.addLine(to: CGPoint(x: outer * cos(end), y: outer * sin(end)))
arc.addArc(withCenter: position, radius: outer, startAngle: end, endAngle: start, clockwise: false)

Но та же физика все еще применима, как и в первом.

Как создать дугу, обладающую правильной физикой для второй дуги?

РЕДАКТИРОВАТЬ:

Отображение физики и использование чистого цвета, включаяплавающий шар.

enter image description here

1 Ответ

0 голосов
/ 08 июня 2018

Разобрался с моей проблемой.Это проблема самого генератора физики.Это создаст только выпуклые многоугольники, а не вогнутые.Поэтому я использовал то, что видно в Есть ли способ создать вогнутый физический корпус в SpriteKit? .

Добавление цикла в моем коде для создания прямоугольников дуги помогло мне работать с

enter image description here

let points = 8 //number of rectangles/2
var q = CGFloat(start)
var bodies = [SKPhysicsBody]()
for i in 1...(points*2)
{
    let parc = UIBezierPath()
    parc.move(to: CGPoint(x: inner * cos(q), y: inner * sin(q)))
    parc.addLine(to: CGPoint(x: outer * cos(q), y: outer * sin(q)))
    q += (offset/CGFloat(points))
    parc.addLine(to: CGPoint(x: outer * cos(q), y: outer * sin(q)))
    parc.addLine(to: CGPoint(x: inner * cos(q), y: inner * sin(q)))
    parc.close()
    bodies.append(SKPhysicsBody(polygonFrom: parc.cgPath))
}

//adjusting code to allow a physics body from multiple physics body instead of one
//shape.physicsBody = SKPhysicsBody(polygonFrom: arc.cgPath)
shape.physicsBody = SKPhysicsBody(bodies: bodies)
...