使用 Swift 在 SpriteKit 中将自定义“数字”图像作为分数添加到 SKLabelNode

Posted

技术标签:

【中文标题】使用 Swift 在 SpriteKit 中将自定义“数字”图像作为分数添加到 SKLabelNode【英文标题】:Add custom "number" images to SKLabelNode in as a Score in SpriteKit with Swift 【发布时间】:2016-09-11 19:17:59 【问题描述】:

我基本上想在 Singles 中添加自定义字体编号(带图像),并在我使用 SpriteKit 的游戏中添加它们作为我的分数。

这是字体图片样式

它们是从0到9的数字

我一直试图弄清楚这一点。

我不确定您是否可以将其添加到 SKLabelNode 中,或者您是否必须将其添加到类中。

【问题讨论】:

【参考方案1】:

SKLabelNode 不允许使用位图字体。如果您的自定义字体是 TTF,您将能够使用带有 SKLabelNode 的自定义字体。这里有一个解释:SKlabelNode custom font

在您的情况下,由于您想使用位图字体,因此您需要创建一个类来执行此操作。您可以将SKNode 子类化,也可以不子类化。但是您希望有一个 SKNode 作为“根”,然后让您的号码的每个数字都是一个 SKSpriteNode(这些将是代表该数字的根节点的子节点)。

您需要确定的一件事是如何处理数字的对齐方式(水平和垂直)。

我以前使用我自己的自定义类来绘制数字,并且通常将其配置为可水平调整(左对齐、右对齐和居中)。但出于懒惰,我通常总是垂直居中。

这听起来可能很复杂,但很容易做到。你只需要拥有

为每个数字分配位图纹理图集的方法。更容易 如果你有他们在0-9的进步。 设置/获取数值的方法 可以转换的方法 编号为单个数字。你需要这个来计算哪个 digit 映射到哪个字符。 计算数字宽度的方法。如果 你的字体是等宽的,那么这很容易。如果他们不是,那么 您需要根据数字宽度和字母间距计算宽度。对于等宽字体,您可能仍需要考虑字母间距。 计算数字高度的方法。这应该很容易,因为 0-9 应该 都是一样的高度。 删除现有SKSpriteNode 的方法和 添加每个新数字。每个新数字都被适当的数量偏移 基于对齐方式。

您的自定义类应在设置数字值后构建正确的SKSpriteNodes 来表示数字。

关于如何将数组与SKTexture 一起使用的最后一个问题的一些更新信息。此代码未经编译测试,旨在为您提供更好的想法。

// Example of storing digits in an array. Assumes you are putting this in an atlas and your
// sub-texture names are 0, 1, etc. If not you'll have to adjust the code accordingly
var numTextures = [SKTexture]()
let numberAtlas = SKTextureAtlas(named: "NumberAtlas")

for i in 0 ..< 10 
    numTextures.append(numberAtlas.textureNamed("\(i)"))


// To get the texture for a digit

func textureForDigit(digit:Int) -> SKTexture 
    return numTextures[digit]

【讨论】:

感谢您的回答。我会尽快为您更新。 好的,我为每个数字添加了纹理图集,但是添加了设置/获取数值或转换为单个数字的方法会给我带来错误(无法将 Int 转换为 SKTexture...)...跨度> 当然不是。这就是数组的用途。创建一个SKTexture的数组,其中索引0代表0,索引1代表1,以此类推 我认为一个简单的例子是最好的。出现了太多相互矛盾的错误。抱歉,我是 Swift 的新手。如果您没有时间这样做,我理解。谢谢。 我添加了一个代码示例。将来,您至少应该提供您的代码尝试,以免让人觉得您只是想让其他人为您编写代码。特别是当您要求提供非常基本的东西的示例时。不管你是不是 swift 新手,这类问题已经以多种方式被问过无数次。

以上是关于使用 Swift 在 SpriteKit 中将自定义“数字”图像作为分数添加到 SKLabelNode的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift + SpriteKit 将节点移动到手指

当在 Swift Spritekit 中触摸并按住屏幕时,我将如何向上移动我的节点?

以编程方式使用 Swift 在 Spritekit 中滚动视图(无情节提要)

如何在 Swift 和 SpriteKit 中使用 UISwipeGestureRecognizer 而不是 touchesMoved?

PhysicsBody 使用 SpriteKit 和 Swift 为零

SpriteKit, Swift 2.0 - 在游戏地图上生成对象