Write text in circle in Sprite kit (fast)
I want to draw a circle and put text in it. What can I do?
If I move or resize the circle, move the text or resize too
var color = UIColor(red: 0x00, green: 0x44, blue: 0x44, alpha: 1)
var Circle = SKShapeNode(circleOfRadius: 100 )
Circle.position = CGPointMake(frame.midX, frame.midY)
Circle.strokeColor = SKColor.blackColor()
Circle.glowWidth = 1.0
Circle.fillColor = color
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
myLabel.text = "Hello, World!";
myLabel.fontSize = 60;
myLabel.position = CGPointMake(frame.midX, frame.midY)
myLabel.fontColor = UIColor.blackColor()
self.addChild(Circle)
source to share
One way to drag both at once is you can add both to the same view, after which you change the position of both with touch events, for example, in the form of the code below.
import SpriteKit
class GameScene: SKScene {
var deltaPoint = CGPointZero
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
var Circle = SKShapeNode(circleOfRadius: 100 )
override func didMoveToView(view: SKView) {
/* Setup your scene here */
var color = UIColor(red: 0x00, green: 0x44, blue: 0x44, alpha: 1)
Circle.position = CGPointMake(frame.midX, frame.midY)
Circle.strokeColor = SKColor.blackColor()
Circle.glowWidth = 1.0
Circle.fillColor = color
myLabel.text = "Hello, World!";
myLabel.fontSize = 20
myLabel.position = CGPointMake(Circle.frame.midX, Circle.frame.midY)
myLabel.fontColor = UIColor.blackColor()
// Add them into same scene
self.addChild(Circle)
self.addChild(myLabel)
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
let currentPoint = touch.locationInNode(self)
let previousPoint = touch.previousLocationInNode(self)
deltaPoint = CGPointMake(currentPoint.x - previousPoint.x, currentPoint.y - previousPoint.y)
}
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
deltaPoint = CGPointZero
}
override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
deltaPoint = CGPointZero
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
var newPoint = CGPointMake(self.myLabel.position.x + self.deltaPoint.x, self.myLabel.position.y + self.deltaPoint.y)
// you can drag both item at same time
myLabel.position = newPoint
Circle.position = newPoint
deltaPoint = CGPointZero
}
}
source to share
UPDATED: Using the complete example.
Not a SpritKit user, but I believe every node has .addChild()
. Therefore, you should add him as a child to your circle:
var color = UIColor(red: 0x00, green: 0x44, blue: 0x44, alpha: 1)
var Circle = SKShapeNode(circleOfRadius: 100 )
Circle.position = CGPointMake(frame.midX, frame.midY)
Circle.strokeColor = SKColor.blackColor()
Circle.glowWidth = 1.0
Circle.fillColor = color
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
myLabel.text = "Hello, World!";
myLabel.fontSize = 60;
// Using half of the circle (center point)
myLabel.position = CGPointMake(Circle.frame.midX, Circle.frame.midY)
myLabel.fontColor = UIColor.blackColor()
Circle.addChild(myLabel)
self.addChild(Circle)
The position will then be relative to the frame of the circles.
source to share
You must specify the font size of the label in proportion to the size of your circle.
This is the button creation function:
func createCircleButton(position: CGPoint, buttonSize: CGFloat, yourText: String) {
let circle = SKShapeNode( circleOfRadius: buttonSize)
circle.position = position
circle.fillColor = SKColor.blueColor()
let label = SKLabelNode(fontNamed:"ArialMT")
label.text = yourText
label.fontSize = circle.frame.size.height / 6;
label.fontColor = SKColor.whiteColor()
circle.addChild(label)
self.addChild(circle)
}
Add it like this:
self.createCircleButton(CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2), buttonSize: self.frame.size.height / 5, yourText: "Your text")
source to share
Dharmesh Kheni's answer in Swift 3+ puts the label as a child of the circle and center-align the labels for the label in the center around the circle.
import SpriteKit
class GameScene: SKScene {
var deltaPoint = CGPoint.zero
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
var circle = SKShapeNode(circleOfRadius: 100 )
override func didMove(to view: SKView) {
let color = UIColor(red: 0x00, green: 0x44, blue: 0x44, alpha: 1)
circle.position = CGPoint(x: frame.midX, y: frame.midY)
circle.strokeColor = .black
circle.glowWidth = 1.0
circle.fillColor = color
myLabel.text = "Hello, World!";
myLabel.fontSize = 20
myLabel.horizontalAlignmentMode = .center
myLabel.verticalAlignmentMode = .center
myLabel.position = CGPoint(x:circle.frame.width/2, y: circle.frame.height/2)
myLabel.fontColor = .black
// Add them into same scene
self.addChild(circle)
circle.addChild(myLabel)
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
let currentPoint = touch.location(in: self)
let previousPoint = touch.previousLocation(in: self)
deltaPoint = CGPoint(x: currentPoint.x - previousPoint.x,y: currentPoint.y - previousPoint.y)
}
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
deltaPoint = CGPoint.zero
}
override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
deltaPoint = CGPoint.zero
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
let newPoint = CGPoint(x: self.myLabel.position.x + self.deltaPoint.x,y: self.myLabel.position.y + self.deltaPoint.y)
// you can drag both item at same time
myLabel.position = newPoint
circle.position = newPoint
deltaPoint = CGPoint.zero
}
}
source to share