Swift(SpriteKit利用)で、テキストの文字送りを作ってみた。
どうもねいとです。
結構やっていたネトゲであるFNOが、今週木曜にサービスを終えるということで少し寂しくなっています。
まぁそんなことはいいとして、今日はSwiftでSpriteKitを使ってゲーム開発をするとして、テキストの文字送りができると便利かなーと思いまして、それを仮で作ってみる事にしました。
これはcocos2d-x(C++)で嵌っている時に、知人から「これで一先ずできるよ」と、教えられたやり方を思いっきり参考(というか丸パクリに近い)にして作りました。
とりあえずのメモ代わりに近いので、参考にならないかもしれませんがそれでもよければ最後まで読んでやって下さい。
概要としては、表示したいテキストを貰い、そのテキストの先頭から一文字ずつ取り出して、ラベルノードを透明で生成し、何文字目かに応じて不透明にするまでの時間を長くする。
といった感じです。
↓ 以下ソースコード ↓
func setText(text: String!){
let fontSize: CGFloat = 24.0 // フォントサイズ
// テキストを文字送りするのに必要そうな変数
var text: String = text // 引数で貰ったテキストを格納
let count = countElements(text) // テキストの文字数取得
var strcount: CGFloat = 0.0 // 現在何文字目表示したか
if count == 0 { return } // 取得した文字列が空なら処理を抜ける
let delayTime: CGFloat = 0.1 // 説明は後述
// 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
var x: CGFloat = 0 // 横に何文字目か
var y: CGFloat = 0 // 何行目か
// テキストの文字数文回す
for n in 1 ... count {
if !loadingFlag { return } // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
let chara:Character = text[text.startIndex] // 一文字目を取得 Character型で返ってくる
text.removeAtIndex(text.startIndex) // 一文字目をテキストから削除
if chara != "嬲" { // 嬲 は改行用のキー文字
// ラベルノードの生成
var label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
// フォントサイズ指定
label.fontSize = fontSize
// 文字の位置設定
label.position = CGPoint(x: fontSize * x + fontSize, y: self.frame.height - (y * fontSize) - fontSize)
// 透明度の設定(初期は透明なので0.0)
label.alpha = 0.0
// ラベルの取り付け
addChild(label)
// 表示する時間をずらすためのアクションの設定
let delay = SKAction.waitForDuration(NSTimeInterval(delayTime * strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
let fadein = SKAction.fadeAlphaBy(1.0, duration: 0.1) // 不透明にするアクションの生成
let seq = SKAction.sequence([delay, fadein]) // 上記2つのアクションを連結
label.runAction(seq) // 実行
x += 1.0 // 横にずらす距離をプラス
} else { // 改行用の処理
y += 1.0 // 行目をプラス
x = 0.0 // 行が変わるので、横にずらす距離を初期化
}
strcount += 1.0 // 現在の文字数をプラス
}
}
とりあえずこんな感じで上手く動いてくれました。
ボタンを押すとテキストの表示開始、表示途中であってもボタンを押すと、表示途中の文字を消して、また最初からという動きもできました。
しかしながらソースコードの見辛さがやばい。
今度GitHubについて知り合いに聞いておきますか…。
まだもう少し変えたい部分とかもあるかもしれませんが、とりあえずこれだけあれば上手い事文字送りできましたね。
そんな訳でこれを元に、テキスト文字送りクラスみたいなのを作ってみたいと思います。
それでは。