スキップしてメイン コンテンツに移動

Defoldで物理演算を利用したゲームの作り方

 

前回Defoldで簡単なカーソル移動でコインを集めるゲームを作成しました。

今回は物理演算も自動で行ってくれる強味を活かしたゲームを作れるようになるために、機能の説明をしていきます。

最後に出来上がったファイルはこちらにサンプルとして載せておきます。

github.com

環境

  • windows 10 home 64bit
  • Macでの動作確認はしていません。

前提事項

前回説明した範囲はなるべく省いてテンポが良いように説明していきますので、前回の記事を読んでからこちらの記事を進めてもらうと分かりやすいです。

前回と同様こちらで使用する画像はライセンスCC0と明記されたものを使用して行います。各自で使用する画像を変える場合は著作権などに違反しないようにしましょう。以下に今回使用する画像をダウンロードしたサイトを示します。

  • 注意:ネットの画像を使用する際はライセンスなどに注意して使用しましょう。本記事を参考にした場合に起こった問題は全て個人の責任になるため、筆者は一切の責任を負いかねます。

pixelfrog-assets.itch.io

準備

前回同様、新規プロジェクトを作成してダウンロードした画像フォルダを解凍して、作成したassetsフォルダに入れておきます。

まず最初に重要な編集をしていきます。

game.projectを開いてゲーム内の全体的なパラメータを編集をしました。

ここではScaleパラメータの方が重要なので先に説明します。

リファレンスではScaleは以下のような説明になっています。

Scale
Tells the physics engine how to scale the physics worlds in relation to the game world for numerical precision, 0.01–1.0. If the value is set to 0.02, it means that the physics engine will view 50 units as 1 meter ($1 / 0.02$). The default value is 1.0.

引用:https://defold.com/manuals/project-settings/#scale

Deeplによる訳

物理エンジンに、ゲーム世界に対して物理世界をどのようにスケールさせるかを数値の精度で指示します。0.02に設定すると、物理エンジンは50ユニットを1メートルと見なすことを意味します($1 / 0.02$)。デフォルトは1.0です。

forum.defold.com

上記のフォーラムを合わせて読みと分かりやすく、スケールを0.02に設定すると50(ユニット=ピクセル)が1メートル相当の計算になるようです。

そのため、デフォルトの1.0設定だと数値的には1メートル進んでいますがピクセルでも1ピクセルしか進んでいないため、人間から見るととても遅く見えるようです。

そのため、0.02などの1より少ない値にすることで1メートルあたりのピクセル数を大きくしてあげることによって現実世界の実際の長さとピクセル数を寄せる必要があるようです。もちろん完全に合わせることは無理なので、直感的なスピードになる程度に合わせることが重要です。

これらを含め、Gravity Yで設定した値が-500だったのは、スケールで1メートルを50ピクセル分と設定したため以下の式が成り立ちます。(重力は下方向に働く力のためマイナス)

-500 / 50 = -10 ≒ -9.8 (m/s2)

分かりやすくするためにはスケールを変えたら、重力もしっかりと現実世界にリンクさせる必要があります。

これで設定とその説明は終わりました。

オブジェクトに力を加える

前回までの説明で、ゲームオブジェクトの作成と当たり判定のコリジョン、ゲーム画面への出力は説明済みのため省略します。

一部詳細設定

  • 画像が小さかっため、画像スケールは2倍
  • コリジョンオブジェクトのTypeDynamic
  • コリジョンオブジェクトの名前をangry-pigに変更(重要)

現時点ではこんな感じです。

画面左下に表示しているので実行すると一瞬で下に行って消えます。

なので適当にコリジョンオブジェクトで作成した透明の床を作ります。(TypeStatic

そうすると透明の床で止まってくれます。

次に、オブジェクトを飛ばすためのスクリプトを書いていきます。

スクリプトを作成して以下のプログラムに書き変えたうえでゲームオブジェクトに適用していきます。

angry-pig.script

function init(self)
    msg.post(".", "acquire_input_focus")
end


function on_input(self, action_id, action)
    if action_id == hash("key_right") and action.pressed == true then
        msg.post("#angry-pig", "apply_force", {force = vmath.vector3(10000, 150000, 0), position = go.get_world_position()})
    end
    if action_id == hash("key_left") and action.pressed == true then
        msg.post("#angry-pig", "apply_force", {force = vmath.vector3(-10000, 150000, 0), position = go.get_world_position()})
    end
end

キーボード入力するので以下のようにgame.projectを変更してください。キー割り当てはデフォルトですべて割り当てられているファイルがあるのでそれを使用します。

再度ビルドして実行すると左右の矢印キーでピョンピョン飛び跳ねるようになります。

msg.post("#コリジョンオブジェクトの名前", "apply_force", {force = vmath.vector3(xの数値, y数値, 0), position = go.get_world_position()})

このように、コリジョンオブジェクトにapply_forceメッセージを送ることによって任意のタイミングでオブジェクトに力を加えることができます。上記のangry-pig.scriptのように記述する場合、Idがangry-pigと名のついたコリジョンオブジェクトが存在する必要があります。

defold.com

タイルマップの使い方

最初に示したパブリックドメインの画像集をダウンロードすると以下のような画像が含まれていますので、こちらを使って説明していきます。

 Terrain (16x16).png

以下の作業をします。

編集画面でSpaceキーを押すとタイル選択画面になるので、欲しいタイルをダブルクリックして選択します。 選択するとまた編集画面に戻ってきます。

Shiftキーを押しながら編集画面でタイルをダブルクリックすると選択したマスのタイルを選択状態にすることができます。

Shiftキーを押しながら何もないマス目を選ぶと消しゴムと同じ効果を得られます。

また、編集画面でShiftを押したままドラッグすると範囲コピーできるので、べた塗りの時はある程度埋めて範囲コピーして全体に適応していく方が早いと思います。人マスずつ埋めていくのが基本なのかこのマップ作成方法はかなり面倒でしたがほかに良い方法が見つけられなかったです。

これらを駆使して床や壁、背景の見た目を作れます。

編集したマップを床のコリジョンオブジェクトが適応されているGameObject内に配置するとこんな感じになりました。動画撮影の影響で右端に余白がありますが実際のゲーム画面ではすべて収まっています。

今回はキャラクターを2倍のスケールで表示しているのでタイルマップも2倍のスケールに設定しています。

また、初期設定でタイルマップを置きすぎると以下のエラーが出るようなので、Game.Project内の設定を変更すると回避できます。

私の環境では以下のような、横長のフィールドを用意していますが、カメラが固定のため画面から外れると見えなくなってしまいます。そのため次の項ではカメラをキャラクタに追従させる方法を説明します。

カメラの位置を変える

こちらの記事通りに行うカメラで特定の物を追従できますが、特定の物を回転させたときにカメラも一緒に回ってしまうのと、若干記述量が多く難しくなってしまうため単純にカメラの座標を随時更新させる方法で進めて行きます。

defold.com

既に前の項で作成したangry-pig.scriptを以下の内容に書き変えます。

angry-pig.script

function init(self)
    msg.post(".", "acquire_input_focus")
    self.follow = false
end


function on_input(self, action_id, action)
    if action_id == hash("key_right") and action.pressed == true then
        msg.post("#angry-pig", "apply_force", {force = vmath.vector3(500000, 200000, 0), position = go.get_world_position()})
    end
    if action_id == hash("key_left") and action.pressed == true then
        msg.post("#angry-pig", "apply_force", {force = vmath.vector3(-500000, 200000, 0), position = go.get_world_position()})
    end
end

function update(self, dt)
    local p = go.get_position()
    if self.follow then
        go.set_position(vmath.vector3(p.x - 980 / 2, 0, 0), "camera")
    else
        go.set_position(vmath.vector3(0, 0, 0), "camera")
    end
    if p.x > 980 then
        self.follow = true
    else
        self.follow = false
    end
end

camera.scriptを作成して以下に編集します。

camera.script

function init(self)
    msg.post("#camera", "acquire_camera_focus")
end

その次にmain.collection内cameraと名付けたGameObjectを作成します。

そして、新しくCameraコンポーネントと先ほど作成したcamera.scriptcameraゲームオブジェクト内に作成します。

そうするとこのような感じになります。

これで実行すると以下のようになることがわかります。

camera.scriptではカメラを固定でなく動的なものとして設定しています。

defold.com

angry-pig.scriptではupdate関数が追加されて、キャラクターがx座標980を超えたら画面中央の縦のライン内に来るように随時cameraゲームオブジェクトの座標を変更するように記述しています。

まとめ

今回は、他のの記事ではあまり説明されていない内容を重点的に説明していきました。 以前の記事の内容よりも、これらを利用することによって作れるゲームの幅が広まったと思います。

 

コメント

このブログの人気の投稿

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その2

前回の記事 に引き続きPhaser3+Typescriptを使って RPG の基礎を作っていきます。 この記事は前回の記事を呼んだ前提で説明していきますので、ぜひそちらを先に読むことをお勧めします。 また、今回の記事は前回よりも難易度と内容量が上がっていますが、記事の最後に作業後の リポジトリ のリンクがありますので、そちらを先にダウンロードしてそちらと比較しながら学習することができます。 前回まで作成した状態のプログラムが以下の リポジトリ からダウンロードできますので前回まででうまくいっていない方は参考にしてみてください。 github.com 最終目標(再掲) ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・ゲームの作り方の断片を知る ・キャラの表示できるようにする ・キャラを移動できるようにする ・当たり判定をつける ・ NPC の追加してみる ・話しかけられるようにする 開発前提(再掲) ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール(再掲) ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 当ブログ仕様の画像素材の注意点 当ブログで使用する画像素材は『 ピポヤ倉庫 』より許可なしで無償再配布・改変が認められたものを改変して作成されたものです。 中には許可なく再配布・改変してはいけない素材もインターネット上には多く存在するのでそれらを使用するときは十分に規約を呼んでから使用しましょう。 1. キャラの表示 想定画面 今回は、はじめにキャラつまり操作

M5Stackで、においセンサー(TGS2450)を使ってみる。(LCDに表示編)

今回は、においセンサー(TGS2450)から取得したデータをM5Stackの LCD にグラフ表示をしていきます。 今回主に使用したもの M5Stack 10Ω抵抗 5本 Pch  MOSFET  2SJ334(スイッチとして利用) M5StackSideBB(ブレッドボード) M5Stackのピンはそのままだと配線するとき手間がかかるかと思いますので、今回はM5StackSideBBを利用しました。 ブレッドボードも付いているので、手軽に電子工作できるので個人的にオススメです。 SideBB for M5Stack www.switch-science.com 諸注意 本ブログのプログラムはArduinoIDEまたはPlatformIOでM5Stackの開発ができる状態であること前提のものですので、各自導入をお願いします。 過去に Windows のArduinoIDEで M5Stackの開発環境を構築する記事 があるので、参考にしてください。 においセンサー(TGS2450)について 今回使用したセンサーは 秋月電子通商 で購入できます。 http://akizukidenshi.com/catalog/g/gP-00989/ akizukidenshi.com TGS2450には4つのピンがあり、使用するのはそのうちの3本でヒーターを温めるピン、センサー情報を得るピン、GNDがあります。 ここで注意したいのは、ヒーター電圧は1.6Vと記述されているのでM5Stackで利用するときは分圧して3.3Vを1.6V近くまでに降圧することをお勧めします。 TGS2450のセンサーは可変抵抗になっており、データシートには5.62kΩ〜56.2kΩの間を抵抗が変化し、においが強いとより低くなると記述されていました。 よって、センサーの値をM5Stackで取得するにはセンサー抵抗と外部に接続する任意の値の抵抗による分圧回路によって求めることができます。 TGS2450の動作方法は、250ms周期でセンサーに電圧を5ミリ秒on、245ミリ秒offの状態にしてヒーターは8ミリ秒on、242ミリ秒offにすることで値を取得します。 配線 においセンサーとM5Stackの配線 上の図が配線図です。 30Ωの抵抗は10Ωの抵抗を三つ直列に接続して作成しました。 また、上部の抵抗10Ω二

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その1

今回はPhaser3とTypescriptを使って簡単な RPG ゲームを作る方法を紹介していきます。 内容はPhaser3およびゲーム作りについての記事なので、Nodejsの周辺モジュールなどの説明は一部省いての説明になりますのでご了承ください。 またこの記事では Phaser2 ではなく Phaser3 を使用するので注意してください。 この記事は二部構成になりますので、この記事を読んだ際はぜひ次の記事も読むことをお勧めします。 最終目標 ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・開発環境を整える ・Phaser3の開発構成を知る ・スタート画面を作る ・マップ表示をさせる 開発前提 ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 1. 最低限の開発環境の準備 今回最低限の環境を整えるために、『Typescript + Phaser3』の開発テンプレートを github リポジトリ で公開しました。 以下からZIPをダウンロードするか、 git clone コマンドで各自環境に展開してみてください。 ここから先は リポジトリ のプログラムを元に説明していきます。 github.com 展開するとファイル構造は以下のようになっているかと思われます。 注: 他にもファイルやフォルダがあるかと思われますが、表記されているのは今回使うものになっています。 - src/ (これから書くプログラムの保存領域)