2017-10-05 2 views
1

Je fais l'application iOS en swift. Je veux montrer la disposition comme des bulles de musique d'Apple. Et le code ci-dessous fonctionne très bien pour montrer cette disposition, mais, je veux montrer la mise en page Hexagon au lieu de la bulle de cercle. Est-ce que quelqu'un peut suggérer/guider moi, comment montrer cette mise en page hexagonale au lieu de la mise en page de cercle.Comment obtenir la forme Hexagon de SKPhysicsBody de l'infrastructure SpriteKit

En classe magnétique:

func configure() { 

     physicsWorld.gravity = CGVector(dx: 0, dy: 0) 
     physicsBody = SKPhysicsBody(edgeLoopFrom: {() -> CGRect in 
      var frame = self.frame 
      frame.size.width = CGFloat(magneticField.minimumRadius) 
      frame.origin.x -= frame.size.width/2 
      return frame 
     }()) 
     let strength = Float(max(size.width, size.height)) 
     let radius = strength.squareRoot() * 100 
     magneticField.region = SKRegion(radius: radius) 
     magneticField.minimumRadius = radius 
     magneticField.strength = strength 
     magneticField.position = CGPoint(x: size.width/2, y: size.height/2) 
    } 

En classe Noeud:

public init(text: String?, image: UIImage?, color: UIColor, radius: CGFloat) { 
    super.init(circleOfRadius: radius) 

    self.physicsBody = { 
     let body = SKPhysicsBody(circleOfRadius: radius + 2) 
     body.allowsRotation = false 
     body.friction = 0 
     body.linearDamping = 3 
     return body 
    }() 
    self.fillColor = .white 
    self.strokeColor = .white 
    _ = self.sprite 
    _ = self.text 
    configure(text: text, image: image, color: color) 
} 
+0

votre code ne fait rien pour nous aider, vous montrez seulement un corps physique et un champ magnétique – Knight0fDragon

+0

@ Knight0fDragon J'ai ajouté le code de classe de noeud aussi, pouvez-vous vérifier, et fournir des suggestions pour obtenir la forme hexagonale? Merci –

Répondre

1

Tout ce que vous devez faire est d'utiliser un autre initialiseur. Vous utilisez super.init(circleOfRadius: radius) Pour faire un hexagone, utilisez simplement super.init(path path:CGPath) Où chemin est un CGPath en forme d'hexagone. (CGPath est simple à comprendre, il suffit de le créer avec 6 points sous la forme d'un hexagone, aussi grand que vous en ayez besoin) Vous pouvez alors prendre ce chemin et le donner au corps physique en faisant let body = SKPhysicsBody(polygonFrom:path)

Sur une note personnelle , vous voudrez peut-être réduire les fermetures comme vous le faites. (let physicsBody = {...}()) Ils ne sont pas garantis de se déclencher immédiatement et peuvent provoquer un problème de simultanéité. Une meilleure façon de droite, il serait de le faire dans une instruction if laisser:

if let body = SKPhysicsBody(circleOfRadius: radius + 2) 
{   
    body.allowsRotation = false 
    body.friction = 0 
    body.linearDamping = 3 
    self.physicsBody = body 
} 
+0

Sur votre côté: les fermetures immédiatement invoquées n'ont rien à voir avec la concurrence, et sont invoquées immédiatement. 'let foo = {...}()' a le même effet que 'let foo = someFunc()', juste sans le corps de 'someFunc' qui doit être défini ailleurs. – rickster

+0

@rickster, je vais devoir passer en revue une partie de mon code, mais je crois avoir rencontré des problèmes en faisant quelque chose comme ça sur les threads d'arrière-plan qui provoquait l'effondrement de mes fermetures – Knight0fDragon

+0

J'ai essayé de faire de cette façon, comme suit lineWidth: CGFloat = 2 laissez hexaGonPath = roundedPolygonPath (rect: rectFrame, lineWidth: lineWidth, côtés: 6, cornerRadius: 10, rotationOffset: CGFloat (M_PI/2.0)) as! CGPath Mais, son obtention BAD EXCESS –

1

expansion sur la réponse de KnightofDragon, vous pouvez calculer les 6 points d'un hexagone avec le psuedocode/math suivant:

PI = 3.14159 
for i in 0..<6 { 
    theta = i*2.0*PI/n; // angle to the ith vertex, in radians (not degrees) 
    x = radius * cos(theta) 
    y = radius * sin(theta) 
    vertex = centerPosition.x + x, centerPosition.y + y 
} 
+1

vous pouvez faire Float.pi et ne pas avoir à vous soucier de faire votre propre constante, +1 pour l'aide – Knight0fDragon

+0

Merci. Je l'ai dépouillé d'un projet C++/openGL que j'ai fait il y a deux semaines, et je n'ai certainement pas fait beaucoup d'efforts pour le transformer en Swift. – AmandaR

+0

J'ai essayé de faire comme suit, comme suit lineWidth: CGFloat = 2 laissez hexaGonPath = roundedPolygonPath (rect: rectFrame, lineWidth: lineWidth, côtés: 6, cornerRadius: 10, rotationOffset: CGFloat (M_PI/2.0)) as! CGPath Mais, ça devient BAD EXCESS –