COJTとは
1/31に、筑波大学キャンパスOJT(以下COJT)という大学の産学連携の授業の成果発表をしてきました。
COJTには、ソフトウェアコースとハードウェアコースがあり、私はソフトウェアコースの方を受講しました。
ソフトウェアコースでは、アクセル社のAG4というグラッフィクスLSIで動作するゲームの開発と発表を行いました。
ハードウェアコースは、FPGAを使って各自好きな回路を作成したようです。
開発したゲームについて
私たちのチームは「大五郎の冒険」という横スクロールアクションゲームを作りました。
主人公は「大五郎」という犬で、行方不明になった、飼い主の「えりたん」を探しに冒険する、というストーリでした。
知っている人は知っていると思いますが、「大五郎」も「えりたん」もTwitterのBotなので、 攻撃方法や技は Twitter のお気に入りやリツイートなどをモチーフにしました。
スクリーンショットを貼るのが面倒なので、Twitterのツイートを埋め込みます。
【お知らせ】大五郎とえりたんが登場するアクションゲームを作りました!
1/31(金) 4・5限の時間にCOJTルーム(3C203)で遊べます!ぜひ見に来て下さい! #daigoroubot pic.twitter.com/tYAP0cvvwa
— がむ (@gam0022) 2014, 1月 28
【明日】大五郎とえりたんが登場するアクションゲームを作りました! 1/31(金) 4・5限の時間にCOJTルーム(3C203)で遊べます!ぜひ見に来て下さい! #daigoroubot pic.twitter.com/yMsYfx9TmU
— がむ (@gam0022) 2014, 1月 30
COJTなう! pic.twitter.com/AZNyWpdUSr
— atk (@hhelibe0207) 2014, 1月 31
説明書もあるので、アップロードしておきます。
画面はとてもゆるふわ系で明るい感じですが、難易度は鬼畜です。
それを想定して、30回コンティニュー可能にしました。
開発中のこと
全体の流れ
大学の後期の授業のプロジェクトだったので、10月から1月の4ヶ月の開発期間でした。
4ヶ月というと長いような感じがしますが、この間にAG4での開発を覚えるための課題があったり、 ゲームの企画を考えたり、冬休みや就活などがあったので、実際に集中して開発できたのは、冬休み明けの1ヶ月くらいでした。
企画については、ソフトウェアコースの12名全員で12個の企画を考えるのですが、 その中から半分の6つの企画しか採用されません!
採用されなかった企画の人は、くじ引きで採用された企画の人とペアを組んで開発しました。 ちなみに、講師の独断と偏見によって、企画は選定は行われました。
私の企画は幸いなことに審査を通過して、好きなゲームを開発することができました。
音声収録
また、1月の10日に、実際にスタジオまで行って、ゲーム用の音声をプロ声優の平田真菜さんに収録して頂きました。
プロの声優さんは、本当にすごかったです。テンションが上がりました。
少年から幼女、犬まで、あらゆる役を完璧に演じてしまったので感動しました。
この音声収録ができただけでも、この授業を受けた価値があったなと思いました。
技術的なこと
AG4に対応したコンパイラがCしか無くて苦労しました。(しかも古いC89とかの古い規格でした。)
動的デバッグもできなかったので、モダンな開発方法に慣れた私にとっては非常に辛いものでした。
allocなどで動的にメモリを確保することもできなかったので、Taskシステムというのを私のチームは採用することにしました。
Taskシステム
継承
例えばアクションゲームであれば、自機や敵やブロックを管理するときに、x,y座標やw,hの大きさなどは共通する情報なので、 これはBaseObjectのフィールドとして保持しておいて、自機ならHPやら弾の数などを派生クラスのフィールドとして保持しておきたい場面があると思います。
要するに継承がしたかったわけですが、これは union を使って解決しました。
Taskという struct を BaseObject として、Task の中に Data という union 型のフィールドを用意しました。 union には 派生クラス用のフィールドを保持する PlayerData や EnemyData などの struct を入れることで、継承っぽいことをしました。
union の実用的な使い方を生まれて初めて実践したような気がします。
動的確保
継承っぽいことをすることで、ゲーム内の全てのオブジェクトを Task という struct で管理できるようになりました。
動的確保については、Task 型の配列をあらかじめ配列として十分な数を確保しておいて、 allocTask() という関数で、未使用な配列の要素のポインタを返すようにます。
不要になった Task は、destoryFlag を立てておいて、allocTask() が呼ばれた時に、 destoryFlag が立った要素を返すようにすれば、簡単なGCっぽいこともできて完璧でした。
GitHub の Organization
GitHub の Organization を初めてまともに利用しましたが、簡単に利用できました。
pull request とかするよりは断然楽だったと思います。
キャラクターの動き
COJTに実際に見学した人しか分からないとは思いますが、大五郎の動きがすごいヌルヌルしていてよく出来ていたと思います。(手前味噌すぎる。)
大五郎のモーションについては相方が全部やってくれました。大五郎の3Dモデルを作成して、MMDでモーションを作って、2Dにレンダリングしました。
投票結果
成果発表では、見学者の投票によってゲームの順位が決められるのですが、 私たちのチームは残念ながら上位1,2チームに入賞することはできまんでした。 (上位1チームは打ち上げ無料、2チームは成績がA+ という特典がありました。)
といっても、どのチームも僅差で、1位のチームともそこまで差はつかなかったので、まあ良かったことにします。
6チームありましたが、どのチームも普通に実装力が高くて、ゲームとしての完成度も普通に高かった印象でした。
私たちのチームも技術的には十分高かったとは思うのですが、 他のチームとの差別化は出来なかったし、すごいと思わせるようなアピールも特に用意しなかったので当然な感じもします。
また、細かいUIのブラッシュアップや、ゲームを実際遊んでいるときの楽しさを 突き詰めることができなかったのが敗因だったかなと思います。
アクションゲームを選んだ理由としては、3分くらいで次々に遊ぶとしたら、ほとんどの人はルールが分かるし、 楽しんでくれる人も多いだろうという思惑があったのですが、その点に頼りすぎてしまった様な気がします。
難易度はものすごく高くしたつもりでしたが、半分くらいの人が最終面までクリアして、エンディングに辿り着いたので、 その点は想定していたくらいの難易度にできて、とても良かったと思います。
最後に
総合的に考えると、COJTを受講して良かったと思います。
前にCOJTを受講しようと考えている人へというエントリーを書いたので、詳しくはそちらを参照してください。
授業の内容というよりは、3編成やTAなどの新しい人脈が増えて良かったという点ですごい価値がありました。
ちょっとしたデスマーチ感も個人的にはすごく楽しかったです!! レッドブル美味しい!!
他のチームのエントリー
1位のチームの人のエントリーです。