2018 ソフトウェア設計及び演習用の班Wiki
18::gr04::kitagawa
5/18 モジュール分け
- モジュール訳を途中まで考え、システムごとのモジュールで分けることにした。続きは他の曜日にメンバーで集まってモジュール化を行う予定
- モジュール分けの結果フィールド画面の作成を担当することなった
5/25 プロトタイプ作成
- 現在は、キャクターの移動と敵キャラにあたった時にすり抜けないようにするための対策プログラムを作成。これによって、不自然な動きをなくして敵キャラに対して話しかけるイベントが行えるようになった。
6/1 プロトタイプ作成
今回は、障害物判定のプログラムを作成。 map.hittestメソッドを使ってhittestがfalseのときは、キーボードの押している方向に対して移動できるように上下左右において同じようなプログラムを作成した。
6/22 モジュールの実装
- マップ以外にアイテムの獲得の仕方についての構造を考えた
- アイテムとの衝突判定→衝突しているなら、アイテムを獲得したとの通知→アイテムの獲得量を示す変数を増加→通知の終了
- このようなスタイルで作成していく。
6/29 モジュールの設計
- 今回はアイテムの獲得モジュールを組み立て行った。
- addEventListenerで設計したが、獲得したあとでもボタンを押したら同じようなメッセージが繰り返し表示されてしまう問題が発生。
7/6 モジュールの単体テスト
- まだ単体でテストできるような状況ではないので引き続きモジュールの設計を行った。
- マップモジュールは、まだ大まかな下地しか載せていないので、最終的に机や椅子などを配置できるようにしていきたい。
- アイテムの獲得は、1度きりのイベントにするためにアイテムを獲得したあと、removeEventListenerでイベント自体を削除するように組み直した。
7/13モジュール説明(マップモジュール)
- chara.jsでは、マップと障害物の設定、キャラクターの設定、メッセージ枠の関数が定義されている。
hero.addEventListener
- ここでは主人公のキー入力による移動、移動に伴うマップの移動が定義されている。最初のif関数ではキー入力によって主人公の移動速度、主人公のアニメーション、加速度をthis.vx,vy、this.frame,this.ax,ayで記載されている。
- 次は移動先を判定してキャラを移動させる関数を定義している。
- ここであらかじめ速度の最大を定義しておきvmaxとしておく。
- その後、壁があるかをhitTestをつかて判定し移動先を決める。壁があったら速度を0にすることで壁よりも向こうには勧めないように設定する。
7/20キャラクターモジュール説明
- キャラクターは主人公とそれに対する敵キャラ、マップ上に表示するアイテムなどを定義している。マップ上に表示するアイテムはレポート、過去問であり、マップ内のどこかに隠されている。アイテムはBボタン(キーボードで言うXボタン)を押すとアイテムを拾い上げることができ、内部ではグローバル変数としてreport_counter、oldtest_counter、credit_counterが実装されており1つ拾い上げるごとにcounterの数を1つ増やしその値をバトル画面のシーンに渡すことで、実際にバトルシーンで攻撃力や防御力アップのアイテムとして使用できるようにしている。
- 単位はどこに配置されるかは起動毎にランダムに設定されており見つかりにくくするために、透過度を上げている。
- アイテムは1度拾ったらremoveChildで消えるようになっている。
7/27メニュー画面との統合
- マップ画面でescキーを押すことでメニュー画面を表示できるようにするために新しくaddEventListenerを設定した。 しかし、このままではescキーを押した回数分だけメニューが表示されてしまうので重複して表示されないように設定を調節した。 メニュー画面では自分の体力、レベル、アイテムの所持数を表示させるため、hp、level、report_counter、old_counter、credit_coounterをそれぞれ引数として関数に渡す。
7/27バトル画面との統合
- バトル画面に行くにあたっては、battlecommand.jsにバトル画面の詳細が記述されているので、そちらをクラス化し、マップ画面の方から的に話しかけた時に遷移するように行い、どの敵キャラなのかを判別するためにここの敵キャラに予め番号(enemyid)を振り分けておき、そのグローバル変数でどの敵なのかを判別し弾幕や攻撃力の強さを調整する。
- 倒したら、マップ画面に遷移するのでそこで敵キャラクターは消えるようにremoveChildし、aボタンを押した時にまた同じ戦闘にならないようremoveEventListenerで無名関数を削除する。
- そして、敵キャラを何体倒したかを定義しているグローバル関数boss_counterを+1し、ある一定の値まで溜まったら最後のボスとしてがんちゃんを追加するようにしている。
- 敵がいる場所には障害物判定が施されているので敵を倒したあとはそこを通過できるように障害物判定を行う配列の値を変更している。
8/3敵キャラモジュールの説明、アイテム獲得モジュールの説明
敵キャラは基本の動作は同じで、zボタンを押す→メッセージの枠を表示する関数を表示→予め表示するテキストを決めておきnovel関数に引数として渡す→戦闘に移る→敵キャラのグラフィックを削除→敵キャラとの遭遇イベント自体を削除の流れになっている。
- どの敵であるかを判別するためにenemyidで敵を識別できるように
- commandpartは戦闘画面への遷移を表す
- boss_counterはこれまで何体敵を倒したかを表す関数でありこれまでに2人倒してきたならば次はラスボス戦なのでラスボスのグラフィックを追加するようにしている
- 敵が消えるので支所に定義した障害物の判定を消すように配列の値を変更している
- 最後にこれまでの敵との会話イベントを削除するためにremoveEventListenerで無名関数を削除している。
- アイテム獲得の説明
- アイテムはxボタンを押した時に拾えるようにaddEventListenerで定義しており、まずif文でアイテムと衝突判定にあるかどうかを判断する、もし衝突判定がtrueならば、アイテムを拾い上げるのでitemというシーンを作成しそこにアイテムを獲得したことを表すメッセージを表示させるため、message関数を使ってメッセージ枠の画像を表示させその上に、novel関数という文字を表示させる関数に予め表示させたい内容(画像ではレポートを手に入れた!)を変数として決めておきその変数を表示させたいシーンと一緒に引数として渡してあげる。
- 文字が表示されたあとはもう1度zキーを押すことでシーン自体をポップし、mapの上に乗っているアイテムを消すため、removeChildを実行する。アイテムが獲得されたのでレポート、過去問、単位の持っている個数を表すグローバル変数report_counter、oldtest_counter、credit_counterのいずれかをインクリメントさせる。 他のアイテムでもほとんど同じような動きをさせている。
- メッセージ関数
メッセージ関数はメッセージ枠を表示する関数で画像を表示させている
- novel関数
- ノベル関数では渡された引数をそのシーンに表示させる関数で、一文字ずつ受け取った文字列を表示させる。そおときに特定の文字が来ると改行やクリック待ち状態にさせるなどを定義している。
感想
- うまく行ったところ キャラクターの障害物の判定がうまく組み立てられたのですごく良かった 他のモジュールへの受け渡し 予めどんな動きにしたいかを予想して大まかなプログラムを元に細かく調整することで、完成度を高められた。 もともとよく集まるメンバーだったのでわからないところに関してはお互いに聞きながらバグの改善をすることができ、自分も結構助けられた。
- うまくいかなかったところ 計画がなかなかうまく進まず直前まで試行錯誤するところが多かった すべての動作におけるバグの除去が難しく対処できない部分もいくつかあった。 OP、戦闘画面の雰囲気にあったマップを作成したかったが素材がなかなか見つからず苦戦してしまった。
- 学んだこと 今回4人1組で1つのソフトウェアを設計するということで、細かくモジュール分けどんな動作をさせたいのかの設計図をきちんと作っておくことが、プログラムの作成において最重要なことであると改めて認識した。毎回ごとにどこまですすめるかなどの目標もはっきりとしていなかったので、そのあたりをもっとはっきりさせておくことで、完成した時に完成度を高めるためにはどうしたらよいかの余裕をもたせられる開発ができたのではないかと思った。 自分である程度調べれば出てくることも多かったので友達などと一緒に話し合いながらすすめることができた。 一から新しい言語javascriptを学んで、C言語以外の言語の特徴や差異を知ることができた。
最終更新日:2018/08/03 15:08:02