パスワードを忘れた? アカウント作成
14279408 journal
日記

yumeの日記: C#学習 14 Console Adventure#5

日記 by yume

コメントありがとうございます。

Console Adventure
(ソースコード)

前回より:

インライン命令文をリピートさせることは、苦戦したが何とか完了した。
例えばテキストが:

[ret]こういう風に[name 0]を呼んだりしながら、[ret]行内改行[ret][ret]をたくさん置きつつ、さらに[meirei]インライン命令文でない[]文があってもちゃんと無視できる。
行内改行はもっとうまい方法がある気もするが、まぁよし。

さて、今度はノベルゲームらしくテキストを1文字ずつ表示していきたい。
そういば、まったく同じような仕組みをGame Maker Studio 2で書いたな、と思って読み返してみると、
・毎フレーム、charCount変数を+0.3する
・Console.Writeline(本文.Substring(0, charCount))
みたいな仕組みだったけど、GMSの世界では毎フレームこの命令が上書きされるからいいものの、C#で書く場合そもそもフレームという概念が無いな。すこし検索してみる。
ゲームエフェクトデザイナーのブログ (新)曰く:
・foreachでstringの文字数分ループして
・output変数の末尾にcharをstringにキャストして追加し
・それをlabel(GUIの窓か)の本文のとこに代入する
・今扱う文字が空白でないなら、await Task.Delayでディレイを入れる
という仕組みのようだが……。見慣れない単語が多い。GUI向けに書いてるからいろいろ違っている。
・関数に async Task 関数名()とある
ざっくり調べてみる
TECH.LAB曰く:
・Taskとは非同期処理のための新しくてうまいやり方
・同期処理ばかりだと、1秒待つ、とか入力を待つ、とかやるたびにプログラムが止まるけど、そうしたくないときに使う。
・古いやり方「Thread」では、メインスレッドとは別にスレッドを宣言・起動し、それぞれを同時に動かす
・Taskでも基本は似たようなもんだが、いろいろできることが増える


Task task = Task.Run(() => {
        HeavyMethod1();
});

とか書いてるけどなんじゃこりゃ。呪文である。

非同期処理についてもっと調べたい気持ちはあるが、いかんせん時間が遅い。
一旦知っている知識で導入してみると:


for (int i = 0; i < genLine.Length; i++)
{
        System.Threading.Thread.Sleep(speachSpeed);
        Console.Write(genLine[i]);
}

うん。ちゃんと動く。しかしこれではだめだ。
・一度のキー入力表示するブロックが多すぎる。
「かまいたちの夜」とか「街」だったら、一言くぎり、読点区切りくらいでキー入力を待っている。
・キーを何度も入力すると、先行入力っぽい感じになる(エンター連打してたら文末まで一気に読む)

こういう場合、理想的には、文字列表示中にキーが入力された場合、その区切りまで一気に表示などしたい。
一言区切りはなんとかなりそうだが、この先行入力っぽいのが起きてるのはどうしてだろう。明日考えよう。

ちょっと不便なので、
・タイトル画面を追加(仮仮)。
・タイトル画面で、文字表示速度の調節と、はじめから/途中から読むことができるように
を追加。

ストーリーテキスト70番まで追加。これでストーリーテキストははじめから終わりまで全部入ったことになるが、
ページ30からの分岐文がまだ書けていない。この分岐の結果で、その後の描写を少し変える、ということをしたいが、フラグ的な概念が必要になりそう。
ともあれ、一旦一応タイトルからエンディングまで遊べるゲーム……ゲームにはなった。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

普通のやつらの下を行け -- バッドノウハウ専門家

読み込み中...