質問編集履歴

6 半年後の現状と質問

tanakana

tanakana score 53

2018/06/21 20:56  投稿

SpriteKitでゲーム中に文章を表示したい。
###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。
この記事を参考にしています。
半年前に一度、削除依頼を出しましたが却下されてしまいました。
現状の報告を含め新しく質問させていただきます。
初心者ですが真摯に取り組んでいますので回答よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
```
Use of unresolved identifier
```
###該当のソースコード
エラーメッセージは出力されませんが、
CSendText.swiftの
print(label.text)
はログに出力されてるようですが、
シュミレーターnodesの数字に変化がないので
GameScen.swiftのm_parentSceneか
let gameScene = GameScen()
この辺りの指定がうまくいってない様に思います。
```
CSendText.swift
```swift4
自分なりに修正してみました
MessageText.swift
import SpriteKit
 
enum eTextState: Int {
  case send = 0     // 通常文字送り
  case skip         // 文字送りスキップ
  case remove       // 貼付けた文字の取り外し
  case send = 0      // 通常文字送り
  case skip          // 文字送りスキップ
  case remove        // 貼付けた文字の取り外し
}
/**
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
class CSendText {
  // メンバ変数
  // テキストを文字送りするのに必要そうな変数
  var m_text: String?               // 表示する文字列
  var m_count: Int = 0              // テキストの文字数取得
  var m_strcount: CGFloat = 0.0     // 現在何文字目表示したか
  var m_delayTime: CGFloat = 0.1    // 一文字毎に描画するのを遅らせる秒数
  var m_nextLineKey: Character = "嬲" // 改行キー
  var m_parentScene: SKScene?       // とりつけるシーン
  var m_fontSize: CGFloat = 12.0    // フォントサイズ
  var m_labelArray: Array<SKLabelNode> = [] // 表示しているラベル達
  // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
  var x: UInt = 0            // 横に何文字目か
  var y: UInt = 0            // 何行目か
  var maxWidth: UInt = 15       // 横に最大何文字表示するか
  var m_posX: CGFloat?
  var m_posY: CGFloat?
  var m_color: UIColor = UIColor.black
  var m_drawEndFlag: Bool = false
  var m_state: eTextState = .send {
      willSet{}
      didSet{
          switch m_state {
          case .send:
              self.m_delayTime = 0.1
          case .skip:
              self.skipDraw(text: m_text)
          case .remove:
              self.remove()
          }
      }
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
  }
 
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
  }
 
  init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
       nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
      if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
      if (maxWidth != nil)  { self.maxWidth = maxWidth }
      if (delayTime != nil) { self.m_delayTime = delayTime }
      if (mode != nil)      { self.m_state = mode }
      if (fontsize != nil)  { self.m_fontSize = fontsize }
      if (color != nil)     { self.m_color = color }
      self.m_posX = posX
      self.m_posY = posY
      self.m_parentScene = addView
      drawText(text: text)
  }
 
  required init?(coder aDecoder: NSCoder){
      fatalError("init(coder:) has not been implemented")
  }
  /// テキストの描画
  private func drawText(text: String!){
      // テキストの保管と文字数の取得
      var text: String = text
      m_text = text
      m_count = text.utf16.count
      if m_count == 0 { return } // 空なら描画せず終了
      for _ in 1 ... m_count {
          if m_state == .remove { return }  // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
          let chara:Character = text.remove(at: text.startIndex)       // 一文字目をテキストから削除
          if chara == m_nextLineKey {   // 嬲 は改行用のキー文時
              _ = y + 1                  // 行目をプラス
              x = 0                 // 行が変わるので、横ずらしを初期化
          } else if x > maxWidth {  // 改行用の処理
              _ = y + 1                   // 行目をプラス
              x = 0                 // 同上
          } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { // 画面外にいかないように
             _ = y + 1                   // 行目をプラス
              x = 0                 // 同上
          }
          _ = x + 1
          // ラベルノードの生成
          let label: SKLabelNode = SKLabelNode(text: "\(chara)")
          label.fontSize = m_fontSize // フォントサイズ指定
          label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) // 文字の位置設定
          label.alpha = 0.0         // 透明度の設定(初期は透明なので0.0)
          label.fontColor = m_color // 文字色指定
          m_parentScene?.addChild(label) // ラベルの取り付け
          m_labelArray.append(label) // ラベルの配列に登録
          // 表示する時間をずらすためのアクションの設定
          let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
          let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5) // 不透明にするアクションの生成
          let seq = SKAction.sequence([delay, fadein])          // 上記2つのアクションを連結
          label.run(seq)                                  // 実行
          m_strcount += 1.0           // 現在の文字数をプラス
      }
      y = 0
      x = 0
      m_strcount = 0.0
  }
 
  func skipDraw(text: String!){ //スキップモードの文字の描画
      if m_drawEndFlag { return }
      self.remove()
      var text: String = text // テキストの保管と文字数の取得
      m_count = text.utf16.count
      if m_count == 0 { return } // 空なら描画せず終了
      for _ in 1 ... m_count {
          if m_state == .remove { return }  // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
          let chara:Character = text.remove(at: text.startIndex)       // 一文字目をテキストから削除
          if chara == m_nextLineKey {   // 嬲 は改行用のキー文時
              _ = y + 1                   // 行目をプラス
              x = 0
          } else if x > maxWidth {  // 改行用の処理
             _ = y + 1     // 行目をプラス
              x = 0   // 行が変わるので、横にずらす距離を初期化
          } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
             _ = y + 1    // 行目をプラス
              x = 0
          }
          _ = x + 1    // ラベルノードの生成
          let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
          label.fontSize = m_fontSize // フォントサイズ指定
          // 文字の位置設定
          label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
          // 透明度の設定(スキップの場合、最初から不透明)
          label.fontColor = m_color // ラベルの取り付け
          m_parentScene?.addChild(label)
          m_labelArray.append(label)
          m_strcount += 1.0
      }
      y = 0             // 縦ずらし初期化
      x = 0             // 横ずらし初期化
      m_strcount = 0.0  // 描画した文字数の初期化
  }
 
  /// 文字が全て表示されたかの確認
  func checkDrawEnd(){
      if m_labelArray.last?.alpha == 1.0 {
          m_drawEndFlag = true
      }
  }
 
  /// 描画モードの切り替え
  func changeState( mode: eTextState ){
      self.m_state = mode
  }
 
  /// 描画の基本設定はそのままに、違う文へ切り替え
  func changeText(text: String!){
      if m_drawEndFlag {
          self.remove()
          self.changeState( mode: .send )
          drawText(text: text)
      } else {
          self.changeState( mode: .skip )
      }
  }
  // ラベルの取り外し
  func remove(){
      while m_labelArray.count > 0 {
          m_labelArray.last?.removeFromParent()
          m_labelArray.removeLast()
          m_drawEndFlag = false
      }
  }
   // メンバ変数
   // テキストを文字送りするのに必要そうな変数
   var m_text: String?                // 表示する文字列
   var m_count: Int = 0               // テキストの文字数取得
   var m_strcount: CGFloat = 0.0      // 現在何文字目表示したか
   var m_delayTime: CGFloat = 1.1     // 一文字毎に描画するのを遅らせる秒数
   var m_nextLineKey: Character = "嬲" // 改行キー
   var m_parentScene: SKScene?      // とりつけるシーン
   var m_fontSize: CGFloat = 12.0     // フォントサイズ   
   var m_labelArray: Array<SKLabelNode> = []  // 表示しているラベル達
   
   // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
   var x: UInt = 0             // 横に何文字目か
   var y: UInt = 0             // 何行目か
   var maxWidth: UInt = 15        // 横に最大何文字表示するか
   var m_posX: CGFloat?
   var m_posY: CGFloat?
   var m_color: UIColor = UIColor.black
   var m_drawEndFlag: Bool = false
   var m_state: eTextState = .send {
       willSet{}
       didSet{
           switch m_state {
           case .send:
               self.m_delayTime = 0.1
           case .skip:
               self.skipDraw(text: m_text)
           case .remove:
               self.remove()
           }
       }
   }
// (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
   }
   
   init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
        nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
       
       if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
       if (maxWidth != nil)   { self.maxWidth = maxWidth }
       if (delayTime != nil)  { self.m_delayTime = delayTime }
       if (mode != nil)       { self.m_state = mode }
       if (fontsize != nil)   { self.m_fontSize = fontsize }
       if (color != nil)      { self.m_color = color }
       
       self.m_posX = posX
       self.m_posY = posY
       self.m_parentScene = addView
       
       drawText(text: text)
       
   }
   
   required init?(coder aDecoder: NSCoder){
       fatalError("init(coder:) has not been implemented")
   }
   
   
   /// テキストの描画
    func drawText(text: String!){ 
       // テキストの保管と文字数の取得
       var text: String = text
       m_text = text
       m_count = text.count
       if m_count == 0 { return } // 空なら描画せず終了
   
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               y = y + 1                      // 行目をプラス
               x = 0                  // 行が変わるので、横ずらしを初期化
           } else if x > maxWidth {   // 改行用の処理
               y = y + 1                    // 行目をプラス
               x = 0                  // 同上
           } else if m_posX! + m_fontSize * CGFloat(x) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {  // 画面外にいかないように
               
               y = y + 1                    // 行目をプラス
               x = 0                  // 同上
           }
               x = x + 1           // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)")
           label.fontSize = m_fontSize // フォントサイズ指定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))  // 文字の位置設定
           label.alpha = 0.0          // 透明度の設定(初期は透明なので0.0)
           label.fontColor = m_color  // 文字色指定
           print(label.text)
           // ラベルの取り付け
           m_parentScene?.addChild(label)
           // ラベルの配列に登録
           m_labelArray.append(label)
           
           // 表示する時間をずらすためのアクションの設定
           let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
           let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5)  // 不透明にするアクションの生成
           let seq = SKAction.sequence([delay, fadein])           // 上記2つのアクションを連結
           label.run(seq)                                   // 実行
           
           
           m_strcount += 1.0            // 現在の文字数をプラス
       }
       y = 0
       x = 0
       m_strcount = 0.0
   }
   
   /// スキップモードの文字の描画
   func skipDraw(text: String!){
       if m_drawEndFlag { return }
       
       self.remove()
       
       // テキストの保管と文字数の取得
       var text: String = text
       
       m_count = text.count
       if m_count == 0 { return } // 空なら描画せず終了
       
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               y = y + 1                    // 行目をプラス
               x = 0
           } else if x > maxWidth {   // 改行用の処理
               y = y + 1                    // 行目をプラス
               x = 0                  // 行が変わるので、横にずらす距離を初期化
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
               y = y + 1                   // 行目をプラス
               print(y)
               x = 0
           }
           x = x + 1
           
           // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
           // フォントサイズ指定
           label.fontSize = m_fontSize
           // 文字の位置設定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
           // 透明度の設定(スキップの場合、最初から不透明)
           label.fontColor = m_color
           
           // ラベルの取り付け
           m_parentScene?.addChild(label)
           
           m_labelArray.append(label)
           
           m_strcount += 1.0
       }
       y = 0              // 縦ずらし初期化
       x = 0              // 横ずらし初期化
       m_strcount = 0.0   // 描画した文字数の初期化
   }
   
   
   /// 文字が全て表示されたかの確認
   func checkDrawEnd(){
       if m_labelArray.last?.alpha == 1.0 {
           m_drawEndFlag = true
       }
   }
   
   /// 描画モードの切り替え
   func changeState( mode: eTextState ){
       self.m_state = mode
   }
   
   /// 描画の基本設定はそのままに、違う文へ切り替え
   func changeText(text: String!){
       if m_drawEndFlag {
           self.remove()
           self.changeState(mode: .send)
           drawText(text: text)
       } else {
           self.changeState(mode: .skip)
       }
   }
   
   /// ラベルの取り外し
   func remove(){
       while m_labelArray.count > 0 {
      m_labelArray.last?.removeFromParent()
           m_labelArray.removeLast()
           m_drawEndFlag = false
       }
   }
}
```
gameclear.swift
```
gamescene.swift
```
import SpriteKit
class GameClear: SKScene {
  override func didMove(to view: SKView) {
       let LabelText = SKLabelNode(fontNamed: "Chalkduster")
      LabelText.text = "ゲームクリア!"
      let myBoundSize: CGSize = UIScreen.main.bounds.size
      let titlefont = Int(CGFloat(myBoundSize.width/9))
      LabelText.fontSize = CGFloat(titlefont)
      LabelText.position = CGPoint(x:self.frame.midX, y:self.frame.height / 2+200)
       self.addChild(LabelText)
      //表示したい文字
      drawText(text: "表示したい文字")
        //
  }
 
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
      if let _ = touches.first as UITouch? {
      }
  }
}
```
drawText(text: "文字")
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)
   }
}
```
  • Swift

    11956 questions

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

5 質問削除の取り消し

teratail

teratail score 507

2018/01/15 10:31  投稿

おなじ質問があったので取り消したい。
SpriteKitでゲーム中に文章を表示したい。
同じ質問があったので取り消します。
削除依頼を出しました。
###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
```
Use of unresolved identifier
```
###該当のソースコード
```swift4
自分なりに修正してみました
MessageText.swift
import SpriteKit
enum eTextState: Int {
  case send = 0     // 通常文字送り
  case skip         // 文字送りスキップ
  case remove       // 貼付けた文字の取り外し
}
/**
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
class CSendText {
  // メンバ変数
  // テキストを文字送りするのに必要そうな変数
  var m_text: String?               // 表示する文字列
  var m_count: Int = 0              // テキストの文字数取得
  var m_strcount: CGFloat = 0.0     // 現在何文字目表示したか
  var m_delayTime: CGFloat = 0.1    // 一文字毎に描画するのを遅らせる秒数
  var m_nextLineKey: Character = "嬲" // 改行キー
  var m_parentScene: SKScene?       // とりつけるシーン
  var m_fontSize: CGFloat = 12.0    // フォントサイズ
  var m_labelArray: Array<SKLabelNode> = [] // 表示しているラベル達
  // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
  var x: UInt = 0            // 横に何文字目か
  var y: UInt = 0            // 何行目か
  var maxWidth: UInt = 15       // 横に最大何文字表示するか
  var m_posX: CGFloat?
  var m_posY: CGFloat?
  var m_color: UIColor = UIColor.black
  var m_drawEndFlag: Bool = false
  var m_state: eTextState = .send {
      willSet{}
      didSet{
          switch m_state {
          case .send:
              self.m_delayTime = 0.1
          case .skip:
              self.skipDraw(text: m_text)
          case .remove:
              self.remove()
          }
      }
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
  }
 
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
  }
  // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
  convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
      self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
  }
 
  init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
       nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
      if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
      if (maxWidth != nil)  { self.maxWidth = maxWidth }
      if (delayTime != nil) { self.m_delayTime = delayTime }
      if (mode != nil)      { self.m_state = mode }
      if (fontsize != nil)  { self.m_fontSize = fontsize }
      if (color != nil)     { self.m_color = color }
      self.m_posX = posX
      self.m_posY = posY
      self.m_parentScene = addView
      drawText(text: text)
  }
 
  required init?(coder aDecoder: NSCoder){
      fatalError("init(coder:) has not been implemented")
  }
  /// テキストの描画
  private func drawText(text: String!){
      // テキストの保管と文字数の取得
      var text: String = text
      m_text = text
      m_count = text.utf16.count
      if m_count == 0 { return } // 空なら描画せず終了
      for _ in 1 ... m_count {
          if m_state == .remove { return }  // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
          let chara:Character = text.remove(at: text.startIndex)       // 一文字目をテキストから削除
          if chara == m_nextLineKey {   // 嬲 は改行用のキー文時
              _ = y + 1                  // 行目をプラス
              x = 0                 // 行が変わるので、横ずらしを初期化
          } else if x > maxWidth {  // 改行用の処理
              _ = y + 1                   // 行目をプラス
              x = 0                 // 同上
          } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! { // 画面外にいかないように
             _ = y + 1                   // 行目をプラス
              x = 0                 // 同上
          }
          _ = x + 1
          // ラベルノードの生成
          let label: SKLabelNode = SKLabelNode(text: "\(chara)")
          label.fontSize = m_fontSize // フォントサイズ指定
          label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize)) // 文字の位置設定
          label.alpha = 0.0         // 透明度の設定(初期は透明なので0.0)
          label.fontColor = m_color // 文字色指定
          m_parentScene?.addChild(label) // ラベルの取り付け
          m_labelArray.append(label) // ラベルの配列に登録
          // 表示する時間をずらすためのアクションの設定
          let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
          let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5) // 不透明にするアクションの生成
          let seq = SKAction.sequence([delay, fadein])          // 上記2つのアクションを連結
          label.run(seq)                                  // 実行
          m_strcount += 1.0           // 現在の文字数をプラス
      }
      y = 0
      x = 0
      m_strcount = 0.0
  }
 
  func skipDraw(text: String!){ //スキップモードの文字の描画
      if m_drawEndFlag { return }
      self.remove()
      var text: String = text // テキストの保管と文字数の取得
      m_count = text.utf16.count
      if m_count == 0 { return } // 空なら描画せず終了
      for _ in 1 ... m_count {
          if m_state == .remove { return }  // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
          let chara:Character = text.remove(at: text.startIndex)       // 一文字目をテキストから削除
          if chara == m_nextLineKey {   // 嬲 は改行用のキー文時
              _ = y + 1                   // 行目をプラス
              x = 0
          } else if x > maxWidth {  // 改行用の処理
             _ = y + 1     // 行目をプラス
              x = 0   // 行が変わるので、横にずらす距離を初期化
          } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
             _ = y + 1    // 行目をプラス
              x = 0
          }
          _ = x + 1    // ラベルノードの生成
          let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
          label.fontSize = m_fontSize // フォントサイズ指定
          // 文字の位置設定
          label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
          // 透明度の設定(スキップの場合、最初から不透明)
          label.fontColor = m_color // ラベルの取り付け
          m_parentScene?.addChild(label)
          m_labelArray.append(label)
          m_strcount += 1.0
      }
      y = 0             // 縦ずらし初期化
      x = 0             // 横ずらし初期化
      m_strcount = 0.0  // 描画した文字数の初期化
  }
 
  /// 文字が全て表示されたかの確認
  func checkDrawEnd(){
      if m_labelArray.last?.alpha == 1.0 {
          m_drawEndFlag = true
      }
  }
 
  /// 描画モードの切り替え
  func changeState( mode: eTextState ){
      self.m_state = mode
  }
 
  /// 描画の基本設定はそのままに、違う文へ切り替え
  func changeText(text: String!){
      if m_drawEndFlag {
          self.remove()
          self.changeState( mode: .send )
          drawText(text: text)
      } else {
          self.changeState( mode: .skip )
      }
  }
  // ラベルの取り外し
  func remove(){
      while m_labelArray.count > 0 {
          m_labelArray.last?.removeFromParent()
          m_labelArray.removeLast()
          m_drawEndFlag = false
      }
  }
}
```
gameclear.swift
```
import SpriteKit
class GameClear: SKScene {
  override func didMove(to view: SKView) {
       let LabelText = SKLabelNode(fontNamed: "Chalkduster")
      LabelText.text = "ゲームクリア!"
      let myBoundSize: CGSize = UIScreen.main.bounds.size
      let titlefont = Int(CGFloat(myBoundSize.width/9))
      LabelText.fontSize = CGFloat(titlefont)
      LabelText.position = CGPoint(x:self.frame.midX, y:self.frame.height / 2+200)
       self.addChild(LabelText)
      //表示したい文字
      drawText(text: "表示したい文字")
        //
  }
 
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
      if let _ = touches.first as UITouch? {
      }
  }
}
```
drawText(text: "文字")
  • Swift

    11956 questions

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

4 削除依頼しました。

tanakana

tanakana score 53

2017/12/31 01:35  投稿

おなじ質問があったので取り消したい。
同じ質問があったので取り消します。
  • Swift

    11956 questions

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

3 同じ質問があったので取り消します。

tanakana

tanakana score 53

2017/12/30 23:30  投稿

SpriteKitでゲーム中に文章を表示したい。
おなじ質問があったので取り消したい。
###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
```
Use of unresolved identifier
```
###該当のソースコード
```swift4
自分なりに修正してみました
MessageText.swift
import SpriteKit
enum eTextState: Int {
   case send = 0      // 通常文字送り
   case skip          // 文字送りスキップ
   case remove        // 貼付けた文字の取り外し
}
/**
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
class CSendText {
   // メンバ変数
   // テキストを文字送りするのに必要そうな変数
   var m_text: String?                // 表示する文字列
   var m_count: Int = 0               // テキストの文字数取得
   var m_strcount: CGFloat = 0.0      // 現在何文字目表示したか
   var m_delayTime: CGFloat = 0.1     // 一文字毎に描画するのを遅らせる秒数
   var m_nextLineKey: Character = "嬲" // 改行キー
   var m_parentScene: SKScene?        // とりつけるシーン
   var m_fontSize: CGFloat = 12.0     // フォントサイズ
   var m_labelArray: Array<SKLabelNode> = []  // 表示しているラベル達
   // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
   var x: UInt = 0             // 横に何文字目か
   var y: UInt = 0             // 何行目か
   var maxWidth: UInt = 15        // 横に最大何文字表示するか
   var m_posX: CGFloat?
   var m_posY: CGFloat?
   var m_color: UIColor = UIColor.black
   var m_drawEndFlag: Bool = false
   var m_state: eTextState = .send {
       willSet{}
       didSet{
           switch m_state {
           case .send:
               self.m_delayTime = 0.1
           case .skip:
               self.skipDraw(text: m_text)
           case .remove:
               self.remove()
           }
       }
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
   }
   
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
   }
   
   init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
        nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
       if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
       if (maxWidth != nil)   { self.maxWidth = maxWidth }
       if (delayTime != nil)  { self.m_delayTime = delayTime }
       if (mode != nil)       { self.m_state = mode }
       if (fontsize != nil)   { self.m_fontSize = fontsize }
       if (color != nil)      { self.m_color = color }
       self.m_posX = posX
       self.m_posY = posY
       self.m_parentScene = addView
       drawText(text: text)
   }
   
   required init?(coder aDecoder: NSCoder){
       fatalError("init(coder:) has not been implemented")
   }
   /// テキストの描画
   private func drawText(text: String!){
       // テキストの保管と文字数の取得
       var text: String = text
       m_text = text
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                   // 行目をプラス
               x = 0                  // 行が変わるので、横ずらしを初期化
           } else if x > maxWidth {   // 改行用の処理
               _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {  // 画面外にいかないように
              _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           }
           _ = x + 1
           // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)")
           label.fontSize = m_fontSize // フォントサイズ指定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))  // 文字の位置設定
           label.alpha = 0.0          // 透明度の設定(初期は透明なので0.0)
           label.fontColor = m_color  // 文字色指定
           m_parentScene?.addChild(label) // ラベルの取り付け
           m_labelArray.append(label) // ラベルの配列に登録
           // 表示する時間をずらすためのアクションの設定
           let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
           let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5)  // 不透明にするアクションの生成
           let seq = SKAction.sequence([delay, fadein])           // 上記2つのアクションを連結
           label.run(seq)                                   // 実行
           m_strcount += 1.0            // 現在の文字数をプラス
       }
       y = 0
       x = 0
       m_strcount = 0.0
   }
   
   func skipDraw(text: String!){ //スキップモードの文字の描画
       if m_drawEndFlag { return }
       self.remove()
       var text: String = text // テキストの保管と文字数の取得
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                    // 行目をプラス
               x = 0
           } else if x > maxWidth {   // 改行用の処理
              _ = y + 1      // 行目をプラス
               x = 0    // 行が変わるので、横にずらす距離を初期化
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
              _ = y + 1     // 行目をプラス
               x = 0
           }
           _ = x + 1     // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
           label.fontSize = m_fontSize // フォントサイズ指定
           // 文字の位置設定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
           // 透明度の設定(スキップの場合、最初から不透明)
           label.fontColor = m_color // ラベルの取り付け
           m_parentScene?.addChild(label)
           m_labelArray.append(label)
           m_strcount += 1.0
       }
       y = 0              // 縦ずらし初期化
       x = 0              // 横ずらし初期化
       m_strcount = 0.0   // 描画した文字数の初期化
   }
   
   /// 文字が全て表示されたかの確認
   func checkDrawEnd(){
       if m_labelArray.last?.alpha == 1.0 {
           m_drawEndFlag = true
       }
   }
   
   /// 描画モードの切り替え
   func changeState( mode: eTextState ){
       self.m_state = mode
   }
   
   /// 描画の基本設定はそのままに、違う文へ切り替え
   func changeText(text: String!){
       if m_drawEndFlag {
           self.remove()
           self.changeState( mode: .send )
           drawText(text: text)
       } else {
           self.changeState( mode: .skip )
       }
   }
   // ラベルの取り外し
   func remove(){
       while m_labelArray.count > 0 {
           m_labelArray.last?.removeFromParent()
           m_labelArray.removeLast()
           m_drawEndFlag = false
       }
   }
}
```
gameclear.swift
```
import SpriteKit
class GameClear: SKScene {
   override func didMove(to view: SKView) {
        let LabelText = SKLabelNode(fontNamed: "Chalkduster")
       LabelText.text = "ゲームクリア!"
       let myBoundSize: CGSize = UIScreen.main.bounds.size
       let titlefont = Int(CGFloat(myBoundSize.width/9))
       LabelText.fontSize = CGFloat(titlefont)
       LabelText.position = CGPoint(x:self.frame.midX, y:self.frame.height / 2+200)
        self.addChild(LabelText)
       //表示したい文字
       drawText(text: "表示したい文字")
         //
   }
   
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       if let _ = touches.first as UITouch? {
 
       }
   }
}
```
drawText(text: "文字")
同じ質問があったので取り消します。
同じ質問があったので取り消します。
  • Swift

    11956 questions

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

2 折りたためていなかった。

tanakana

tanakana score 53

2017/12/21 15:08  投稿

SpriteKitでゲーム中に文章を表示したい。
###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
```
Use of unresolved identifier
```
###該当のソースコード
```swift4
自分なりに修正してみました
MessageText.swift
import SpriteKit
enum eTextState: Int {
   case send = 0      // 通常文字送り
   case skip          // 文字送りスキップ
   case remove        // 貼付けた文字の取り外し
}
/**
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
class CSendText {
   // メンバ変数
   // テキストを文字送りするのに必要そうな変数
   var m_text: String?                // 表示する文字列
   var m_count: Int = 0               // テキストの文字数取得
   var m_strcount: CGFloat = 0.0      // 現在何文字目表示したか
   var m_delayTime: CGFloat = 0.1     // 一文字毎に描画するのを遅らせる秒数
   var m_nextLineKey: Character = "嬲" // 改行キー
   var m_parentScene: SKScene?        // とりつけるシーン
   var m_fontSize: CGFloat = 12.0     // フォントサイズ
   var m_labelArray: Array<SKLabelNode> = []  // 表示しているラベル達
   // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
   var x: UInt = 0             // 横に何文字目か
   var y: UInt = 0             // 何行目か
   var maxWidth: UInt = 15        // 横に最大何文字表示するか
   var m_posX: CGFloat?
   var m_posY: CGFloat?
   var m_color: UIColor = UIColor.black
   var m_drawEndFlag: Bool = false
   var m_state: eTextState = .send {
       willSet{}
       didSet{
           switch m_state {
           case .send:
               self.m_delayTime = 0.1
           case .skip:
               self.skipDraw(text: m_text)
           case .remove:
               self.remove()
           }
       }
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
   }
   
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
   }
   
   init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
        nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
       if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
       if (maxWidth != nil)   { self.maxWidth = maxWidth }
       if (delayTime != nil)  { self.m_delayTime = delayTime }
       if (mode != nil)       { self.m_state = mode }
       if (fontsize != nil)   { self.m_fontSize = fontsize }
       if (color != nil)      { self.m_color = color }
       self.m_posX = posX
       self.m_posY = posY
       self.m_parentScene = addView
       drawText(text: text)
   }
   
   required init?(coder aDecoder: NSCoder){
       fatalError("init(coder:) has not been implemented")
   }
   /// テキストの描画
   private func drawText(text: String!){
       // テキストの保管と文字数の取得
       var text: String = text
       m_text = text
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                   // 行目をプラス
               x = 0                  // 行が変わるので、横ずらしを初期化
           } else if x > maxWidth {   // 改行用の処理
               _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {  // 画面外にいかないように
              _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           }
           _ = x + 1
           // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)")
           label.fontSize = m_fontSize // フォントサイズ指定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))  // 文字の位置設定
           label.alpha = 0.0          // 透明度の設定(初期は透明なので0.0)
           label.fontColor = m_color  // 文字色指定
           m_parentScene?.addChild(label) // ラベルの取り付け
           m_labelArray.append(label) // ラベルの配列に登録
           // 表示する時間をずらすためのアクションの設定
           let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
           let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5)  // 不透明にするアクションの生成
           let seq = SKAction.sequence([delay, fadein])           // 上記2つのアクションを連結
           label.run(seq)                                   // 実行
           m_strcount += 1.0            // 現在の文字数をプラス
       }
       y = 0
       x = 0
       m_strcount = 0.0
   }
   
   func skipDraw(text: String!){ //スキップモードの文字の描画
       if m_drawEndFlag { return }
       self.remove()
       var text: String = text // テキストの保管と文字数の取得
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                    // 行目をプラス
               x = 0
           } else if x > maxWidth {   // 改行用の処理
              _ = y + 1      // 行目をプラス
               x = 0    // 行が変わるので、横にずらす距離を初期化
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
              _ = y + 1     // 行目をプラス
               x = 0
           }
           _ = x + 1     // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
           label.fontSize = m_fontSize // フォントサイズ指定
           // 文字の位置設定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
           // 透明度の設定(スキップの場合、最初から不透明)
           label.fontColor = m_color // ラベルの取り付け
           m_parentScene?.addChild(label)
           m_labelArray.append(label)
           m_strcount += 1.0
       }
       y = 0              // 縦ずらし初期化
       x = 0              // 横ずらし初期化
       m_strcount = 0.0   // 描画した文字数の初期化
   }
   
   /// 文字が全て表示されたかの確認
   func checkDrawEnd(){
       if m_labelArray.last?.alpha == 1.0 {
           m_drawEndFlag = true
       }
   }
   
   /// 描画モードの切り替え
   func changeState( mode: eTextState ){
       self.m_state = mode
   }
   
   /// 描画の基本設定はそのままに、違う文へ切り替え
   func changeText(text: String!){
       if m_drawEndFlag {
           self.remove()
           self.changeState( mode: .send )
           drawText(text: text)
       } else {
           self.changeState( mode: .skip )
       }
   }
   // ラベルの取り外し
   func remove(){
       while m_labelArray.count > 0 {
           m_labelArray.last?.removeFromParent()
           m_labelArray.removeLast()
           m_drawEndFlag = false
       }
   }
}
```
 
```  
 
 
gameclear.swift
```  
import SpriteKit
class GameClear: SKScene {
   override func didMove(to view: SKView) {
        let LabelText = SKLabelNode(fontNamed: "Chalkduster")
       LabelText.text = "ゲームクリア!"
       let myBoundSize: CGSize = UIScreen.main.bounds.size
       let titlefont = Int(CGFloat(myBoundSize.width/9))
       LabelText.fontSize = CGFloat(titlefont)
       LabelText.position = CGPoint(x:self.frame.midX, y:self.frame.height / 2+200)
        self.addChild(LabelText)
       //表示したい文字
       drawText(text: "表示したい文字")
         //
   }
   
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       if let _ = touches.first as UITouch? {
 
       }
   }
}
```
###試したこと  
課題に対してアプローチしたことを記載してください  
 
drawText(text: "文字")
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
  • Swift

    11956 questions

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

1 折りたたみ

tanakana

tanakana score 53

2017/12/21 14:53  投稿

SpriteKitでゲーム中に文章を表示したい。
###前提・実現したいこと
SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
```
Use of unresolved identifier
###該当のソースコード
swift4
```swift4
自分なりに修正してみました
MessageText.swift
import SpriteKit
enum eTextState: Int {
   case send = 0      // 通常文字送り
   case skip          // 文字送りスキップ
   case remove        // 貼付けた文字の取り外し
}
/**
* 文字送り用クラス
* 現在は横文字表示しか対応していません。
*/
class CSendText {
   // メンバ変数
   // テキストを文字送りするのに必要そうな変数
   var m_text: String?                // 表示する文字列
   var m_count: Int = 0               // テキストの文字数取得
   var m_strcount: CGFloat = 0.0      // 現在何文字目表示したか
   var m_delayTime: CGFloat = 0.1     // 一文字毎に描画するのを遅らせる秒数
   var m_nextLineKey: Character = "嬲" // 改行キー
   var m_parentScene: SKScene?        // とりつけるシーン
   var m_fontSize: CGFloat = 12.0     // フォントサイズ
   var m_labelArray: Array<SKLabelNode> = []  // 表示しているラベル達
   // 文字の位置決定用変数(後で変換するのが面倒なのでCGCloatで作成)
   var x: UInt = 0             // 横に何文字目か
   var y: UInt = 0             // 何行目か
   var maxWidth: UInt = 15        // 横に最大何文字表示するか
   var m_posX: CGFloat?
   var m_posY: CGFloat?
   var m_color: UIColor = UIColor.black
   var m_drawEndFlag: Bool = false
   var m_state: eTextState = .send {
       willSet{}
       didSet{
           switch m_state {
           case .send:
               self.m_delayTime = 0.1
           case .skip:
               self.skipDraw(text: m_text)
           case .remove:
               self.remove()
           }
       }
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: nil)
   }
   
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字色)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, color: UIColor!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: nil, color: color)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、横に書ける最大文字数)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, maxWidth: UInt!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: maxWidth, delayTime: nil, mode: nil, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、モード)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, mode: eTextState){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: nil, mode: mode, color: nil)
   }
   // (文字送りで表示するテキスト、フォントサイズ、初期位置X、初期位置Y、ラベルを取り付けるシーン、文字表示の遅さ)
   convenience init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!, delayTime: CGFloat!){
       self.init(text: text, fontsize: fontsize, posX: posX, posY: posY,addView: addView,nextLineKey: nil, maxWidth: nil, delayTime: delayTime, mode: nil, color: nil)
   }
   
   init(text: String!, fontsize: CGFloat!, posX: CGFloat!, posY: CGFloat!, addView: SKScene!,
        nextLineKey: Character!, maxWidth: UInt!, delayTime: CGFloat!, mode: eTextState!, color: UIColor!){
       if (nextLineKey != nil) { m_nextLineKey = nextLineKey }
       if (maxWidth != nil)   { self.maxWidth = maxWidth }
       if (delayTime != nil)  { self.m_delayTime = delayTime }
       if (mode != nil)       { self.m_state = mode }
       if (fontsize != nil)   { self.m_fontSize = fontsize }
       if (color != nil)      { self.m_color = color }
       self.m_posX = posX
       self.m_posY = posY
       self.m_parentScene = addView
       drawText(text: text)
   }
   
   required init?(coder aDecoder: NSCoder){
       fatalError("init(coder:) has not been implemented")
   }
   /// テキストの描画
   private func drawText(text: String!){
       // テキストの保管と文字数の取得
       var text: String = text
       m_text = text
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                   // 行目をプラス
               x = 0                  // 行が変わるので、横ずらしを初期化
           } else if x > maxWidth {   // 改行用の処理
               _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {  // 画面外にいかないように
              _ = y + 1                    // 行目をプラス
               x = 0                  // 同上
           }
           _ = x + 1
           // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)")
           label.fontSize = m_fontSize // フォントサイズ指定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))  // 文字の位置設定
           label.alpha = 0.0          // 透明度の設定(初期は透明なので0.0)
           label.fontColor = m_color  // 文字色指定
           m_parentScene?.addChild(label) // ラベルの取り付け
           m_labelArray.append(label) // ラベルの配列に登録
           // 表示する時間をずらすためのアクションの設定
           let delay = SKAction.wait(forDuration: TimeInterval(m_delayTime * m_strcount)) // 基本の送らせる時間に文字数を掛けることでずれを大きくする
           let fadein = SKAction.fadeAlpha(by: 1.0, duration: 0.5)  // 不透明にするアクションの生成
           let seq = SKAction.sequence([delay, fadein])           // 上記2つのアクションを連結
           label.run(seq)                                   // 実行
           m_strcount += 1.0            // 現在の文字数をプラス
       }
       y = 0
       x = 0
       m_strcount = 0.0
   }
   
   func skipDraw(text: String!){ //スキップモードの文字の描画
       if m_drawEndFlag { return }
       self.remove()
       var text: String = text // テキストの保管と文字数の取得
       m_count = text.utf16.count
       if m_count == 0 { return } // 空なら描画せず終了
       for _ in 1 ... m_count {
           if m_state == .remove { return }   // 表示途中で文字を消して、といった処理が来た時用のフラグと処理
           let chara:Character = text.remove(at: text.startIndex)        // 一文字目をテキストから削除
           if chara == m_nextLineKey {    // 嬲 は改行用のキー文時
               _ = y + 1                    // 行目をプラス
               x = 0
           } else if x > maxWidth {   // 改行用の処理
              _ = y + 1      // 行目をプラス
               x = 0    // 行が変わるので、横にずらす距離を初期化
           } else if m_posX! + (m_fontSize * CGFloat(x)) + m_fontSize/2.0 > (m_parentScene?.frame.width)! {
              _ = y + 1     // 行目をプラス
               x = 0
           }
           _ = x + 1     // ラベルノードの生成
           let label: SKLabelNode = SKLabelNode(text: "\(chara)") // "\(chara)"とすることでStringに変換
           label.fontSize = m_fontSize // フォントサイズ指定
           // 文字の位置設定
           label.position = CGPoint(x: m_posX! + (CGFloat(x-1) * m_fontSize), y: m_posY! - (CGFloat(y) * m_fontSize))
           // 透明度の設定(スキップの場合、最初から不透明)
           label.fontColor = m_color // ラベルの取り付け
           m_parentScene?.addChild(label)
           m_labelArray.append(label)
           m_strcount += 1.0
       }
       y = 0              // 縦ずらし初期化
       x = 0              // 横ずらし初期化
       m_strcount = 0.0   // 描画した文字数の初期化
   }
   
   /// 文字が全て表示されたかの確認
   func checkDrawEnd(){
       if m_labelArray.last?.alpha == 1.0 {
           m_drawEndFlag = true
       }
   }
   
   /// 描画モードの切り替え
   func changeState( mode: eTextState ){
       self.m_state = mode
   }
   
   /// 描画の基本設定はそのままに、違う文へ切り替え
   func changeText(text: String!){
       if m_drawEndFlag {
           self.remove()
           self.changeState( mode: .send )
           drawText(text: text)
       } else {
           self.changeState( mode: .skip )
       }
   }
   // ラベルの取り外し
   func remove(){
       while m_labelArray.count > 0 {
           m_labelArray.last?.removeFromParent()
           m_labelArray.removeLast()
           m_drawEndFlag = false
       }
   }
}
```  
 
 
```  
gameclear.swift
import SpriteKit
class GameClear: SKScene {
   override func didMove(to view: SKView) {
        let LabelText = SKLabelNode(fontNamed: "Chalkduster")
       LabelText.text = "ゲームクリア!"
       let myBoundSize: CGSize = UIScreen.main.bounds.size
       let titlefont = Int(CGFloat(myBoundSize.width/9))
       LabelText.fontSize = CGFloat(titlefont)
       LabelText.position = CGPoint(x:self.frame.midX, y:self.frame.height / 2+200)
        self.addChild(LabelText)
       //表示したい文字
       drawText(text: "表示したい文字")
         //
   }
   
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       if let _ = touches.first as UITouch? {
 
       }
   }
}
```  
###試したこと
課題に対してアプローチしたことを記載してください
drawText(text: "文字")
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
  • Swift

    11956 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る