質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1631閲覧

SpriteKitでゲーム中に文章を表示したい。

tanakana

総合スコア150

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/12/21 05:41

編集2022/01/12 10:55

###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
この記事を参考にしています。
半年前に一度、削除依頼を出しましたが却下されてしまいました。
現状の報告を含め新しく質問させていただきます。
初心者ですが真摯に取り組んでいますので回答よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ

エラーメッセージは出力されませんが、 CSendText.swiftの print(label.text) はログに出力されてるようですが、 シュミレーターnodesの数字に変化がないので GameScen.swiftのm_parentSceneか let gameScene = GameScen() この辺りの指定がうまくいってない様に思います。

CSendText.swift

swift4

1 2 3import SpriteKit 4 5enum eTextState: Int { 6 case send = 0 // 通常文字送り 7 case skip // 文字送りスキップ 8 case remove // 貼付けた文字の取り外し 9} 10/** 11 * 文字送り用クラス 12 * 現在は横文字表示しか対応していません。 13 */ 14class CSendText { 15 // メンバ変数 16 // テキストを文字送りするのに必要そうな変数 17 var m_text: String? // 表示する文字列 18 var m_count: Int = 0 // テキストの文字数取得 19 var m_strcount: CGFloat = 0.0 // 現在何文字目表示したか 20 var m_delayTime: CGFloat = 1.1 // 一文字毎に描画するのを遅らせる秒数 21 var m_nextLineKey: Character = "嬲" // 改行キー 22 var m_parentScene: SKScene? // とりつけるシーン 23 var m_fontSize: CGFloat = 12.0 // フォントサイズ 24 var m_labelArray: Array<SKLabelNode> = [] // 表示しているラベル達 25 26 // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成) 27 var x: UInt = 0 // 横に何文字目か 28 var y: UInt = 0 // 何行目か 29 var maxWidth: UInt = 15 // 横に最大何文字表示するか 30 var m_posX: CGFloat? 31 var m_posY: CGFloat? 32 var m_color: UIColor = UIColor.black 33 var m_drawEndFlag: Bool = false 34 var m_state: eTextState = .send { 35 willSet{} 36 didSet{ 37 switch m_state { 38 case .send: 39 self.m_delayTime = 0.1 40 case .skip: 41 self.skipDraw(text: m_text) 42 case .remove: 43 self.remove() 44 } 45 } 46 } 47// (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン) 48 convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){ 49 self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil) 50 } 51 // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色) 52 convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){ 53 self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color) 54 } 55 // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数) 56 convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){ 57 self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil) 58 } 59 // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード) 60 convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){ 61 self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil) 62 } 63 // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ) 64 convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){ 65 self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil) 66 } 67 68 init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, 69 nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){ 70 71 if (nextLineKey != nil) { m_nextLineKey = nextLineKey } 72 if (maxWidth != nil) { self.maxWidth = maxWidth } 73 if (delayTime != nil) { self.m_delayTime = delayTime } 74 if (mode != nil) { self.m_state = mode } 75 if (fontsize != nil) { self.m_fontSize = fontsize } 76 if (color != nil) { self.m_color = color } 77 78 self.m_posX = posX 79 self.m_posY = posY 80 self.m_parentScene = addView 81 82 drawText(text: text) 83 84 } 85 86 required init?(coder aDecoder: NSCoder){ 87 fatalError("init(coder:) has not been implemented") 88 } 89 90 91 /// テキストの描画 92 func drawText(text: String!){ 93 // テキストの保管と文字数の取得 94 var text: String = text 95 m_text = text 96 m_count = text.count 97 if m_count == 0 { return } // 空なら描画せず終了 98 99 for _ in 1 ... m_count { 100 if m_state == .remove { return } // 表示途中で文字を消して、といった処理が来た時用のフラグと処理 101 102 let chara:Character = text.remove(at: text.startIndex) // 一文字目をテキストから削除 103 104 if chara == m_nextLineKey { // 嬲 は改行用のキー文時 105 y = y + 1 // 行目をプラス 106 x = 0 // 行が変わるので、横ずらしを初期化 107 } else if x > maxWidth { // 改行用の処理 108 y = y + 1 // 行目をプラス 109 x = 0 // 同上 110 } else if m_posX! + m_fontSize * CGFloat(x) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { // 画面外にいかないように 111 112 y = y + 1 // 行目をプラス 113 x = 0 // 同上 114 } 115 x = x + 1 // ラベルノードの生成 116 let label: SKLabelNode = SKLabelNode(text: "(chara)") 117 label.fontSize = m_fontSize // フォントサイズ指定 118 label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) // 文字の位置設定 119 label.alpha = 0.0 // 透明度の設定(初期は透明なので0.0) 120 label.fontColor = m_color // 文字色指定 121 print(label.text) 122 // ラベルの取り付け 123 m_parentScene?.addChild(label) 124 // ラベルの配列に登録 125 m_labelArray.append(label) 126 127 // 表示する時間をずらすためのアクションの設定 128 let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする 129 let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5) // 不透明にするアクションの生成 130 let seq = SKAction.sequence([delay, fadein]) // 上記2つのアクションを連結 131 label.run(seq) // 実行 132 133 134 m_strcount += 1.0 // 現在の文字数をプラス 135 } 136 y = 0 137 x = 0 138 m_strcount = 0.0 139 } 140 141 /// スキップモードの文字の描画 142 func skipDraw(text: String!){ 143 if m_drawEndFlag { return } 144 145 self.remove() 146 147 // テキストの保管と文字数の取得 148 var text: String = text 149 150 m_count = text.count 151 if m_count == 0 { return } // 空なら描画せず終了 152 153 for _ in 1 ... m_count { 154 if m_state == .remove { return } // 表示途中で文字を消して、といった処理が来た時用のフラグと処理 155 156 let chara:Character = text.remove(at: text.startIndex) // 一文字目をテキストから削除 157 158 if chara == m_nextLineKey { // 嬲 は改行用のキー文時 159 y = y + 1 // 行目をプラス 160 x = 0 161 } else if x > maxWidth { // 改行用の処理 162 y = y + 1 // 行目をプラス 163 x = 0 // 行が変わるので、横にずらす距離を初期化 164 } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { 165 y = y + 1 // 行目をプラス 166 print(y) 167 x = 0 168 } 169 x = x + 1 170 171 // ラベルノードの生成 172 let label: SKLabelNode = SKLabelNode(text: "(chara)") // "(chara)"とすることでStringに変換 173 // フォントサイズ指定 174 label.fontSize = m_fontSize 175 // 文字の位置設定 176 label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) 177 // 透明度の設定(スキップの場合、最初から不透明) 178 label.fontColor = m_color 179 180 // ラベルの取り付け 181 m_parentScene?.addChild(label) 182 183 m_labelArray.append(label) 184 185 m_strcount += 1.0 186 } 187 y = 0 // 縦ずらし初期化 188 x = 0 // 横ずらし初期化 189 m_strcount = 0.0 // 描画した文字数の初期化 190 } 191 192 193 /// 文字が全て表示されたかの確認 194 func checkDrawEnd(){ 195 if m_labelArray.last?.alpha == 1.0 { 196 m_drawEndFlag = true 197 } 198 } 199 200 /// 描画モードの切り替え 201 func changeState( mode: eTextState ){ 202 self.m_state = mode 203 } 204 205 /// 描画の基本設定はそのままに、違う文へ切り替え 206 func changeText(text: String!){ 207 if m_drawEndFlag { 208 self.remove() 209 self.changeState(mode: .send) 210 drawText(text: text) 211 } else { 212 self.changeState(mode: .skip) 213 } 214 } 215 216 /// ラベルの取り外し 217 func remove(){ 218 while m_labelArray.count > 0 { 219 m_labelArray.last?.removeFromParent() 220 m_labelArray.removeLast() 221 m_drawEndFlag = false 222 } 223 } 224} 225

gamescene.swift

import SpriteKit class GameScene: SKScene { override func didMove(to view: SKView) { self.backgroundColor = UIColor.gray let gameScene = GameScene() //let gameScene = GameScene(size: view.bounds.size) let csvtext = "こんにちは" let test = CSendText(text: csvtext, fontsize: 20, posX: frame.size.width/2, posY: frame.size.height/2, addView: gameScene,nextLineKey: nil, maxWidth: 736, delayTime: 1, mode: nil, color: UIColor.black) test.drawText(text: csvtext) } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanakana

2017/12/30 16:36

ありがとうございます。削除依頼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問