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

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

ただいまの
回答率

90.50%

  • Swift

    7242questions

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

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

受付中

回答 0

投稿 編集

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

tanakana

score 45

前提・実現したいこと

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

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 = 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
        }
    }
}


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)
    }
 }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

    評価が高い質問は、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で質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Swift

    7242questions

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