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

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

ただいまの
回答率

91.23%

  • Swift

    5346questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 96

tanakana

score 18

前提・実現したいこと

SpriteKitでゲーム中に文章を表示したい。
http://neight968.hatenablog.com/entry/2015/07/22/040538
古い記事ですが、ここを参考にswift4で修正してみたのですが、実際の使い方が
わかりません。
テキストをどう定義して、どう呼び出したらいいのか
MessageText.swiftのdrawText()を
gameclear.swiftで使うにはどうすれば良いでしょうか?
よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

Use of unresolved identifier

該当のソースコード

自分なりに修正してみました
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: "文字")

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kei344

    2017/12/31 00:06

    運営にコンタクトをとり、削除されることをお勧めします。https://teratail.com/contact/input

    キャンセル

  • tanakana

    2017/12/31 01:36

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

    キャンセル

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

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

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • Swift

    5346questions

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