feature image

2021年4月2日 | ブログ記事

DXライブラリで重力パズルゲームを作る

この記事は 新歓ブログリレー2021 25日目の記事です。


自己紹介

20BのMacky1_2です。高校生のとき独学で少しプログラミングを学んでいたのですが、1年時は情報工学系への転院希望(無事行けました!)であったので、熱中しすぎてしまうゲーム制作はほぼ封印し、色々と忘れてしまいました。このブログは、そんな私が、思い出すのに苦労しながら春休み中にパズルゲームを制作した記録です。


DXライブラリとは

画像の読み込み, 出力や、入力操作等、ゲーム開発に欠かせない関数がまとめられたライブラリです。(関数とは、とりあえず"道具"として捉えて頂いて構いません。)例えば、CheckHitKeyという関数があるのですが、これは、特定のキーが押されているかを判定してくれる道具で、「→キーが押されているならばプレイヤーを右に移動させる」などのプログラムを構築できます。

プログラミング未経験者に向けて

DXライブラリではC++というプログラミング言語が用いられるため、実際にDXライブラリを用いてゲームを作るには、C++に関する基礎知識を学んでおく必要があります。しかし、このブログは新入生向けであり、読者対象はプログラミング未経験者層が割合的に主であるため、未経験者でも問題なく読めるよう記述していますので安心してください。


ここからゲーム制作の記録に移ります。

目次

開発環境の準備

  1. はじめに
    ゲームを作るにも、作るための環境が必要です。今回は、DXライブラリでゲームを作ろうと気分で決めたので、プログラミング言語はC++になりました。また、DXライブラリでは、Windows, Android, iOSのゲームが作れるのですが、Windowsのゲームは作ったことがあるので、折角なので作ったことのないAndroidのゲームを作ることにしました。(最近iPadを買ったのでiOSの方が良かったんですが、どうやらMacじゃないと作れないみたいです...もってねえよ...)

  2. 環境構築
    DXライブラリの公式サイトに従って準備するだけでした。

  3. Windowsのゲームを作る時と違ったこと
    エミュレータの存在。エミュレータは便利で良きなのですが、どうやら私の低スぺノートでは動かないみたいです...。そのためノートpcでプログラミングするときは実機を使うことにしました。もちろん、デスクトップでは動きます。(RTX2080ti(じまん))

コンセプト

重力+モ〇ストの操作感でパズルゲームが作れないかなと考えていました。絵で表すと↓みたいな感じです。-----1
プレイヤーと障害物は万有引力で引き合いますが、障害物Aにぶつからずにゴールへ到達するには、プレイヤーをどの方向へ、どれだけの強さでショットすればいいか、というのがパズル性です。この例の場合、↓の黒矢印の方へ飛ばすと良さそうです。-----2

コンセプトの変化

はじめは重力でいこうと思っていました。しかし、重力だけだと拡張性が無いな...と思い、もっと良い案を考えたのですが、すぐに見つかりました。皆さんご存じクーロン力です。(traPの記事読んでるんだし皆さんご存じでいいよね)重力は引力だけですが、クーロン力には斥力もあります。これだけでも重力の上位互換ですが、電場が変化する特殊ステージを作ったり、磁場によるローレンツ力を考えたりするなど、かなりの拡張性が予想できます。そのため、コンセプトを「重力パズルゲーム」から、「荷電粒子によるパズルゲーム」に変化させました。

制作1(2/24~3/6)

  1. シーンの実装
    シーンとは、タイトルや、ステージ選択, ゲーム画面, クリア画面など、シーンの日本語訳そのままの"場面"を意味します。とりあえず、以下のように4つのシーンを作りました。当然、この段階はまだ"プロトタイプ(後に説明)"です。
    ※適当にトリミングしたため画像サイズがバラバラです。申し訳ありません。(実際のゲーム画面は1920x1080です。)

    タイトルシーン
    -------1

    ステージ選択シーン
    ---------1

    ゲーム画面シーン
    --------1

    クリアシーン
    --------1-1
    このように、初期の開発段階では、背景画像やフォントなどの素材が用意できていません。フリー素材等をそのまま使うのであれば、それほど素材集めにコストはかかりませんが、画像素材やBGM等を1から作るとなると、相当な労力がかかります。そのため、ゲーム素材を集める前に、ゲームの基盤を作り、これから作ろうとしているゲームがそもそも面白いのかどうかを確認する必要があります。この開発段階のことをプロトタイプといい、実際にゲームとしての面白さや拡張性が証明されれば、"プロダクション"段階へと進みます。プロダクション段階では、ゲーム素材を集め、プロトタイプ段階で、ただの丸であったプレイヤーや、真っ黒であった背景などと差し替えます。
    (※プロトタイプ段階であるのに、クリアシーンの星に、ちゃんとしたゲーム素材が使われている理由は、既にpc内にこの素材があったからです。(前ゲーム作ったときに入れた))

  2. ゲーム基盤の制作
    まず、電荷とクーロン力を実装しました。〇の中に書かれている数字が電荷です。
    --------2
    水色がプレイヤーで、黄緑色はプレイヤーではない荷電粒子です。
    次に、プレイヤーの操作を実装しました。モン〇トのようにプレイヤーをショットできます。
    --1
    ただし、モンス〇とは違い、プレイヤーが動いている間でも、何回でもショットできます。とはいえ、ショット数が多すぎると、クリア時の星の数を少なくするつもりです。
    次に、当たり判定を実装しました。また、荷電粒子同士が当たった場合、合体するようにしました。合体の挙動は以下の通りです。合体前の2つの玉をA,B, 合体後の玉をCとします。
    Aについて
    体積:Va   密度:Da   電荷:Qa
    Bについて
    体積:Vb   密度:Db   電荷:Qb
    Cについて
    体積:Vc   密度:Dc   電荷:Qc
    とすると、
    Vc=Va+Vb
    Dc=(Da×Va+Db×Vb)/(Va+Vb)
    Qc=Qa+Qb
    また、Cの合体直後の速度は、運動量保存則によって決定しています。
    次に、時間停止機能を実装しました。これは、どのタイミングでも、正確な方向, 正確な強さでショットできるようにするための機能です。画面をタップすれば時間が止まります。また、時間停止中に画面をタップするか、スライドしてプレイヤーをショットすると、時が動き出します。

    おまけ. GitHubサイコー!!!
    3/1に帰省を予定していたのですが、私の実家は愛知にあるので、バスで帰ると7時間ほどかかります。その時間何しよう...寝ようかな...と思っていたんですが、GitHubを使えばゲーム制作できることに気づきました!
    寮の自室のデスクトップ, ノートpc, 実家のデスクトップ間でGitHubを使えば、何時でもどこでも、同じゲームの開発を進めることができます。
    さて、GitHubとはなんでしょうか?その答えは、traPで最初にやる新入生向けGitHub講座で知ることができます!

完成したステージの例

  1. 公転
    でかい玉の周りを3周させればクリアです。
    -1
    このステージでは、でかい玉の密度を10^6, プレイヤーの密度を0.5としたため、プレイヤーはよく動きますが、でかい玉は全く動きません。そのため、太陽と地球間のような運動を実現できます。
  2. 振動
    でかい玉と合体すればクリアです。
    -2
    このステージでは、プレイヤーの密度を50, でかい玉の密度を10^11, プレイヤーを囲っている小さな玉の密度を10^12としたため、プレイヤーだけが動きます。ただし、プレイヤーの電荷と、でかい玉の電荷は共に負のため、簡単に合体することはできません。振動を強めてやる必要があります。

サボり(3/7~3/20)

音ゲーとApexにはまってしまいました。後半スマブラにもはまって1年ぶりにvip行きました。(KIRBY)

制作2(3/21~3/25)

3/21にp4kというイベントで中高生にプログラミングを教え、プログラミングのやる気を取り戻したのでここからは徹夜しまくって作りました(書いている今現在が徹夜明け5:21...)。
さて、ゲームの根本は、~3/6に制作し、ゲームとして成り立つかも確認したため、プロトタイプ段階は終了したとして良いでしょう。よって、ここからしばらくは、ゲームの見栄えを良くするプロダクション段階に入ります。これまで塗りつぶされた水色の丸であったプレイヤーと、緑色の丸であった荷電粒子は、ペイント3Dで作った手書き風の丸に差し替えました。また、フォントも手書き風フリーフォントに差し替え、背景はノートにしました。また、シーンチェンジは、ノートがパラパラ捲れるアニメーションをAviUtlという動画編集ソフトで自作しました!
----4

プレイ動画

とりあえず、一通り遊べるようになったため、プレイ動画を載せときます。
音はマイクで録音しているため、生活音とかが入っていたらすいません。

モンハン(3/26~4/1)

友達と朝5時まで集会所クエをやる日常を4日繰り返し、3/29にラスボス倒しました。早く終わらせすぎてしまったため、4月末のアプデまでモンハンの出番はありません。

今後(4/2~)

一応遊べるレベルにはなりましたが、まだ4ステージしか制作してないため、公開はもう少し先にします。とりあえず100ステージぐらい作って、何らかのゲーム制作コンテストに提出したらGooglePlayで公開しようと思います。ぜひ遊んでみてください。

以上25日目でした。大岡山に10回ぐらいしか行ったことのない実質新入生ですので、仲良くしてくれると嬉しいです!
明日の担当は@mazreanさん, @anninさんです。よろしくお願いします!!

Macky1_2 icon
この記事を書いた人
Macky1_2

20B, Game班所属 東方好きです。受験終わったら初例大祭行こうと思ってたけどコロナで行けてません。

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2017年11月14日
IBIS2017参加報告
Keijan icon Keijan
2021年3月19日
traPグラフィック班の活動紹介
NABE icon NABE
2020年5月15日
【新歓ゲーム制作特集 第2弾】Inverse製作秘話
Saltn icon Saltn
2019年5月16日
Party Kingdom
Double_oxygeN icon Double_oxygeN
2018年12月12日
多重スリーブの世界と,各種進捗報告。
Silviase icon Silviase
2018年4月17日
春休みにゲームを作りました
uynet icon uynet
記事一覧 タグ一覧 Google アナリティクスについて