最終更新日:2021/11/24 2:58
作成者: @kiriem_
このテキストは、「Vue.jsでクイズアプリを作る」を終わらせていることを前提に作られています。JavaScript や HTML, CSSの基本が書かれていますので、必ず先にそちらを終わらせてから、こちらのテキストに入ってください。
今回の範囲を解説する動画を作っています。こちらを観ながら取り組んでください。
今回作りたいアプリは、ユーザの選択によって物語が変化していくストーリーアプリです。まずは実際に動いている様子を確認し、これから作るもののイメージを膨らませてください。
https://inpw.jp/app/storyapp/sample.html
ユーザの選択によって訪れる結末が変わります。ストーリーの工夫次第では多くのことを学ぶ事ができるアプリケーションになるでしょう。かなり複雑なプログラムが多いですが、頑張って作っていきましょう。
まずは環境構築をしましょう。
GitHubからソースコードをダウンロードする。
Visual Studio Code で、先程解凍したフォルダを開く。
このアプリケーションを0から作るのはとても大変なので、今回の実習では「データ構造」に特化して作業をしていくことにします。
まずは index.html
と main.js
を開いて中身を確認してください。すでにプログラムが入旅行されているのがわかるかと思います。今回事前に用意したこのプログラムは、問題のデータさえ正しい構造で定義されていれば、自然とすべての処理を適切にやってくれるように、汎用性を考えて作られています。今回皆さんに作っていただきたいのは、storyData.js
になります。
storyData.js
の56行目にimportStoryList
という関数が定義されています。この関数を main.js
で実行すると、データがアプリに読み込まれるようになっています。今回サンプルとして用意したストーリーの流れを確認します。まずはこのフローチャートを見てください。拡大・縮小ができるようになっています。
このように、それぞれの発言やイベントをきっかけに、選択肢がどんどん増えていき、最終的には9種類の結末を迎えることになります。このデータをJavaScript の配列に定義しているわけですが、一体どのようなルールで作られているのでしょう。
今回のアプリでは、次のようにそれぞれの場面やイベントを定義しています。
レイヤー Layer
:物語の深まりを管理しています。今回は3つの分岐によって4段階の深まりが定義されています。基本的に1つのレイヤーに1つ以上のシーンと分岐を含んでいます。
シーン Scene
: レイヤーの中で並列に存在する物語を管理しています。たとえば、レイヤー1の最後で3つに分岐したら、レイヤー2には3つのシーンが含まれることになります。
チャプター Chapter
: 1つのシーンの中に含まれている物語の場面を管理しています。チャプターの内容が画面に表示されています。問題 Question
: シーンに含まれる分岐を管理しています。
選択肢 Choices
: 問題に含まれている選択肢を管理しています。このような定義をすることによって、すべての場面をレイヤーとシーンとチャプターに振り分けることができるようになります。先程のフローチャートに Layer, Scene, Chapter を付け加えたものを見てください。
例えば、一番左上の「最後にボールを持っていた太郎君」という場面は、Layer2, Scene1, Chapter1 という3つのIDで表現することができます。また、その3つ下にあるひし形の問題は[Layer2, Scene1, Question]という3つのIDで同じように表現することができます。
main.js で書かれているプログラムでは、Layer, Scene, Chapter の組み合わせによって画面に表示するテキストや画像を判別しています。重複していたりデータが存在していなかったりしたらエラーになります。しっかりと確認するようにしてください。
言葉で説明されてもよくわからないかもしれませんので、実際のデータ構造を確認しましょう。これは、先程とりあげた「最後にボールを持っていた太郎君」が含まれている[Layer2, Scene1]
のデータ構造です。
chapters
は配列になっており、1つ1つのタイトルやテキストが保存されています。実際の画面で見てみると、このようになります。
つづいて、分岐する画面(Question)を見てみましょう。配列に定義されている文字が表示されていることがわかるかと思います。
それでは早速プログラムを作っていきましょう。storyData.js
を開いてください。
storyData.js
上部に定義されているデータ構造をまずは確認します。
この部分をコピーして、 imprtStoryList関数の中で定義されている storyListDefine 配列の中にコピーします。そして、次のようにデータを書き換えてください。
chapters の中身を複製して場面を2つにしています。また、choices[]の中身を複製して、選択肢を増やしています。ここまでできたら保存して、ブラウザで表示してみましょう。
ここまで表示されれば今日のところは十分です。なお、 next[] で定義しているlayerIdとsceneIdは現時点では作っていないので、選択肢ボタンをクリックするとエラーがでて動作が止まります。再度実行するためには画面を再読み込みしてください。