2017-10-17 23 views
1

Je suis l'initialisation et l'affichage d'un SKSpriteNode via la texture d'un SKShapeNode avec un certain chemin qui représente une partie d'un cercle. Ci-dessous un exemple de forme que je suis un terrain de jeu en utilisant la génération:Comment calculer le point "central" d'un SKSpriteNode courbe?

import SpriteKit 
import PlaygroundSupport 

let view = SKView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) 
let scene = SKScene(size: view.frame.size) 
view.presentScene(scene) 

let radius: CGFloat = view.frame.width * 0.40 

var length: CGFloat = (.pi * 2.0)/8.0 
var width: CGFloat = radius/5.0 

var path: CGPath { 

    let path = UIBezierPath(arcCenter: view.center, radius: radius, startAngle: 0.0, endAngle: length, clockwise: true) 
    path.addArc(withCenter: view.center, radius: radius - width, startAngle: length, endAngle: 0.0, clockwise: false) 

    path.close() 

    return path.cgPath 
} 

let shapeNode = SKShapeNode(path: path) 
shapeNode.fillColor = .white 
let texture = view.texture(from: shapeNode)! 

let spriteNode = SKSpriteNode(texture: texture, color: .white, size: texture.size()) 
spriteNode.position = CGPoint(x: shapeNode.frame.midX, y: shapeNode.frame.midY) 

scene.addChild(spriteNode) 

PlaygroundPage.current.liveView = view 

Cela génère cette forme:

shape

Je voudrais ajouter un petit SKSpriteNode enfant qui est centré dans la largeur de la courbe noeud et au point d'arc milieu comme ceci:

proper shape

Th e plus proche que je pourrais venir utilise la position du spriteNode:

let childNode = SKSpriteNode(color: .red, size: CGSize(width: 5, height: 5)) 
childNode.position = spriteNode.position 
scene.addChild(childNode) 

Ce produit quelque chose de proche, mais il utilise le cadre, ce qui est tout à fait tort: ​​

improper shape

Je suppose que je dois faire quelque chose avec le chemin de l'arc mais je ne sais pas comment. Quelqu'un peut-il m'indiquer la bonne direction?

+2

il Computing de la SKShapeNode est problématique parce qu'un chemin peut être arbitrairement compliquée. - Mais tu connais la distance du centre et l'angle. Le reste est la trigonométrie de base :) –

+1

Amusez-vous https://en.wikipedia.org/wiki/Centroid – Knight0fDragon

+0

Parfois entendre que la réponse est facilement à portée de main est tout ce que vous devez entendre. Merci! – Aaron

Répondre

0

Merci aux commentaires que j'évité d'utiliser le chemin et rafraîchi sur une base TRIG pour résoudre:

let x = (radius - width/2) * cos(length/2) + view.center.x 
let y = (radius - width/2) * sin(length/2) + view.center.y 
childNode.position = CGPoint(x: x, y: y)