2018 ソフトウェア設計及び演習用の班Wiki
18::gr12::tanaka
私は少々物忘れが激しく、活動記録がろくに思い出せないことが多々ある。ここでは備忘録も兼ねて、随時活動記録を記していくことにする。(5/17)
日本語入力のトラブルで長らく記述できなかった分の活動日誌を別の記録媒体に残していたので、全部ではないが復元できる限りの活動記録をまとめて記述していく。
(7/17)
5/18
先生との軽い面談を済ませた。また、モジュール分けをするために話し合いをした。また、班wikiをもう少し有効活用するようにアドバイスを頂いたので、班員と連携してもう少し積極的に記述して行こうと思う。
5/30
試しに自分が担当となったプレーヤーモジュールを作成する作業にとりかかった。http://www.atmarkit.co.jp/ait/series/965/のサイトを参考に、プロジェクトフォルダを作成して、キャラクターを表示させることに成功した。
6/1
今のところキャラクターモジュールで実装したいことは2つだ。
-
キー入力によってキャラクターを任意の方向に動かす
-
プログラムの一例(左に移動する時)
if(input.left){
chara.vec = 3;
chara.x += spd;
if(chara.frame >= 9 && chara.frame < 11){
chara.frame ++;
} else{
chara.frame = 9;
}
}
進捗……概ね順調。主人公の歩くアニメーションはフレームを変えることで簡単に表現することができた。キー入力に対応して主人公の座標を動かすことも、イベントリスナやinputを利用することで驚くほど簡単に表現できた。
バグ(問題点)
キー入力をしたまま、別のブラウザに移行した際に、キーが入力されっぱなしになる(キーを離しても、主人公が動き続ける)
斜め移動時のアニメーションが若干不自然(余裕があれば解消したい)
-
プログラムの一例(左に移動する時)
if(input.left){
-
モンスターから攻撃を受けた時に被弾アクションをとる
進捗……全く駄目。一応サンプル用の動かない敵を作成して、当たったらプレーヤーが点滅してノックバックするプログラムを作成したいと思う。
また、主人公の攻撃動作は武器モジュールに一任しているため、考えないこととする。
6/8
引き続き空き時間を見つつモジュールの作成。
-
キー入力によってキャラクターを任意の方向に動かす
前回の「キー入力されっぱなし問題」はどうにも「キーを押した判定」とか「キーを離した判定」とかのあたりに問題が潜んでいそう。余裕を持って解消していきたいが、今は被弾モーションを作らなければ。
-
モンスターから攻撃を受けた時に被弾アクションをとる
これが全く思うように行かない。上方向から敵キャラクタにぶつかった際に主人公に上方向に飛んでほしいのに別方向に飛んで行ったり、そもそも当たり判定が不自然だったり。課題点は挙げればきりが無い。(一応当たり判定は32*32のスプライトには32*32で与えられるようで、それを縮めると良いらしい)
-
クラスの導入
今までは普通にプログラムを記述していたが、クラス化したほうが良いと思ったのでCharaクラスを作成。引数はx,y座標。これにより、多少プログラムの記述を変更。
-
開発作業をやっていて思うこと
チーム開発って、かなりしんどい。自分のモジュールの問題も解決する必要があり、班全体の進捗も管理しながら、今後の展望も建てて……と言った班長としてのしっかりした仕事はとてもできず、それどころかチームのコミニュケーションに差異が生まれて認識の違いが生まれたり、確認不足が後々明らかになったり……せっかく班長をやることになったので、もっと上手に班をまとめて、良い作品を作りたいものだが自分にはチーム運営力も、プログラム力も明らかに足りなく、目の前の不具合に頭を痛めてばっかりだ。頑張らねば、と思う。
6/14
今日も統合をしようと思った。htmlの方で統合しようとしてもうまく行かず。直接プログラムを1つのjsファイルにまとめてもうまく行かない。どうやら自分のプログラムに対する知識理解に大きな問題があるようだ。夜も遅く、明日の中間発表に影響が出てはまずいので帰宅することにした。
6/15
中間発表だった。結局統合は出来ず、モジュールのみの発表となった。他の班の進行具合を目の当たりにして、焦りを覚える。自分のプログラムの課題解決に力を注ぎすぎて、班全体をまとめることが少々おろそかになっている気がする。頑張らねば。
6/22
-
モジュール分けのやり直し
今まで開発をしていてわかった事がある。このままのモジュール分けでは作業が難しい、ということだ。例えばプレーヤーモジュールと武器モジュール(主人公の攻撃コマンド)を分割して考えていたが、まとめてしまったほうが良いのでは無いか?データモジュールというデータを扱うモジュールを考えていたが、それは皆の作業が進むまで何も出来ないのではないか?マップ作成は?体力ゲージは?
と言った議論の末、モジュールを再分担することになった。以降、プレーヤーモジュールは武器モジュールの内容も担当することになった。作業量は増えるが、完成に向けて努力しようと思う。
6/29
-
攻撃モーションの実装が出来ない
被攻撃時のモーションよりは、キー入力によって動作するという点で作りやすいと思ったので、攻撃モーションを実装することにした。……が、プログラムをどういじってもうまく動作しない。そもそも思っていたが、自分が組んでいたプログラムは読みにくい。どうするべきか。
7/6
-
キャラクターモジュールの作り直し
断腸の思いでモジュールを再作成。一ヶ月かけて作ったchara.jsファイルにはこれ以上の進歩は無い。思い切ってこのファイルでの開発を諦め、chara2.jsファイルを作成。tank.jsを少々参考に、プログラムを書き直すことにした。 - 近距離攻撃モーションの実装
ひとまずキー入力を受けて、主人公が剣を構える動作をとるようになった。剣を構える→剣を振るという一定時間間隔でフレームを変更する動作をどう表記するかが課題となる。
以下、主人公モジュールで実装したかったこと
- Player
- LongAttack
- ShortAttack
- 導入したい動き
-
十字キーの入力による主人公の向き変更
移動はマップが担当するため、主人公の座標は固定 - zボタン入力による攻撃(遠距離、近距離)
攻撃力の値は武器から貰う。攻撃エフェクトを発生させ、そのエフェクトを当たり判定にする。
- 遠距離攻撃
- ゲーム座標上の主人公の座標は変わらないので、撃った弾が主人公の移動に合わせて動くようにする。
- 近距離攻撃に比べて、むやみに連射できないようにする(主人公の弾は画面内に一つしか存在できないようにする。一回弾を発射した時にリロード状態に遷移し、弾が画面外に出た際に消滅して初めて再び弾を発射できるようになる)
- 近距離攻撃
- 主人公が剣を振り、斬撃を発生させる。
- 当たり判定はあくまで斬撃。主人公の剣には発生しない。
-
敵から攻撃を受けた際の処理
グラフィックを点滅させHPを減らし、一定時間無敵になる。
7/13
-
遠距離攻撃の実装
近距離攻撃の挙動はSetTimeoutを用いることでどうにかなるかもしれないが、挙動がまだ良くわからないので保留。先にtank.jsを参考に、LongAttackクラスを作成した。主人公の座標(と言っても、主人公は画面の中心にいるのだが)と向きをとって、弾丸をとばすだけなので、ここはスムーズに作業が進んだ。
7/17
ひとまずキー入力を受けて、キャラフレームが変更されるようになった。ここからどうやって攻撃モーションを表現するかが課題となる。
とりあえず、SetTimeoutを漠然と扱うだけではこの問題は解決しないことがわかった。現時点で遠距離攻撃が超連射されてしまう問題、主人公が正常に武器を振ってくれない問題、主人公が被攻撃時に一定時間点滅するモーション、すべての課題解決に時間が絡んでくるので、もう少しSetTimeoutについて理解する必要がありそうだ。
7/18
-
遠距離攻撃が連射する不具合の解消
-
SetTimeoutを用いることによって、遠距離攻撃が連射される不具合の解消。
-
SetTimeoutを用いることによって、遠距離攻撃が連射される不具合の解消。
- 方針
-
変数LongAttack.reloadを作成。
- LongAttack.reload=0の時は弾丸が撃てるように、LongAttack.reload=1の時は弾丸が撃てないようにする。
- 弾丸を撃った際にLongAttackreloadを1に。一定時間後に0に戻す(=再び撃てるようになる)
これにより、連射を防ぐことに成功
-
変数LongAttack.reloadを作成。
- 近距離攻撃モーションの完成
上述の攻撃連射防止方法とSetTimeoutを応用することで、ボタン入力時に剣を振ることに成功。
- 近距離攻撃エフェクトの作成
あわせてShortAttackクラスの作成。LongAttackのクラスを少々改変して作成。斬撃を表示して、ここに当たり判定を付けることにした。
7/19
-
遠距離攻撃の弾道調整
- 今回作成したいゲームは、主人公が常に中央にいる(画面上での座標が変わらない)ため、弾を撃ったあとに主人公が移動したら、それに合わせて弾の座標も変更する必要があったので調整
7/20
-
統合後のキャラクターモジュールの動作調整
- 大きな問題点は、何故かShortAttackクラス(斬撃)をremoveChildしても画像が消えず、当たり判定が残り続けること。今後解決していきたい。
7/27
-
被弾時に主人公が点滅するように
これについては当たり判定を利用すれば簡単に実装できた。連続して点滅しないよう、相変わらずSetTimeoutを利用する。
- 遠距離攻撃が敵に命中したら消えるように……しようとしたが何故かremoveChildしても当たり判定が消えず断念
7/31
-
ShortAttackクラスの当たり判定ががremoveChildしても消えない問題
-
今回はもう時間が無いので、クラスを消す代わりにxy座標の遥か彼方へ飛ばすことで実現することにした。
正直これもっかい1からプログラム組まなきゃいけないのでは
-
今回はもう時間が無いので、クラスを消す代わりにxy座標の遥か彼方へ飛ばすことで実現することにした。
8/1
-
被弾時に主人公のライフゲージを減らすように変更
これにより被弾処理をmain関数に引っ越すことに。もっと上手にプログラムが組めるようになりたい。
- 装備武器の属性によって色を変更するように
武器データの属性をもらい、フレームを変えるだけ
開発を振り返って最後に雑感
プログラムの世界は非情だ。5時間作業しようと、成果が出なければ0だし、10時間作業して作ったプログラムだろうと、使わなければそれまでだ。やらざるをえないシチュエーションも多々あったが深夜作業は効率も悪く、決して長時間作業は美徳ではないと思った。適切に働き、適切に休む。人間のためにも仕事のためにも、締め切りに応じたスケジュール管理はもはや必須と言えるのではないか。私は見積もりが甘く前半でjavascriptの勉強をサボったツケがものすごい勢いで終盤降りかかってきた。
ここには書ききれない開発体験もあったが、あまりここで弱音を吐いていると後世に残るのでこの辺にしておこう。デバッグの時の記憶とかもう飛んでますし
苦労の分得られるものはあったので、真剣に取り組んだことに後悔は無い。最後に、共に戦った班員の皆さんありがとうございました、お疲れ様でした。
最終更新日:2018/08/08 08:30:29