Lightning Talk の舞台裏:”Stateflow でライフシミュレーションゲームっぽいものを作ってみた”
こんにちは、井上です。インフルエンザに怯えてしまう季節ですね・・。みなさまくれぐれもご自愛ください。
さて、Lightning Talk @ MATLAB EXPO 2019 発表者特集第六弾!ついに最終回を迎えました今回は MathWorks Japan の MATLAB 芸人、テクニカルサポート部所属の遠藤眞覇人(マハト@MACHTLAB)が語ります。
入社 1 年目ですが Lightning Talk での発表は今年で 3 回目。R2019a からサポートされている Stateflow for MATLAB を駆使した内容です。
目次
MATLAB 活動履歴
- 大学 2 年前期:大学の授業で MATLAB を初めて使用する
- 大学 2 年後期:友達から「MATLAB で音楽が再生できる」と聞き、Excel で作成した数値楽譜を MATLAB で読み込んで音楽ファイルに変換するプログラムを作成
- 大学 3 年前期:MATLAB の GUIDE を知り、GUI 上で音を作成して figure 上に表示した鍵盤をクリックしてそれを聞けるシンセサイザを作成
- 大学 3 – 4 年:シンセサイザを作成する中で figure のコールバック機能を知り、これを使えばスマホのゲームを作れると思ってパ〇ドラを作成
- 修士 1 年:MATLAB でゲームを作るとウケがいいことに気づき、マ〇オを作成
- 修士 2 年:Simulink も使いたくなったところで Stateflow のテトリスを発見し、Stateflow でポ〇モンを作成
―マスワークスに入社―
- MW 1 年:R2019a から Stateflow for MATLAB という新機能が追加されたことを知り、ライフシミュレーションゲームを作成
制作物
Stateflow for MATLABを用いてライフシミュレーションゲームっぽいものを作りました。
気づく人はすぐに気づくと思いますが、「勇〇のくせに〇まいきだ!」というゲームを参考にして作っています。
簡単なルールとしては、土の中に栄養が散りばめられており、栄養のある土を掘ると生物が生まれます。生物は土の中を動いて栄養の吸収、放出を繰り返し、一定時間で蕾->花へと変化します。さらに一定時間たつと花は枯れ、子供が生まれます。掘る土の栄養が高いほどレアな生物が生まれるので、レアな花をたくさん咲かせてハイスコアを目指す、というゲームです。
Lightning Talk では蕾や花の実装は間に合わなかったため、生物が生まれて動き回りながら栄養を運ぶところまでを実装して動画で発表しました。
開発に至るまで
もともとこのゲームは修士 2 年に「MATLAB では開発が難しいようなゲームを Simulink で作ろう」となったときに一候補として挙がっていました。というのも、「条件によって大きく挙動が変わる実時間ベースの処理」というこのゲームの動作が、MATLAB では実装が難しい反面 Simulink の Stateflow であれば比較的簡単に作ることができると考えたからです。
しかし、この時は結局開発が難しいということで断念してしまいました。ライフシミュレーションゲームの難しいところは、大量の生物が増えたり減ったりしながら並列的に動く点です。Simulink の Stateflow を用いれば確かに1体の生物の行動は簡単に表現できますが、モデル上における Chart ブロックの数が固定されているため、生物が増えたり減ったりする動作に対応できませんでした。
その後、無事卒業してマスワークスに入社した時、Stateflow が MATLAB でも使えるようになったことを知りました。そして、仕様を調べれば調べるほど Simulink の Stateflow では開発が難しかった部分が簡単に開発できそうだと思ったため、新機能の勉強も兼ねてゴールデンウィークあたりから開発を始めることにしました。
Stateflow for MATLABについて
Stateflow とは、状態遷移図を用いてプログラミングを行うツールです。
状態と遷移をグラフィカルに配置したうえで、各状態の処理や遷移条件などを MATLAB や C 言語と同じように記述できます。
以前は Simulink モデル内でのみ使用可能でしたが、R2019a から MATLAB でも使用できるようになりました。
今回注目した Stateflow for MATLAB の特徴は以下の2点です。
- 絶対時間処理の作りやすさ
- オブジェクトを複製可能
1つ目は絶対時間処理を非常に作りやすいことです。Stateflow では遷移条件として「時相論理」を使用することができます。
これを使えば、Timer のコールバック設定などを一切行う必要なく
「n秒経ったら~~」
みたいな処理を一瞬で作ることができます。
2つ目はオブジェクトを複製できるところです。Simulink のときはモデル上にChartブロックを配置する必要があったので、今回のゲームのように生物が何体も出たり消えたりするような処理に対応できませんでした。
しかし、Stateflow for MATLAB の場合は Stateflow をクラスオブジェクトのように扱います。そのためメモリが許す限りいくらでもおなじオブジェクトを作成することができますし、delete で消すこともできます。
製作の過程
ゲームの詳細な処理までは書ききれないので、とりあえず生物が移動する処理を Stateflow for MATLAB で作る流れを説明したいと思います。
※あくまで個人的な開発方法です
Stateflow for MATLAB でプログラムの概形を作成
Stateflow を用いて各生物の行動パターンの概形を作っていきます。概形ですので、深いことは考えずにとにかく雑に作っていきます。
クラスオブジェクトを用意する
クラスを作り、Stateflow オブジェクト用のプロパティとフローチャート上で使用するメソッドを定義していきます。
classdef Creature < handle properties slx; % Stateflow オブジェクトを保存するためのプロパティ end methods function obj = Creature obj.slx = sfxCreature('creature',obj); % Stateflow オブジェクトを作成 end function stand(obj) disp('stand'); end function move(obj) disp('move'); end end end
とりあえず検証用に disp するだけのメソッドを作成してみました。実際に動かしてみると、
>> test = Creature; stand move stand move
ちゃんと状態が遷移していることがわかります(>> delte(test) で止まります)。
クラスオブジェクトを作りこむ
テストメソッドでフローチャートが正常に動作することを確認したので、実際のメソッドを作りこんでいきます。まず生物の各向きの画像を用意します。
これをコンストラクタで読み込みます。
function obj = Creature % 画像とstateflowオブジェクトを読み込み obj.imageData = imread('creature.png'); obj.alphaData = any(obj.imageData~=0,3); obj.sfx = sfxCreature('creature',obj); end
あとは止まる動作と動く動作の時に画像の位置をずらしながら表示する画像を切り替えます。
function stand(obj) % 止まる動作 if isempty(obj.imageHandle) % 最初は画像を表示 obj.imageHandle = image('XData',[4 5],'YData',[4 5],... 'CData',obj.imageData(17:32,1:16,:),'AlphaData',obj.alphaData(17:32,1:16,:)); Else % 次回以降は画像データと位置を変更 obj.imageHandle.CData = obj.imageData(17:32,1:16,:); obj.imageHandle.AlphaData = obj.alphaData(17:32,1:16,:); obj.imageHandle.XData = obj.imageHandle.XData + 0.5; end end function move(obj) % 動く動作 obj.imageHandle.CData = obj.imageData(17:32,17:32,:); obj.imageHandle.AlphaData = obj.alphaData(17:32,17:32,:); obj.imageHandle.XData = obj.imageHandle.XData + 0.5; end
実際に動かしてみると……
いい感じに動きました。
機能、動作の追加
機能を追加していく場合は、フローチャートを見ながら何を作るか、どの関数を修正するかを考えていきます。例えば
- ランダムに動く
- 動くたびに体力が減る
- 体力が 0 になったら一定時間休む処理を作りたい!
という、より高度な動きにしたい場合は……
こんな感じになります。
作ってみた感想
フローチャートでプログラムの概形を作成できる、というのが非常にありがたかったです。
私は他の言語で大きい規模のプログラムを書いた経験がないので、行き当たりばったりで機能を実装してしまい後で機能を追加するときにどこを編集すればいいかわからなくなってしまうことが多かったのですが、フローチャートで頭を整理しながらプログラミングすることができたため、機能の追加もデバッグもスムーズに行うことができました。実際 Stateflow for MATLAB の仕様を確認し始めたのが 5/1 あたりなので、ちょうど 1 か月くらいで EXPO で発表したところまで作ることができました。
Lightning Talk について
自己顕示欲が高いため、学生時代にお誘いを受けて以来 3 年連続で発表させていただいています。
大勢の人の前で自分の作ったものを発表するという場は非常に貴重なので、とても助かっています。今回はマスワークス社員として参加ということで微妙に立場が変わってしまいましたが、製作活動自体は MATLAB の 1 ユーザーとして楽しんでいますので、これからも Lightning Talk イベントでいろんなユーザーの方と交流できればと思っています。
みなさんよろしくお願いします!
現在の活動
MATLAB で RPG を作っています。こちらでも Stateflow for MATLAB が活躍中!
遠藤さん、ありがとうございました!
大学 2 年の時点で既に MATLAB 芸人への道を走り始めていたんですね。既に、次回作もある程度出来上がっちゃっているみたいですが、今後生み出される作品が楽しみです。
年に1度の Lightning Talkに限らず「私もこんなことやってみたよ」など披露の場を待っているネタがございましたらご連絡お待ちしております。是非ブログでも紹介させてください。
これまでのLightning Talk @ MATLAB EXPO 2019 発表者特集はこちらから:
– 第一弾:西垣様「Camera de Mouse」
– 第二弾:わたなべ様「お絵描きでMATLAB使ってます」
– 第三弾:朴木様「深層学習で板チョコの違いが分かるか」
– 第四弾:松木様「MATLABを通じた人材育成・組織改革」
– 第五弾:Nicolas (ニコラ)「動いたり光ったりする宇宙船の3Dプリントモデルのコード生成」
- Category:
- MATLAB Expo,
- ユーザー紹介
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.