CoRでRPG作ろうとしたら色々ぶつかった #3
投稿者: 光楼(114) 投稿日:2020/09/19 22:21
ギブアップ!!!
前回はメッセージウィンドウを作りました。
実際表示してみると、全て同時に表示されます。
RPGとかでよくある、文字が左から順に表示されていくっていうアニメーション?はありません。
だから今回はそれを作ろうと思ったんですよ。ええ簡単ですよこんなの。文字列を一文字ずつ分解して、それを繰り返し文で順に表示すればいいだけですから。
勿論すぐに出来ましたよ。半角英数は。
半 角 英 数 は 。
一体何があったんだって?
まぁとにかく聞いてくれや。
文字の分解にはsplitが使えます。
これを使って表示部に以下のコードを書いた。
さっそく「うおおお!」が正常に表示されるか試してみよう。
その結果がこれだ↓
ま っ て
違うんだ、私は["う", "お", "お", "お", "!"]と分解されるのを期待してたんだ。
勿論これを全て繋ぐと「うおおお!」になる。
但し一文字ずつ表示させるとなると、なんかバグった感じになる。
このままじゃダメだ……!
なんとかこの問題を解消すべく、文字列分解用の関数を用意した。
さて、どう書いていこうか。
ここでさっきの画像をよく見て欲しい。
「"\201"」←これがよく出てくる。
これが問題解決へのカギに違いない!
きっと文字の区切りか何かだ。この「"\201"」までを1文字と判断するようプログラムを組んだ。
正常に分割できる半角英数対策が大変だ……
さてこれを実行してみる。
まずは「うおおお!」……
出来た!!!
いやログの表示おかしいけど、上手くいったんですよ(笑)
じゃあ次は「驚かせてすまない。」でいってみよー!
ふぇえええええええええええええ!!!
「い。」の表示に失敗している。
さてここで、「驚かせてすまない。」を分解したときの配列の中身を見てみよう。
そう、後ろの方に「"\201"」が無いのである。
ここで別の方法を考えることにした。
恐らくこれは文字列が1バイト毎に分割されているからこのようになっているのだろう。
ならばこの配列の長さを文字数で割れば、1文字分の長さが分かる!って思ったけど、文字数を得るsizeもバイト数を得るbytesizeも同じ値を示しやがった!
しかも上の配列よく見たら「"\201"」が出てくる間隔が一定じゃない!
チクショウメエエエエエエエエエエエエ!!!
……はい。もうどうしていいのか分からないのでこの件はいったん保留です。
これが出来なくてもRPGは作れるし。
ということで、問題解決のためのアイデアを募集中です!
なにかあればコメントで教えてください!それでは!
ツイート
前回はメッセージウィンドウを作りました。
実際表示してみると、全て同時に表示されます。
RPGとかでよくある、文字が左から順に表示されていくっていうアニメーション?はありません。
だから今回はそれを作ろうと思ったんですよ。ええ簡単ですよこんなの。文字列を一文字ずつ分解して、それを繰り返し文で順に表示すればいいだけですから。
勿論すぐに出来ましたよ。半角英数は。
半 角 英 数 は 。
一体何があったんだって?
まぁとにかく聞いてくれや。
文字の分解にはsplitが使えます。
これを使って表示部に以下のコードを書いた。
#テキストのアニメーション表示 str_arr = m.split('') debug_log str_arr print_text = '' str_arr.each do |item| print_text += item debug_log item message_sprite.text print_text wait_time(10) end
さっそく「うおおお!」が正常に表示されるか試してみよう。
その結果がこれだ↓
ま っ て
違うんだ、私は["う", "お", "お", "お", "!"]と分解されるのを期待してたんだ。
勿論これを全て繋ぐと「うおおお!」になる。
但し一文字ずつ表示させるとなると、なんかバグった感じになる。
このままじゃダメだ……!
なんとかこの問題を解消すべく、文字列分解用の関数を用意した。
さて、どう書いていこうか。
ここでさっきの画像をよく見て欲しい。
「"\201"」←これがよく出てくる。
これが問題解決へのカギに違いない!
きっと文字の区切りか何かだ。この「"\201"」までを1文字と判断するようプログラムを組んだ。
#========== 文字列 ==========# #文字列分割用 def StrSplit(t) debug_log t t = t.split('') debug_log t set_t = "" new_t = [] t.each do |item| set_t << item f = ('a'..'z') === item || ('A'..'Z') === item || ('0'..'9') === item || ('!'..'~') === item if item == "\201" || f debug_log set_t new_t << set_t set_t = "" end end return new_t end
正常に分割できる半角英数対策が大変だ……
さてこれを実行してみる。
まずは「うおおお!」……
出来た!!!
いやログの表示おかしいけど、上手くいったんですよ(笑)
じゃあ次は「驚かせてすまない。」でいってみよー!
ふぇえええええええええええええ!!!
「い。」の表示に失敗している。
さてここで、「驚かせてすまない。」を分解したときの配列の中身を見てみよう。
["\351", "\251", "\232", "\343", "\201", "\213", "\343", "\201", "\233", "\343", "\201", "\246", "\343", "\201", "\231", "\343", "\201", "\276", "\343", "\201", "\252", "\343", "\201", "\204", "\343", "\200", "\202"]
そう、後ろの方に「"\201"」が無いのである。
ここで別の方法を考えることにした。
恐らくこれは文字列が1バイト毎に分割されているからこのようになっているのだろう。
ならばこの配列の長さを文字数で割れば、1文字分の長さが分かる!って思ったけど、文字数を得るsizeもバイト数を得るbytesizeも同じ値を示しやがった!
しかも上の配列よく見たら「"\201"」が出てくる間隔が一定じゃない!
チクショウメエエエエエエエエエエエエ!!!
……はい。もうどうしていいのか分からないのでこの件はいったん保留です。
これが出来なくてもRPGは作れるし。
ということで、問題解決のためのアイデアを募集中です!
なにかあればコメントで教えてください!それでは!
コメントする
コメントするには、ログインする必要があります。
コメント一覧
qhqh123(投稿日:2020/09/22 20:04,
履歴)
(そっと応援する音)
光楼(114)(投稿日:2020/09/29 22:42,
履歴)
(そっと感謝する音)
m.split(//)
でどうでしょうか
でどうでしょうか
いっそ、半角英数以外を
全て3バイトとして判定してしまう案
全て3バイトとして判定してしまう案
def StrSplit(t) #debug_log t t = t.split('') #debug_log t #set_t = "" new_t = [] counter = 0 t.each_with_index do |item, i| if counter > 0 counter = counter - 1 else #set_t << item if !(('a'..'z') === item || ('A'..'Z') === item || ('0'..'9') === item || ('!'..'~') === item) #debug_log set_t new_t << t[i] + t[(i + 1)] + t[(i + 2)] counter = 2 else new_t << item end end end return new_t end