2811


ゲームアプリの制作において、

Aさん「すいません」 Bさん「何か御用ですか？」 Aさん「いえ、なんでも」 Bさん「……そうですか」

というように同じViewController内で、文章と名前の部分だけ推移していきたいのですが、 (※逆転裁判のようなイメージです)

現時点だと名前(ネームプレート部分)と会話本文と次の会話に推移するボタンの紐付けしか完了せず、それから行き詰まってしまい、コードが全く思いつかない状況です。

というような初心者で申し訳ないのですが、 「次頁へ」というボタンを押せば、名前と会話本文が写し出され、
なお全ての会話が終了したら次のViewControllerに推移するようにするとすればどうすれば良いでしょうか？

また、会話本文の全文を最初から表示するのではなく、「あ→あい→あいう」などのように時間差をつけて表示するにはどう打てばいいのでしょうか？
(NSTimerを使ってみましたが、全く上手く行かず……)

どうかご回答よろしくお願い申し上げます。


CC BY-SA 3.0
2014-12-28T13:18:49.827
2748
2018-10-24T21:17:07.830
5832
question
swift xcode
Xcode + Swiftでのアプリ制作(ゲーム)


> (NSTimerを使ってみましたが、全く上手く行かず……)

どう試してみたのか、書いてみればアドバイスがもらえるかもしれません、丸々どうすればよいかを聞くよりも何故動かないか聞くようにした方が良いと思います。

とりあえずNSTimerでそれっぽい表示をするコードは以下の様になります。

[code]

    UILabelをlabel1に ButtonのActionをbuttonTouchUpInsideに紐づけてください。
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var label1: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            var timer = NSTimer.scheduledTimerWithTimeInterval(0.25,
                            target: self,
                            selector: Selector("updateLabel"),
                            userInfo: nil, repeats: true)
            label1.sizeToFit()
            label1.numberOfLines = 0
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        // 表示済みも字数。-1のときは表示処理がされない。
        var showed = 0
    
        // 表示するテキスト
        var text="あいうえおかきくけこさしすせそたちつてとなにぬねの"
    
        func updateLabel(){
            if(showed >= countElements(text) || showed < 0){
                return
            }
            // １文字表示
            label1.text = text.substringToIndex(advance(text.startIndex, showed + 1))
            showed += 1
        }
    
        @IBAction func buttonTouchUpInside(sender: AnyObject) {
            showed = -1 // マイナスのときは処理されない
                        // 様に作ってあるのでマイナスにして入れ替える
            // 次に表示するテキストを設定
            text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
            showed = 0  // 0にして表示スタート
        }
    }
    
[/code]

Labelは数行表示できる高さにしておいてください。

Labelの縦位置やあまりに文字が多いと `...` 表示されるなど、不満が出てくるかもしれません。
その辺りを処理するには指定Fontで何行分必要か計算したり、最大表示文字数がどの程度かをチェックする必要が出てきます。

ゲームを作成されるのであれば、ライブラリ・フレームワークを利用してそういった部分はフレームワークに任せてしまう方が良いと思います（そういう部分を勉強したいのであれば話は別ですが）。

COCOS2Dはフリーでライセンスも縛りがきつくなく、swiftも使えるようです。 <http://www.cocos2d-swift.org/>

有名ですので、検索すれば日本語で解説してくれているサイトもありそうです。 もちろん他のフレームワークでも構いません。  
全てを一から作らずにこういった補助ツールを使う選択肢もありますよ、という助言です。

（もし、どれが良いかをここで聞きたい場合は、どういうものを作りたいかをはっきりさせてそれを実現できるフレームワークは何かという聞き方にしましょう。）


CC BY-SA 3.0
2014-12-30T00:02:44.347
2811
2014-12-30T00:02:44.347
728
2748
answer


とりあえず、現状のコードを示されることが良いかもしれません。  
私が簡単に思いつくのは、シナリオに沿ってセリフや人物の名前を持った配列を持っておき、ボタンをクリックするごとに配列のインデックスをインクリメントして、TextLabelなどにその値を連携するように実装すれば可能だと思います。それであれば、特にページ遷移しないままセリフ、人物の名前を遷移させることができます。


CC BY-SA 4.0
2018-10-24T21:17:07.830
49627
2018-10-24T21:17:07.830
25745
2748
answer