オレンジブログ

オレンジブログ

自作ゲームについてとか色々

ImGuiを使用してGameMakerの開発をもっと便利にしよう!!

ImGuiって超便利ですよね。
そんなImGuiをGameMakerで使えるのであれば、GameMakerでの開発を便利にする機能を作りたくなってしまうのも仕方ありません。
というわけで、今回はGameMaker内で汎用的に使えるデバッグ機能をImGuiで作ってきたのでそれの公開と解説を行おうと思います。
ImGuiってなんぞや?って方や、GameMakerへの導入方法を知りたいという方はこちらの記事を読んでください。
orangelily.hatenablog.com

スタートガイド

ダウンロード

下記から私の作ったImGuiGml拡張アセットをダウンロードできます。
www.dropbox.com
もしくはこちら
drive.google.com


※注意
GameMakerにImGuiが導入されていることが前提です。
ImGuiが導入されていないとビルドエラーになるため注意してください。
導入方法がわからない人は、こちらで解説しているので良ければ閲覧ください。
orangelily.hatenablog.com

インポート

上記でダウンロードしたファイルを解凍してください。(解凍方法がわからなかったら zip 解凍 等で調べてください)
GameMaker Studio 2で、デバッグ機能を導入したいプロジェクトを開きます。

画面上のツールからローカルパッケージのインポートを選択します。

アセットのインポート

そしたらエクスプローラーが開くので、先ほど解凍したフォルダの中に入っている「imguigml_extender.yymps」ファイルを選択します。

imguigml_extenderを選択

そしたらインポートするフォルダを選択する画面が表示するので、「すべて追加」を選択して「インポート」をクリックします。

インポート

これでインポートは完了です。

セットアップ

インポートが完了したら、まずはimguigml_extenderを使うための準備をします。
ゲーム起動時、最初に遷移するroomを開いてください。
(家のマークがついているroomか、このマークが無ければroomアセットで一番上に存在するroomになります)

これ

そしたらインスタンスレイヤーを開いて、imguigml_extenderフォルダの中のimguigml_extender_objectフォルダ内にある「obj_imguigml_manager」を配置します。

このプロジェクトはGameMaker公式サンプルです。試しにimguigml_extenderを導入してます

画像ではroomの左上に配置していますが、どこに配置しても動作は変わりません。

そしたらF6(F5じゃありません)でデバッグビルドでゲームを開始します。

このサンプルゲーム結構面白かった

このように、左上に「Menu List」と表示されていればセットアップ完了です。

使い方

今回私の方では下記5つのメニューを用意しました。

メニュー 内容
レイヤー レイヤー内の情報を表示する機能です。オブジェクトやタイル、背景等全部表示できます
インスタンス オブジェクトをメインとしたメニューです。アセット内にあるオブジェクトを生成したりすることができます
ルーム ルームの情報を表示します。また、好きなルームに移動できます
音楽 サウンド関係のメニューを開きます。好きな音を再生できます
グローバル変数 グローバル変数の一覧を表示します

雑にメニューを開くだけでもある程度わかるようにはなっていますが、それでも情報量が多かったりするので解説しようと思います。

レイヤーメニュー(Show layer menu)

現在のルームのレイヤーを表示します。

左の青がエディタでの表示。右の赤がデバッグメニューの表示

それぞれのレイヤーをクリックすると、レイヤー内のエレメントを表示できます。
インスタンスレイヤーの場合はオブジェクトインスタンスが、アセットレイヤーならスプライトが一覧されます。

インスタンスレイヤーを開いた場合

この時「show 〇〇(レイヤー名) layer debug window」というボタンを押すと、レイヤーメニューを開くことができます。
レイヤー単位でのVisibleの切り替え等設定ができます。

レイヤーチカチカ
インスタンスレイヤー

インスタンスレイヤーの場合はオブジェクト毎にグループ分けされて表示され、
指定したオブジェクトのデバッグメニューを表示することができます。

コインを表示

タブが4つあるので1つ1つ説明しようと思います。
また、今回はオブジェクトインスタンスでの説明しか行いませんが
スプライトでも専用のデバッグメニューが表示されます。

・basic info
オブジェクトの基本的な情報を表示しています。
visibleやsolid等切り替えることもできます。

また、Destroyボタンを押せばオブジェクトを破棄することもできます。邪魔なオブジェクトがあったら消しちゃいましょう。

destroy

・ sprite info
そのオブジェクトのスプライト画像の情報を表示します。

sprite info

image_speedとかを変更できます。

・speed direction info
速度、角度情報を表示します。
hspeedとかvspeedとかをいじってオブジェクトを移動させている時は重宝します。

このサンプルだとspeedは使っていないみたい

・ variable info
そのオブジェクト内の変数を表示します。

変数

変数名や値がわかります。また、型によってそれぞれ値を変更できるようにしてあります。
例えば、bool値ならチェックボックスが表示されてtrueとfalseを切り替えたりできます。
数値であれば入力式で数値を切り替えることができます。

その他の機能

Ctrlキーを押しながら左クリックをすることで、クリックした位置のオブジェクトのデバッグメニューを表示できます。

コインをクリックしてみた

今選択中(枠が黄色になっている状態)でマウスホイールクリックした状態でそのオブジェクトをクリックしてマウスを動かすと、そのオブジェクトを移動させれます。

コインを移動させてプレイヤーに接触させる

他にも背景レイヤーの場合だと背景スピードをいじれたり、
エフェクトが設定されているレイヤーだとエフェクトの値をいじれたりします。

エフェクトはパラメータが多すぎる...

インスタンスメニュー(Show instance menu)

オブジェクトアセットメニューとも言います。

アセット内のオブジェクトが一覧されている

メニューからオブジェクトを選択して、それを生成することができます。

コインを生成してそれを取得する

フィルタ機能もあるので、オブジェクト数が多い場合でも問題ありません。
敵オブジェクト等も追加できるので、レベルデザイン等に役立ちます。

ルームメニュー(Show room menu)

ルームの情報を表示するメニューです。

ルームメニュー

オブジェクトアセットメニューと同様に、アセット内のルームがすべて表示されます。
また、選択したルームに好きに移動することができます。(go to roomボタンを押す)

ルーム移動が結構便利なので活用する機会は多いのかなと思います。

音楽メニュー(Show audio menu)

サウンド関係のデバッグ表示を行います。
このメニューを表示している間はGameMakerが用意してくれた音楽用のデバッグ表記が行われます。

画面上部の文字がGameMakerが用意してくれたデバッグ表示

オブジェクトやルームのアセットメニューと同じく、アセット内のサウンドが全て表示されます。
好きなサウンドを選んで1回再生かループ再生かを選ぶことができます。
音量やピッチなども変更できるので、色々調整できると思います。

グローバル変数メニュー(Show global variable menu)

名の通り、宣言されたグローバル変数を一覧表示します。
値を変更できるようにもなっているので、デバッグで色々試したい時に便利です。

ImGui系のメニューが表示されているのは仕様です

終わりに

全部の機能は紹介しきれなかったんですけど、ひとまず便利な部分は紹介できたかなと思います。
また、imguigml_extender導入後、自分でメニューを追加することもできますので
自分だけのデバッグメニューも作ることができます。

デバッグ機能がよく作られているゲームの開発はスムーズに進みます。これは間違いありません。
良かったら今回自分が作ったImGuiの拡張機能をインポートして使ってみてください!
そしてImGui沼に浸かってください。ほんと良いんですよこれ。

GameMakerStudio2でImGuiを使用する方法

はじめに

最近GameMaker Studio2(以下GMS2)のライセンスが更新されて、無料でWindowsビルドとかが出来るようになりました。
これ以降GMS2ユーザーも増えるのかなぁとワクワクしています。
そこで、ImGuiと言うGMS2で使用できる便利なライブラリを紹介しようと思います。
どういったライブラリかと言うと

  • ゲーム内にGUIウィンドウを表示させて、そこに描画することが出来る
  • 描画できる内容は文字列だけでなく、クリックしたら動作するボタンや、スライダーやプルダウンまで存在
  • 1行でテキストの表示ができ、シンプルなコード記述で実装可能
  • さらにデフォルトでマウス操作が可能なので、入力周りを実装する必要は無い
サンプルのメニュー

と、至れり尽くせりなライブラリとなっております。
その他にも機能は多く存在しますが、ボリュームが大きくなるのでそれは別途解説致します。

上記の機能は主にデバッグ機能として使用できるので、どんなゲームを作っていても参考になると思います。

※注意
htmlビルドでは使用できないため注意。

ImGuiって?

デバッグ機能等を作ることを目的としたC++向けのGUIライブラリです。
見た目や機能がシンプルで、簡単なコードを記述するだけでUIが作れるのでデバッグ機能やツールを作るのに非常に向いているものですね。
詳しくはこちら。
https://github.com/ocornut/imgui

サンプルコードを読めば分かりますが、1行でテキスト表示やボタンの実装など行えて使いやすいです。
非常に使いやすく、企業や実際のゲーム開発現場でも使われているほどメジャーで実績もあります。

GameMakerへの導入

さて、上で説明したImGuiですが、元々はC++ライブラリなのでそのままGameMakerに導入することは出来ません。
そこで、既に拡張機能としてGameMaker内でImGuiのコードを使えるようにしてくれたものがあるのでそちらを使います。(非常に重宝してます。作者さんありがとうございます!)

アセットのダウンロード

制作者様のサイトにアクセスして最新版をダウンロードします。
nommiiin.itch.io

サイト内下の方の「Download Now」のボタンをクリックします。

出典:imgui_gm

そしたらダウンロード画面が出てきて、よかったらサポートしていただけますか?というポップアップが出てきます。
一旦お試しでダウンロードするので「No thanks, just take me to the downloads」をクリックします。

出典:imgui_gm

気に入ったらサポーターになって製作者様を支援しましょう!

次のページに飛んだら、ダウンロードするバージョンを選択します。
一番上のバージョンの「Download」ボタンを押しましょう。(2023/12/10現在 v1_0_15)

出典:imgui_gm

「imgui_gm_v1_0_〇〇.yymps」のような名前のファイルがダウンロードされればOKです。

インポート

ダウンロードしたらGameMakerを起動して導入したいプロジェクトを開きます。

上記でダウンロードしたyympsファイルをプロジェクトにドラッグアンドドロップでインポートします。

下記のようなポップアップが出てくるので「はい」をクリックします。

アセットのインポート

そしたら追加するファイル一覧が表示されるので「[すべて追加]」を選択してインポートするリソースに全フォルダを入れてから左下の「インポート」をクリックします

アセットのインポート

「Example」「ImGui_GM」フォルダがプロジェクトに追加されていれば成功です。

アセットのインポート

使い方

セットアップ

ImGuiをGameMaker内で使用するためには、専用のオブジェクトを作成する必要があります。
1つImGui用のオブジェクトを作成してください。
自分はわかりやすく「obj_imguigml_manager」と名前を付けました。名前はなんでも大丈夫です。

そしたらCreateイベント(作成)を作り、中に下記を記述します。

/// @description imguigmlを使用するための管理オブジェクト
// このエディターでコードを作成することができます

// ImGuiを初期化
ImGui.__Initialize();

次にBegin_Stepイベント(ステップ前)を作り、中に下記を記述します。

/// @description ImGui.__Update()を回す
// このエディターでコードを作成することができます
// 更新処理
ImGui.__Update();

最後にDraw_GUIイベント(GUI 描画)を作り、中に下記を記述します。

/// @description ImGui.__Render()で描画
// このエディターでコードを作成することができます
// 描画処理を回す
ImGui.__Render();

これでImGuiを使用する準備が出来ました。このオブジェクトを描画したいRoomに配置します。
Roomを超えて使用したい場合はpersistant(持続的)にチェックを付けてください。

ウィンドウの描画

では次に、ImGuiのウィンドウを描画していきます。
先ほど作ったオブジェクトのCreateイベントに下記のコードを追加します。

// メニューを開いているかを管理するフラグ
is_menu_open = true;

そしたら新たにStepイベント(ステップ)を作り、中に下記を記述します。

/// @description デバッグ用にメニューを作る
// このエディターでコードを作成することができます

if(is_menu_open){
    // windowサイズを指定。とりあえず画面の半分で
    ImGui.SetNextWindowSize(room_width / 2, room_height / 2, ImGuiCond.Once);
    
    var is_begin = ImGui.Begin("ImGui_GM Example", is_menu_open, ImGuiWindowFlags.None, ImGuiReturnMask.Both);
    // 引数に送ったis_menu_openの参照の値を取得
    is_menu_open = is_begin & ImGuiReturnMask.Pointer;
    // is_beginの戻り値がtrueなら
    if(is_begin & ImGuiReturnMask.Return){
	// ここにウィンドウ内の機能を記述する
    }
	// ImGui描画終了
    ImGui.End();
}

ここまで記述した状態で、試しにゲームを実行してみましょう。
こんな感じでウィンドウが表示されていれば成功です。

ビルド後

右下にカーソルを合わせて左クリックしてマウスを動かすと、ウィンドウサイズを変えることができます。

サイズ変更

他にも、ウィンドウの上の青い部分をダブルクリックすることで半透明化させて一時的に無効にしたり(もう一回ダブルクリックで元に戻る)

一時無効化。もう一回ダブルクリックで元に戻る

ウィンドウの右上の×を押すことでウィンドウを閉じれます。

ウィンドウ内に機能を追加

ここからは先ほど作ったウィンドウに機能を追加していきます。
流石にこの記事で全ての機能は紹介できませんので、よく使う機能をピックアップして紹介します。
もし他にも気になる方がいましたら、Example内に入っている「objExample」を確認してください。

テキストの表示

まずはウィンドウ内にテキストを表示してみましょう。
ウィンドウ内にテキストを表示する際には、ImGui.Textと記述し、引数に表示したい文字列を渡します。

ImGui.Text(文字列);

試しに先ほど作ったウィンドウにテキストを表示してみましょう。
Stepイベントを下記のように修正します。

/// @description デバッグ用にメニューを作る
// このエディターでコードを作成することができます

if(is_menu_open){
    // windowサイズを指定。とりあえず画面の半分で
    ImGui.SetNextWindowSize(room_width / 2, room_height / 2, ImGuiCond.Once);
    
    var is_begin = ImGui.Begin("ImGui_GM Example", is_menu_open, ImGuiWindowFlags.None, ImGuiReturnMask.Both);
    // 引数に送ったis_menu_openの参照の値を取得
    is_menu_open = is_begin & ImGuiReturnMask.Pointer;
    // is_beginの戻り値がtrueなら
    if(is_begin & ImGuiReturnMask.Return){
        // Test用のテキストを表示
        ImGui.Text("Test");
    }
	// ImGui描画終了
    ImGui.End();
}
テキスト描画

こんな感じで指定したテキストが表示されれば成功です。めちゃくちゃ簡単ですよね!

動的にテキスト内容を変更することができるので、デバッグ表示機能として非常に優れています。
例えば、下記のようなコードを記述すればマウスの座標を表示することができます。

// マウスの座標を表示
ImGui.Text("mouse_pos " + string(mouse_x) + ", " + string(mouse_y));
マウス座標の表示

実際にマウスを動かして値が変わるのを確認してみましょう。

ボタンの追加

次はボタン機能を追加します。
クリックしたら何かを実行する機能なので、何かしらをデバッグメニューから実行したい時に使えます。
こちらも非常に汎用性が高いので、是非使い方を覚えましょう。

ボタンは下記のコードで追加することができます。

// ボタンの描画
ImGui.Button(ボタン名);

ImGui.Buttonの戻り値が、クリックされた時のみtrueが返ってくるので、下記のようにif文を使用することで
クリックされたときに動作するコードを記述できます。

if (ImGui.Button("Clicked Log!!")) {
    // クリックした実行した内容を記述
}

Stepイベントを下記のように修正し、ボタンを押したらログを表示するようにしてみます。

if(is_menu_open){
    // windowサイズを指定。とりあえず画面の半分で
    ImGui.SetNextWindowSize(room_width / 2, room_height / 2, ImGuiCond.Once);
    
    var is_begin = ImGui.Begin("ImGui_GM Example", is_menu_open, ImGuiWindowFlags.None, ImGuiReturnMask.Both);
    // 引数に送ったis_menu_openの参照の値を取得
    is_menu_open = is_begin & ImGuiReturnMask.Pointer;
    // is_beginの戻り値がtrueなら
    if(is_begin & ImGuiReturnMask.Return){
	// Test用のテキストを表示
        ImGui.Text("Test");
	// マウスの座標を表示
	ImGui.Text("mouse_pos " + string(mouse_x) + ", " + string(mouse_y));
	// ボタンを作り、ボタンをクリックしたらログを出す。
        if (ImGui.Button("Clicked Log!!")) {
		show_debug_message("Clicked!!!!!");	
	}
    }
    // ImGui描画終了
    ImGui.End();
}
ボタン追加

このようなボタンが表示されており、これをクリックしたら

ログ表示

このようにログが出力されたら成功です。

数値入力欄の表示

次に数字入力欄を作ります。デバッグ用に数値を変更したい際などに利用できます。
数値入力欄はImGui.InputInt関数を使用します。

// 数字入力欄の描画
ImGui.InputInt(入力欄名, 現在の値);

ImGui.InputInt関数の戻り値で変更後の値が返ってきます。
また、第二引数に現在の値を代入するため、変数を作って管理することをおススメします。

Createイベントに数字入力欄のための変数を宣言します。

// ImGuiを初期化
ImGui.__Initialize();
is_menu_open = true;
// 数字入力欄用の変数
input_int = 0;

StepイベントにImGui.InputIntを使用した処理を追加します。

if(is_menu_open){
    // windowサイズを指定。とりあえず画面の半分で
    ImGui.SetNextWindowSize(room_width / 2, room_height / 2, ImGuiCond.Once);
    
    var is_begin = ImGui.Begin("ImGui_GM Example", is_menu_open, ImGuiWindowFlags.None, ImGuiReturnMask.Both);
    // 引数に送ったis_menu_openの参照の値を取得
    is_menu_open = is_begin & ImGuiReturnMask.Pointer;
    // is_beginの戻り値がtrueなら
    if(is_begin & ImGuiReturnMask.Return){
		// Test用のテキストを表示
        ImGui.Text("Test");
		// マウスの座標を表示
		ImGui.Text("mouse_pos " + string(mouse_x) + ", " + string(mouse_y));
		// ボタンを作り、ボタンをクリックしたらログを出す。
        if (ImGui.Button("Clicked Log!!")) {
			show_debug_message("Clicked!!!!!");	
		}
		// 数値入力ウィンドウを作り、入力結果をinput_int変数に代入
		input_int = ImGui.InputInt("Input Int!!", input_int);
    }
	// ImGui描画終了
    ImGui.End();
}

input_intで代入された値を使ってみましょう。
DrawGUIイベントを下記のように修正します。

// 描画処理を回す
ImGui.__Render();
// input_intの値をmouse_x.mouse_yに描画
draw_text(mouse_x,mouse_y,string(input_int));
InputIntの描画

InputIntの枠の中をクリックするとテキスト入力ができるので、数値を入れましょう。
その数値が現在のマウスの位置に描画されればOKです!

まとめ

この記事ではGameMaker内でImGuiを使う方法を記述しました。
ゲームを作成する上でデバッグ機能は必須と言っていいほどなのですが、
そのデバッグ機能の実装が大変だったりして本末転倒になってしまうケースがあります。

そんな問題をImGuiは解決してくれるので、個人的には必須級のライブラリだと思っています。
(もちろん別のライブラリでデバッグ機能を作るのもOKです。デバッグ機能を簡単に作れるライブラリが開発に必須だなぁという意見です)

この記事で解説した機能はほんの一部のみで、ImGuiにはもっと便利な機能がいっぱいあります。
ドキュメントもサンプルも充実しているので、自分で調べて自分だけのデバッグ機能を作っていくと良いでしょう。

次回はImGuiをGameMakerで使う際に便利なメニューについてまとめたいと思います。(予定)
それでは、良いGameMakerライフを!

I wanna kickass Dr.Cherry2公開

不具合があったのでバージョンを更新しました!(2023/12/15追記)

新しいバージョンはこちらです。

www.axfc.net


はじめに

どうも、オレンジです。
突然ですが、自作アイワナ「I wanna kickass Dr.Cherry2」をついに公開することができました!
開発を始めて約2年半...だいぶ長期開発になってしまいました...。

タイトル画面

しかし!長い開発期間をかけた甲斐もあってなかなか面白い作品になったのではと思います!
こちらからダウンロードできますので、よかったらどうぞ!
www.axfc.net

この記事では、簡単に自分のアイワナを紹介しようと思います。
もし気になっている方がいたら見てみてください!。

イワナとは?

こちらの記事を見るとわかりやすいかなと思います。
dic.nicovideo.jp

さらにそこから様々な派生アイワナといった作品が続々と出てきました。

派生アイワナとは「I wanna be the fangame!」を代表としたI wanna be the guyを真似した二次創作作品全般を差します。
原作の製作者であるkayin氏はアイワナの二次創作には黙認なので、今のところはグレーです。

I wanna kickass Dr.Cherry2紹介

本題の私が作った派生アイワナの紹介をします。

そもそもタイトルに2ってついているんだけど1は?って方はこちらの記事を読んでいただければと思います。
orangelily.hatenablog.com

ゲーム概要

上で書いた通り、1の続編になっているのですが、
1の続編ということはつまりこういうことです。

ステージ選択画面

完全にロッ〇マン

ええそうです。いつも通り〇ックマンです。

1の続編なので、だいたいは1と同じなのですが、
いくつか変わっているところがあります。

  • HPが回数制ではなくゲージ制になった
  • ダッシュ、壁キックの削除
  • 特殊武器の追加

といった感じに変化しています。
前作より、よりロック〇ンらしくよりアイワナらしくなりました!

HPが回数制ではなくゲージ制になったことで、難易度は少し下がったのかなと思います。
ただ、針に当たると大ダメージだったりするので、一長一短かもしれません。

また、ステージも前作と比べて3 ~ 4倍程度の長さになっておりステージ数も増えています。
全体的にはかなり長くなっているのですが、前作は短いステージにギミックと敵を詰め込んであったのですけど、今作はそこまでぎっちりしていません。
なので、攻略速度自体は前作とあまり変わらないのかな?と思っています。
だいたい3~5時間くらいでクリアできると思います。

難易度

難易度はeasy、normal、hard、infernoの4つを用意しました。

Easy

アクションゲーム初心者向けの難易度です。
ダメージのけぞり無し、回復アイテムの回復量増加、敵の体力半分と至れり尽くせりです。
さらに、落下死を防ぐようなイージーブロックも各ステージに追加され、
攻略が非常に簡単になっています。

ピンク色のがイージーブロック
Normal

アクションゲーム経験者向けの難易度です。
ダメージのけぞりあり、敵の攻撃力も平均的なシンプルな難易度になっています。
市販の2Dアクションゲームをクリアしたことがある!と言ったプレイヤーはこの難易度がオススメです。

Hard

イワナ経験者向けの難易度です。
ダメージのけぞりあり、大回復アイテム無し、敵の攻撃力2倍とnormalより少し難しくなっています。
この難易度からアイワナっぽい難易度になってきます。特にHardからは針で即死するようになるので本家アイワナと同じような緊張感が漂います。
本家「I wanna be the guy」をクリアできて、本家並みに難しいのをやりたいプレイヤーにおススメの難易度です。

Inferno

ドM向けの難易度です。
全ての攻撃で即死します。本家アイワナのシステムそのままです。
セーブポイントはあるので本家のimpossibleほどの難易度は無いものの、very hardは超えているかもしれません。

最初に遊ぶのであればNormalかHardがおすすめです。
あまりアクションゲームをプレイしたことが無い人はEasyを選びましょう!
2週目をプレイする謎のプレイヤーはInfernoで...。

ステージ紹介

軽く数ステージ紹介しようと思います。
各ステージに色々なギミックを入れたので、ユニークなステージが多いです。
また、前作にあったような謎解きギミックは今作は存在しません。

例えば、深海を彷徨うようなステージや

水中ステージ

乗り物?に乗って進んでいくステージや

乗り物っぽいものに乗るステージ

風に舞っているステージ等あります。

風に舞う

他にも各種ステージにギミックが用意されています。
気になったら是非プレイしてみてください!

特殊武器

今作最大の特徴と言えるシステムになります。
いわゆる、ロックマ〇に出てくる特殊武器と同じでボスを倒したらそのボスの武器をゲットすることができます。

上からさくらんぼをいっぱい降らせる武器や

上からさくらん

貫通する炎を複数撃てる武器や

炎の武器

ロ〇クマンにあるようなシールドを展開する武器まで

リーフ〇ー〇ド??

これらの武器は最大で8つ存在します。
かな~り変わった武器もあるため、楽しみにしておいてください!

その他の特徴

前作と同様に、使用している素材は全てフリー素材になっております。
キッド君やさくらんぼ、針はアイワナ素材を使っているので完全ではないですが...。

少なくとも市販の作品の素材を使用しているわけではないので、配信等はやりやすいと思います。
それでも本家素材について怒られたらゲーム公開を停止する予定です。

終わりに

以上で自作アイワナの説明を終わります。
もし気になった方がいたらこちらからダウンロードしてください!
www.axfc.net

もし不具合や気になった部分などありましたら、自分のX(Twitter)に連絡をくれればと思います。
今後の作品についても話したりすると思います。
https://twitter.com/hemuhununeOrang

長い間この作品を作っていたのでちょっと疲れてしまいました...。続編は期待しないでください笑。
それでは、良きアイワナライフを!

I wanna makerとGameMakerでのアイワナ開発比較

どうもこんにちは、今年GameMakerStudio2を購入しましたオレンジです

最近噂になっているI Wanna Makerをダウンロードして、1つステージを作ってみました。
実際に作ったんですけど本当に作りやすく、数日しか開発してないんですけど思ったよりクオリティ高いのが出来ました。

そこで、GameMakerでの開発経験が10年近くある自分の目線からの、I wanna makerとGameMakerの違いについて話して行けたらなと思います。
特に今GameMakerでアイワナ開発している人、今はI wanna makerで作ってるけどGameMakerも気になるって人は読んでみて欲しいです。

今回の記事を書くために作ったステージはこちらになります。「J4DV-D6QQ
色々ギミック詰め込んだのでぜひプレイしてみてください!

テスト用で作りましたが、なかなか楽しかった

(とりあえず結論だけ読みたいという人は、「 比較まとめ」まで飛んでください)

I Wanna Makerとは

現在(2023/11/14)Steamでダウンロードできるアイワナ作成ツールです。
store.steampowered.com
オリジナルとなったI wanna be the guyのようなゲームを作るのに特化したゲームエンジンのようなものですね。
2023年の11/10に正式リリースされ、対応プラットフォームはPC(Steam)となっています(日本語に対応!)。
自分も正式リリースされたとの噂を聞いて早速ダウンロードしてきました。
特徴としては下記が挙げられます。

  • プログラミング無しでアイワナのゲームを作れる
  • 他のユーザーが作ったゲームをプレイ可能。さらにそのゲームをエディターで表示させることも可能
  • テストプレイしながらステージ編集が出来、その場に即時反映される(ホットリロード)
  • トゲやリンゴなど、イワナの鉄板ギミックも含めたオブジェクトの数々が70種以上
  • 用意されたBGMも150種以上存在し、使用制限等はない。動的に曲を変えることも可能

ざっとあげるとこんな感じです。正直ここまでクオリティ高いのが無料で遊べるだけでも凄いですね。

本題

上で記述した通りI wanna makerは制作ツールとしてもプレイするにしても非常に優れたゲームです。
ただ、代々アイワナ制作とはGameMakerを使用して作られたものが多く(全部では無いですが)、今GameMaker使ってる人からするとどっちを使うか悩みどころだと思います。

そこで、10年近くGameMaker触ってきた私目線でのI wanna makerとGameMakerの違いについて書きたいと思います。参考になれば幸いです。

I wanna makerの方が優れている点

まずはI wanna makerの方が優れている点を上げます。

プログラミングを書かなくていい

これに限ると思います。学習コストに雲泥の差があります。
もちろんI wanna makerも勉強しないといけないことは沢山ありますが、プログラミングを学ぶよりかはかなり少ないです。
さらに、プログラミングを書かなくて良いとはつまり、バグ修正をしなくて良いことでもあります。
これは開発期間の1/3ほどスキップできるほど大きいです。

プログラミングを学ぶのに抵抗がある、とりあえずアイワナを作ってみたいという方には
I wanna makerをオススメします。

画面エフェクトが凝れる

I wanna makerでは画面エフェクトを出せるのですが、それが非常に凝っており良い雰囲気を出せます。
例えば、周りを暗くするライトのようなエフェクトや、雨が降り雷が鳴る嵐なんてのもあります。

周りを暗くするライト。焚火や松明のような明かりを持つオブジェクトは光を発する。

嵐。雨が降って少し暗くなり、たまに雷が鳴る(SE付き)

このような画面演出をGameMakerで綺麗に作るのは難しく、さらにGameMaker8.0(8.1LITE)ではシェーダー機能がないため、
凝った演出を作ろうとすると有料のGameMakerを使わないといけません。
これを無料でできるI wanna makerは控えめに言って最高です。

ゲーム内で公開機能がある

これも結構大きな利点だと思っています。
I wanna maker内で作ったゲームを公開できるだけでなく、クリア率やいいね!の評価機能などがゲーム内に存在し、
ユーザーからのフィードバックを受けやすい機能がついています。

さらに、作られたゲームを「エディターで表示」させる機能が存在し、他の人がどうやってステージを作ったのか見ることができます。
この「エディターで表示」機能が非常に優れており、I wanna maker内でどうやって他の人が作っているのか学ぶことができます。

GameMakerで作られた作品だと、開発環境をもらうか開発者が技術ドキュメント等を書かない限り作り方を見ることができないため、
これがI wanna maker内で行えることは開発モチベにも繋がる良い機能だと思います。

完全無料

これも非常に大きいです。言うまでもないですね。
GameMakerも8.0(8.1LITE)も無料ですが、流石に古代のゲームエンジンすぎて機能不足が目立ちます。
最新のGameMakerStudio2であれば性能は良いですが、PCビルドは有料なので
完全無料で高クオリティのアイワナを作ってPCプラットフォーム公開したければI wanna makerを使うのが良いでしょう。

GameMakerの方が優れている点

ここからはI wanna makerと比較してGameMakerの方が優れている点をあげます。

リソース素材が自由に使える

ここが最大の利点と言えるでしょう。
I wanna makerは用意されたリソースしか使えませんので、
好きなイラスト、好きなBGM、SEでゲームが作れるのがゲームエンジンを使う利点となります。
自分の描いたイラストまで使用できるため、それらを使いたい人は必然的にGameMakerを使うことになるでしょう

ステージ、オブジェクト作成の幅が広い

ここもリソースに並んで自由に作れることは大きな利点と言えます。
ただ、リソースと違ってこちらはプログラミング技術がある程度必要になるため
自分の理想の作品を作れるようになるまでは時間が必要かもしれません。
慣れてくれば自分だけのゲームが作れるようになり、それが作れる魅力は唯一無二と言えるでしょう。

GameMakerについて学べる

GameMakerでゲームを作ればGameMakerを学べる...これは当たり前のことですが、
I wanna makerを学ぶ以上に大きな効果があります。
必然的にプログラミングを学ぶことになるので、ここで学んだ知識は他の分野や就活で活かせます。

実際に自分はGameMakerからプログラミングを学び、それらで得た知識を就活で使って今はゲームプログラマーになりました。
今のご時世、プログラミングが出来るというのは強力な武器となります。

また、GameMakerはアイワナ作成用のゲームエンジンではなく汎用的なゲームエンジンのため
慣れてくるとアイワナ以外のゲームも作れるようになります。
就活だけでなく、趣味の幅も広がるためおススメです。

比較まとめ

今までの話をまとめると

開発の手軽さ、作った作品のリリースのしやすさはI wanna makerに軍配があがりますが、
素材の自由度、開発の自由度にはGameMakerの方が優れています。

項目 I wanna maker GameMaker
開発難易度 優しい 難しい
画面エフェクト 既に用意されている(高品質) 自分で組む必要がある
リソース 用意された素材 何でも使用できる
ギミックの自由度 うまく作ればある程度自由 プログラミングが組めれば自由
公開環境 既に用意されている 自力でアップロードする必要がある

今からアイワナを作ってみたい。無料で高クオリティの物を作ってみたい!という方はI wanna makerを使うのがいいと思います。
自分の作ったイラストやオリジナルのリソース素材を使いたい、という方はGameMakerを使うのがいいと思います。

また、完全無料で高クオリティのアイワナが作れるところもI wanna makerの魅力であると思います。
自分も今回初めてI wanna makerでアイワナを作ってみましたが、作れるギミックの幅は広く
数日で1作品できたので非常に使いやすい環境でした。
もし今GameMaker8.0(8.1LITE)を使っている人で、使用するリソースにこだわらないのであれば
I wanna makerを使ってみてもいいと思います。

逆に、既にGameMakerStudio1や2を触っている人は引き続きそちらを使っていった方がいいと思います。
もう作り慣れているはずですし、クオリティ高い作品作れます。

それと、これは開発環境とは別の話ですが、
I wanna makerでは自由なリソースが使えない分、逆に著作権違反するリソースが必ず使われていないことも約束されており、
動画サイトでのプレイ投稿や、配信サイトでの配信が安全に行えるため、
今後はI wanna makerでのプレイ、配信が増えることが予想されます。
なので、今の環境ではI wanna makerで作ったアイワナの方がプレイされることは多くなりそうです。
それも踏まえたうえで、自分に合った環境でアイワナを作っていくと良いでしょう。

終わりに

今回はI wanna makerとGameMakerでのアイワナ開発環境について比較してみました。
思ったよりI wanna makerのクオリティが高く、今後はI wanna makerメインになる人も増えてくるのでは?と言った印象です。
自分のように長くGameMakerを使っているような人は、引き続きGameMakerで作ることになりそうですが、
公開環境の優秀さからI wanna makerで作るのもアリだなと思いました。

比較はしたものの、どっちも使うと言う選択肢もあると思います。
どっちの開発環境も魅力があって捨てがたいですね。

自分としては、今後もGameMakerを使い続けますが、I wanna makerでの開発もしていきたいと思います。

それでは、良きアイワナ開発ライフを!!

【GM:S 1.4】Surfaceで明かりを表現する【アイワナ制作】

こんにちは。この前アイワナをリリースしたオレンジです。

今回はそのアイワナでも使われている「光源」の実装方法について紹介していきたいと思います。

f:id:orangeLily:20200824154700p:plain

私の作ったアイワナについては、過去記事をどうぞ

orangelily.hatenablog.com

光源とは

光源、つまり光の発する点の事ですね。

ゲームとかだと、ライトとか炎の明かり等に使われているシーンが多いと思います。

イワナのような2Dアクションだと、自分の周りだけ明るくて他が暗い、みたいなステージがありますよね。

これをGameMakerで再現するなら

f:id:orangeLily:20201031192147p:plain:h200

こんな感じの真ん中が透明で周りが黒い画像を準備して、それを光源の中心に置く...

みたいな方法をしてた方もいるかもしれません。(他にも多数方法はありますが)

でもこれ、ちょっと汎用性低いんですよね。

明かりをいくつも動かしたりすると周りの黒い部分が邪魔になったり、色の違う明かりを作る度に画像を準備したり...etc

そこで、Surface機能を使って明かりを再現しよう!と言うのが今回の記事です!

※記事タイトルの通り、GameMaker : Studio専用です。

GameMaker8.0や8.1Lite版では動かせません。

実装方法

Sprite

まずは明かりの画像を準備しましょう。

f:id:orangeLily:20201031193130p:plain:h300

今回はこの画像を使います。使いたい明かりによって色々作ってみたり、フリーの素材を使ってみるのが良いでしょう。

この画像でSpriteを作ります。名前は適当に「spr_light」とかにしておきます。
オフセットをcenterに設定し、閉じます。

f:id:orangeLily:20201031193218p:plain:h300

Script

次は光源の描画更新の処理を行うScriptを1つ作ります。この処理は何度か呼び出すことになるので、Scriptにまとめておくと便利です・

名前を「light_update_process」と言う名前で新規Scirptを作成し、以下のコードを書きます。

///light_update_process(light_surface)
//引数で受け取ったサーフェスを代入
now_surface = argument0;
//対象を現在のサーフェスに変更
surface_set_target(now_surface);
//サーフェスの描画処理
draw_clear(c_black);
draw_sprite_ext(sprite_index, image_index, sprite_width / 2, sprite_height / 2, image_xscale, image_yscale, image_angle, c_white, 1);   
//対象をリセット
surface_reset_target();


このような感じになればOKです。
f:id:orangeLily:20201031235239p:plain:h300

Object

次に明かりオブジェクトを作りましょう。名前を「obj_light」とし、Spriteに先ほど作成した「spr_light」を設定します。
そして、Visibleのチェックを外します(ここ忘れがち)

f:id:orangeLily:20201031235516p:plain

そしたらobj_lightにCreateイベントを作って、そこにコードを追加します。

///CreateEvent

//サイズ変更、数字は自由に
image_xscale = 3;
image_yscale = 3;

//光源用のサーフェス生成
light_surface = surface_create(sprite_width, sprite_height);
//更新処理を一回入れる
light_update_process(light_surface);

上記のコードを入力したら閉じます。

次にlight全体をコントロールするオブジェクト「obj_light_controller」を作ります。

Sprite画像は設定しなくて大丈夫です。もし設定したい場合はゲーム画面に映らないようにVisibleのチェックを外しておきましょう。

今作ったobj_light_controllerのCreateイベントに下記のコードを書きます。

///CreateEvent

//全体を描画するサーフェス生成
controller_surface = surface_create(room_width, room_height);

次はStepイベントにこちらのコードを記述します。

///StepEvent

//対象を全体のサーフェスに
surface_set_target(controller_surface);
//画面全体を黒に
draw_clear(c_black);
//ブレンドモードを加算に変更
draw_set_blend_mode(bm_add);
//光源の更新処理
with (obj_light) {
  draw_surface_ext(light_surface, x - sprite_width / 2, y - sprite_height / 2, 1, 1, 0, image_blend, 1);
}
//ブレンドモードをノーマルに
draw_set_blend_mode(bm_normal);
//対象をリセット
surface_reset_target();

次にEndStepイベントにこちらのコードを記述してください。

///EndStepEvent

//光源のEndStep更新処理
with (obj_light)
{
  light_update_process(light_surface);
}

最後にDrawEndイベントに以下のコードを書いたら終わりです。

///DrawEndEvent

//拡張ブレンドモード設定
//詳しくはこちらのURLで
//https://docs.yoyogames.com/source/dadiospice/002_reference/drawing/colour%20and%20blending/draw_set_blend_mode_ext.html
draw_set_blend_mode_ext(bm_dest_color, bm_zero);
draw_surface_ext(controller_surface, 0, 0, 1, 1, 0, c_white, 1);
draw_set_blend_mode(bm_normal);

準備はこれくらいで大丈夫です。イベント数が以下の画像と同じになっていればOKです。

f:id:orangeLily:20201101000627p:plain

コードの処理については、コメントを確認してください

Room

それでは実際にroomを作って試してみましょう。

roomの設定は適当で良いですが、サイズを大きくしすぎないようにするのと、分かりやすいように背景色は青とかにします。

roomを作ったらそこに「obj_light_controller」を置いて、明かりを起きたいところに「obj_light」を置きましょう。

私はこんな感じのルームを作りました。

f:id:orangeLily:20201101001210p:plain:h300

これで起動してみると...。

f:id:orangeLily:20201101001240p:plain:h300

画面上部が明るくなっていて、他が暗くなっていますね!これで成功です!!

イワナのステージに適用させてみよう

さて、これだけでもアイワナのステージに「obj_light_controller」と「obj_light」を置けば光源を実装することができます。

置くだけでもいいですが、せっかくですし動かしたいですよね。

そこで、「obj_light」にマウスに追従してくる機能を実装してみましょう。

obj_lightのStepEventに以下の記述をしてみましょう。

///StepEvent

//座標をマウスに合わせる
x = mouse_x;
y = mouse_y;

これをアイワナのルームに配置して実行してみると。
f:id:orangeLily:20201101003111g:plain:h400

良い感じにマップを照らせるようになりましたね!

その他の実装

その他にも、いくつか機能を紹介しておきます。

光源の色の変え方

光源の色の変え方ですが、例えばobj_lightのCreateイベントか生成時に

image_blend = make_color_rgb(255,150,150);

と記述してあげると、赤色に変わります。

f:id:orangeLily:20201101013137p:plain:h300

その他の色に変えたいときは、rgbの数値を変えてみましょう!

全体を覆う色の変え方

全体を覆う色ですが、今は黒になっているので明かりが届いていない部分は真っ暗になっていますね。
実はこれの色も変えることができます。この色を変えることでよりステージに特徴を持たすことができます。

変え方ですが、obj_light_controllerのStepイベントの

//画面全体を黒に
draw_clear(c_black);

のc_blackの部分を

//画面全体を赤に
draw_clear(make_color_rgb(255,0,0));

とすると、画面全体を赤くすることができます。

f:id:orangeLily:20201101012426p:plain:h300

色の部分をランダムな数値を扱えば、毎回ランダムな色に変化してくれます。

だいたいこんなところでしょうか。

この機能自体はそこまで処理が重くありませんが、一度に大量の光を動かしたり、めちゃくちゃ大きな明かりを動かそうとすると処理が重くなります。

そこだけは気をつけて使いましょう!!

以上の部分で今回の実装は終わりです。

実装お疲れ様でした!!

I_wanna_kickass_Dr.Cherry公開

自作アイワナ「I wanna kickass Dr.Cherry ~Dr.Cherryの野望~」リリースしました!!!

f:id:orangeLily:20200824163809p:plain

結局前回の更新から1ヶ月以上かかってしまい...10月になってしまいましたね...。

その代わり、色々と機能追加したりバグ修正したり頑張ったので許してください!!!

ダウンロードはこちらから⤵︎ ︎⤵︎ ︎⤵︎ ︎

I wanna kickass Dr.Cherry

もしくはこちらからどうぞ

I wanna kickass Dr.Cherry

詳しく知りたい方は過去記事で
orangelily.hatenablog.com

【GM:S 1.4】I wanna kickass Dr.Cherry紹介

※2020/10/11に公開版画像に差し替え更新

はじめに

どうも、オレンジです。

今回は私の作ったアイワナを紹介したいと思います。

イワナって何?って人は、こちらの記事を見るとわかりやすいかなと思います。

dic.nicovideo.jp

続きを読む