在 Sprite 工具包中写一个圆圈中的文字(swift)

Posted

技术标签:

【中文标题】在 Sprite 工具包中写一个圆圈中的文字(swift)【英文标题】:Write a text in a circle in Sprite kit (swift) 【发布时间】:2015-05-30 10:19:59 【问题描述】:

我想画一个圆圈并在里面放一段文字。 我该怎么办?

如果我移动或调整了圆圈的大小,文本也会移动或调整大小

        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)

【问题讨论】:

你想把myLabel 显示成圈子吗? 是的。我可以一起移动圆圈和标签 你需要更清楚你的目标。您是否希望文本围绕圆的外部弯曲?您是否希望它保持垂直,但要包裹以填满空间? 我想将文本写入一个圆圈,而文本是圆圈的一部分。对于移动和动作,我只使用 circle 。对不起,我的英语不是很好 我希望文字不要超出圆圈。如果文本大于我想要修剪它的圆圈(掩盖它) 【参考方案1】:

一次拖动两者的一种方法是,您可以将两者添加到同一个视图中,然后通过触摸事件(如显示)更改两者的位置到下面的代码中。

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
    

【讨论】:

错误覆盖 func touchesMoved(touches: Set, withEvent event: UIEvent) >> 使用未声明的类型“Set”。这是什么错误? 你可以在这里找到旧xcode的方法:ioscreator.com/tutorials/using-labels-spritekit-swift【参考方案2】:

更新: 使用您的完整示例。

不是 SpritKit 用户,但我相信每个节点都有一个.addChild()。 所以应该可以将其作为孩子添加到您的圈子中:

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)

位置将相对于圆圈框架。

【讨论】:

myLabel.position = CGPointMake(frame.midX, frame.midY) 会从圆的上/左角到屏幕的一半。【参考方案3】:

Dharmesh Kheni 在 Swift 3 中的回答 + 将标签作为圆的子项,并将标签的中心对齐标记为圆心。

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
    

【讨论】:

【参考方案4】:

您的标签字体大小应与您的圆圈大小成比例。

这是创建按钮的函数:

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)


像这样添加它:

self.createCircleButton(CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2), buttonSize: self.frame.size.height / 5, yourText: "Your text")

【讨论】:

以上是关于在 Sprite 工具包中写一个圆圈中的文字(swift)的主要内容,如果未能解决你的问题,请参考以下文章

在 Sprite Kit 中混合颜色

如何更改图像中的像素

如何在 Google Play 应用说明中写粗体文字?

围绕另一个 Sprite 旋转一个 Sprite -libGDX-

根据度数移动 Sprite

如何画一个中间有文字的圆圈?