読者です 読者をやめる 読者になる 読者になる

僕の観察日記

僕が感じたことを書いていき、自分のことを観察、記録するブログ

蒼き雷霆(アームドブルー)ガンヴォルトの紹介

先日新しくゲームを一つ買った。

蒼き雷霆(アームドブルー)ガンヴォルト ストライカーパック」だ。

パックという名前の通り、複数作品が一つのソフトになっており、2年前に発売された1と、今夏発売された2が両方入っている。

本来1はダウンロード販売で、2も単品ではダウンロードでしか売ってない。

ダウンロードよりかは実際に手元に残る物の方が好みなので、1が入っていようが構わず購入した。

 

そんな今作だが、ジャンルは「ライトノベル2Dアクションゲーム」だ。

公式がこう表記していて、プレイすると確かにしっくりくる表現なのだが、プレイしないといまいち想像がつかない。

簡単に言えばロックマンを思い浮かべればいい。

そこにライトノベル的な要素を足したような感じだ。

ライトノベル的って何だとなるが、個人的には、濃すぎるくらいのキャラクター達やそのセリフ回しだろうか。

特に2では敵ボス達のキャラが本当に色濃くなっており、ダブル主人公の内1人は真面目な性格故一部のボスとは会話が成り立っていなかった。

もう片方の主人公は決して真面目じゃない訳ではないが、フィーリングで会話をしていた。

 

後はこのゲームの特徴として戦闘中にも会話が行われるところだろうか。

アクションゲームで戦闘中に会話が行われるものはあまり見たことがない。

キャラの顔やセリフなどが戦闘中やステージ攻略中にも画面に表示されて、場を盛り上げてくれる。

少しじゃまになる場合もあるが、もちろん非表示設定はあり、やりこみをするときなどはそうすればいい。

また2から不透明度設定や顔だけ非表示など細かい設定が可能になり、より遊びやすくなった。

 

プレイしたことが無い人が特に気になるのはやはりキャラの濃さだろうか。

個性的なキャラクター達」などという宣伝文句はよく聞く気がするが、このゲームほど濃いキャラクターが揃っているのは他に見たことがない。

1であれば特にプレイヤーの印象に残っているのが「アシモフ」というキャラだろうか。

独特のセリフ回しが「アシモフ」などと呼ばれて多くのプレイヤーに愛されている。

攻略サイトに「アシモフ語録」の項目がある。

 

そして愛と言えば「パンテーラ」というボスキャラがおり、ステージ攻略中にもどこからか頻繁に主人公に声をかけてくる。

ワイヤー装置なるものが出た時には「まさに、愛の糸!」とか、ステージ上必ずかかるボスの罠にかかると「君は落ちた!我が愛の罠に!」とかとにかく愛が愛がと言ってくる。

何だかうざそうだがやってみると癖になる

ちなみにパンテーラのセリフで一番印象に残っていたものがある。

穴がある場所で「落ちないように気をつけたまえ?」と唐突に心配をされ驚いていると、少し間を空けてから「我が、愛の落とし穴に…!」と言われた。

このセリフが凄く好きだ。

 

2からは「テンジアン」という会話の随所に四字熟語を挟んで会話するキャラがいる。

これまたプレイヤーにネタにされ攻略サイトに「テンジアンで学ぶ四字熟語」などと項目が追加されている。

他には「アスロック」というキャラも同じようにセリフ回しがネタにされている。

技名などにフランス語を使っており、そこにお菓子関連の言葉が入っているため同じく攻略サイトに「アスロックで学ぶお菓子とフランス語」の項目が追加されている。

 

こんなふざけたキャラだらけだがストーリーはいたって真面目、どころか重い

どうしてこんなキャラ達なのにこうも重くなるのかというくらいに重い。

昔「ロックマンゼロシリーズ」を作っていた会社と同じところが作っていると言えばストーリーの重さに納得いく人もいるんじゃないだろうか。

 

アクション部分も非常によくできており、やりこみ要素も盛りだくさん。

特に2はプレイアブルキャラが2人になったこともあって1以上に遊びつくせるようになっている。

アクションが苦手な人からかなり得意な人まで遊べるゲームデザインになっているのも推したい理由の一つだ。

個人的には今まで遊んだ2Dアクションゲームの中で一番の出来だと思っている。

会社自体も2Dアクションゲームと言えばここだろうと思うくらいだ。

今こうして書いていてもいいところがあり過ぎて書ききれないくらいなので、ここで一旦切ることにする。

まずは1からで1のダウンロード版だけ。

もしくはストライカーパックを購入して一気に1と2を遊ぶ。

どちらでもいい。

ストーリークリアまでなら元々ダウンロード販売というのもあって短めだ。

時間とお金に余裕があれば遊んで欲しい。

目的の具体化

最近僕の欠点として気づいたことなんだが、目的を具体化しないままに制作をやっていた。

目的の具体化って何だよってなるが、簡単に言うと何をやるべきかハッキリわかる段階にまで目的を掘り下げることだ。

具体的という言葉とは反対に抽象的という言葉がある。

抽象的な言葉とは「ゲームを作る。」というこの言葉である。

ゲームを作ると一言に言っても作り方はいろいろある訳で。

ユニティだとかアンリアルだとかのエンジンを使って制作することもあれば、DirectXを独自にラッピングしてフレームワークを自分で組んでいくこともある。

音楽やグラフィックを自分で作ることもあれば、友人に任せることもあるし、フリー素材から拾ってくることもある。

「ゲームを作る」だけでもいろんな手段、方法がある。

だからゲームを作ると言ってもまず何をすればいいのかをしっかり具体化していき、それをリスト化すべきだ。

具体化自体はすぐにできる。

自分に絵を描く能力がないのであればグラフィックはフリー素材か依頼だ。

頼めそうな友人がいるなら依頼して、ダメならフリーにいこう。

もしくは自分で頑張ってもいい。

音楽も同じだ。

そしてストーリーや世界観も決めないといけない。

キャラがいるならその名前もある場合が多いだろう。

ある場合は決めなくてはならない。

そしてもちろんプログラムもだ。

こういったことを全て一人でやらなくてはいけないというのは何とも面倒だ。

だが、面倒だと言って整理せずに目についたものを適当にやっていては非効率だ。

「あ、音楽用意しないと」「プログラムであの部分の処理つくらないと」

「名前考えないと…」「マップどうしよう…」

これらのセリフを並べるとどうも右往左往している人のイメージが出てこないだろうか。

この非効率なやり方を僕は今までやっていた。

世界観だとかストーリーだとかはまとめて考えた方がやりやすい。

主人公の名前とかもこの辺りとセットで考えた方がいいんじゃないだろうか。

だが、目についたものだけやるスタイルだと、このセットにした方が良いものを見逃してしまうことが多くなる。

これは非常にもったいない。

そして時間のロスが少しずつ蓄積されていく。

整理に関してはこういったセットで処理すれば得なのを見つけ出す以外に、何をやればいいのかわからないという状況を打破することができる。

「絵に関して今やるべきことが一通り終わった。次はどうしよう?

こういった時に、この次にやるべきことがあやふやなことが多かった。

しかし、整理、リスト化しておけば、とりあえずやるべきことの一覧が見れる。

そしてそれらに優先順位を付けてやるといい。

優先順位がないと次に何をやろうか迷うことになる。

優先順位が無い状態はつまり、優先順位が全て同じな状態だ。

「どれでもいい」は一番迷うものだ。

そんなとこで迷うよりかは、しっかり順位をつけて逐次処理をしていくのがいいだろう。

 

目的を持つのは良いことだが、それを抽象的なままにしておいてはダメだ。

その目的を達成するために目的を掘り下げて具体化しないといけない。

本当に細かいところまで掘り下げることで、進捗が滞ることなく仕事をこなすことができる…はずだ。

もちろん時にはプログラムでわけのわからないバグに悩まされて止まることもあるだろうが、それはそのバグを取り除くのが仕事だ。

一番ダメなのは仕事があるのにも関わらず何もしていない時間を作ってしまうことだ。

特に僕の場合、先ほど書いた「次に何をしよう」が多発していた。

これはAndroid開発の時にも悩まされたものだ。

もう夏休みは終盤だが、決して遅くはない。

今からでも進捗を滞らせることをなくす努力はすべきだ。

例えば「ある処理をしたいがプログラムをどう組めばいいのかわからない。

先生に訊こう。」

ここまではいい。

だが、訊くまでに他にすることは必ずあるはずだ。

一旦作業が止まった際に他の作業を進めないのはもったいない。

だが、ここで「次何しよう」の問題が出てくる。

これを失くそう。

自分でも時間がもったいないと思いつつも解決策がなかなか思いつかなかった。

これはやる気の問題ではない。

手段の問題だ。

やる気があるのに物ができないのは悲しい。

少しでも物を作れるように今からでも努力する。

フリーゲームについて

昨日あるフリーゲームをプレイした。

CrackleCradle」というタイトルで、2Dガンアクションになっている。

内容は高難易度の死にゲーで、いわゆるリョナ要素が強めの過激な内容となっている。

そんな本作だが、一通りプレイしただけでも凄く作りこまれてるのがわかる。

リョナ要素が強めということで暴力的なエフェクトが多いのだが、そのエフェクトの種類が非常に多い。

罠一つとってもやられ方が複数種類あり、キャラの向きや位置などによってエフェクトが細かく変わるうえ、そのこだわりが随所に散りばめられてる。

しかも敵の攻撃をくらった際に靴が脱げたり、髪がほどけたりなど2Dでここまでやるのは相当大変なんじゃないかというところまで作りこんでいる。

そういった細かいところも良いのだが、もちろんアクション部分も面白い。

始めに高難易度と書いた通り、自分もいちいち数えてられないくらいやられては挑戦した。

正直この手の高難易度と呼ばれるものは高難易度と理不尽の境目が曖昧になってるものもあるが、自分は耐えて最後まで遊ぶことができた。

つまり、面白いのである。

高難易度で例え理不尽とまではいかなくても、結局面白くなければ遊ばないのだ。

基本的にはマウスとキーボードで遊ぶようになっている。

マウスで照準を操作し、左クリックで発砲。

右クリックでリロード。

WASDキーで移動、ジャンプ。二度押しでダッシュなどもできる。

武器が増えればCで武器チェンジも可能。

こんなところだろうか。

他のゲームにあまりないだろう特徴として無敵時間がない

これにより起きることは一方的な攻撃である。

もちろんプレイヤー側が攻撃を受ける側だ。

これがこのゲームを難しくさせている要因の一つだ。

これのせいでより一層ストレスも溜まりやすくなっている。

そのため隅っこに追いやられたり、敵に挟まれないよう考慮してプレイしなければならない。

しかしそれが面白い。

もちろん人によって好みもあるし、高難易度ゲーが苦手な人はつまらないだろうが、難しいゲームが好きでリョナ要素に耐性がある人はやってみてはどうだろうか。

 

と、ここまで「CrackleCradle」の話をしてきたが、もう一つ作品を紹介したい。

海外のフリーゲームである「OFF」だ。

ちょうど去年の夏休みに僕がプレイしたものだ。

この調子だと来年も何か一つフリーゲームをやってそうだが、それはともかくとしてこの作品も非常に面白い。

先ほどのCrackleCradleは王道アクション的な面白さにアクセントとしてリョナ要素を加えたものだが、こちらはいわゆる雰囲気ゲーだ。

ジャンルとしてはRPGだ。

その独特の世界観の中で野球選手の格好をした主人公である「バッター」と共に世界で起こっている問題を解決していく。

共にという言い方をしているが、実際に作中では登場人物としてゲームを遊んでいるプレイヤーもカウントしている。

もう少し詳しく説明をすると、4つの「ゾーン」からできている世界を舞台とし、それぞれのゾーンにいるボスを倒すことが目的だ。

そうすることでゾーンが浄化される。

それがバッターの目的である。

ここまでの説明だけでも妙な世界観なのは分かる気がする。

どのあたりが独特かというと、世界観、音楽、グラフィック、どれも他にはないと言えるものになっており、間違いなくこのゲームでしかできない体験ができる。

ストーリー自体は考察がされるようなタイプのもの、要は謎が残ったまま終わるのだが、それが好きな人には本当に溜まらない作品なんじゃないだろうか。

 

今回紹介したどちらのフリーゲームもそうクリアまでに時間はかからない(CrackleCradleに関しては人によってかなり差がでるだろうが内容自体は長くはない)のでぜひ暇な時にやってみてほしい。

自分のパソコンを持てたのが今の学校に入学してからということでフリーゲーム自体はまだこの二つと他に二、三くらいしか遊んだことがないが、他にももっといい作品があるんだろう。

また何かしらフリーゲームを知る機会があれば遊んでみたいと思う。

愛情について

ここ二週間くらい親だとか恋人のことであぁだこぅだと悩んでいるが、ネットで調べたりしてみるとどうも、見返りを求めずに愛情を与えることができるのがベストだとか。

そりゃそうだ。

調べた先でも散々見たが、見返りを求めてたら「これだけしたのに!」とか怒ったりして、結局それは本当に大事に思っているのかと疑問視される。

逆に見返りを求めずにいれば相手もそれだけ大事にされてると感じるし、そうすれば自然と相手も愛してくれるという。

要はリーの恋愛六類型でいうアガペー」に当たるもので、相手にとことん尽くすタイプだ。

この記事を書く時に確かこんなのあったよなと恋愛六類型について調べたら診断的なものがあったのでやってみた。

結果、僕の中で見られる傾向としては「アガペー」一番強く、「マニア」(嫉妬深かったり何かと感情の起伏が激しいタイプ)が二番目に強く、三番目に「ストーゲイ」(友情的な関係を築くタイプ)が強いらしい。

残りの三つは見た目重視だったり恋愛は遊びだとおもったり、自分が地位的に成り上がるための道具だと思ったりするタイプなので、まず当てはまらない。

というかたいていの人が当てはまらないんじゃないだろうか。

まぁ当たってる。

中学や高校時分にやると多分マニアが一番強く出た気がするが、今はこの結果で間違いない。

ただ、アガペーが一番強いからといって安心はできない。

マニアが二番目に強いのだ。

事実大事に思ってる人に対してもやはり嫉妬だ何だという感情を抱くことはある。

あくまで傾向であって一番強い特徴に当てはまる行動を完璧にできる訳ではない。

特に僕の場合親との確執があり、愛情を求める側になろうとする気持ちが強くある。

だからマニアが強いのだろう。

そのため、もし僕が恋人に対してベストな対応をする、つまり見返りを求めずに与えるということをできるようになるには、マニアの部分を抑えつけるしかない。

本当に見返りを求めずにできるのかはわからないが、チャレンジする価値はある。

そうすることで恋人との関係を良くするだけでなく、自分を高めることにも繋がるはずだ。

親とのことは前回書いたように親が変わる気が無いうえ、僕自身も親を愛せる気がしないのでやはりどうしようもない。

だが恋人は違う。

僕がどんなに辛かろうと大事にしようと決めてる。

そのためならマニアの部分も抑えつけてやろう。

自分ももっと愛されたい、欲求を通したい。

そんな貰い手側の気持ちをなくしてやろう。

そうすれば誰も不幸にならないし得しかない。

 

そんな感じで「愛情について」の悩みとはおさらばしようと思う。

結構な数調べ物をしたりして悩んだりしたが、結局見返りを求めずに愛するのがベストだという結論になった。

ただ実行できるかどうかが難しいだけで。

これからは「自分の欲について」悩むことになりそうだ。

元々アガペーの傾向が強く献身的なのであれば、後は欲を抑えつければいいだけだ。

愛情の伝え方にも気を付けなければいけないだろうが、基本的には欲を抑えることを主軸に考えて問題ないと思う。

 

これでようやく制作の方にも身が入りそうだ。

前回書いたように生活から変えていこう。

 

※いろいろ調べ物をした時に偶然面白いものを見つけたので追記

「koibito」というワードで検索をかけると画像検索結果の方にあるアーティストの作品が出てくる。

おそらく「鯉人」なんだろう。

鯉の体から人体が生えている珍妙な作品だが少し惹かれたので紹介したかった。

いろいろ調べ物をしていた時に間違えて「koibito」で検索をかけてしまったのがきっかけだ

悩みについて

何か失敗したりとか、悩んだりとかしてるとどうも自分が嫌になってしまう。

何でああしたんだろうとか。

でも反省できてるだけいいんだろうと考えるが、それでも自分の未熟さが嫌になる。

そして沈んでいくと今やるべきことが手につかなくなる。

それに手を付けれなくてまた失敗するイメージが浮かぶ。

でも悩むってことは悩んでることについて考えてることでもあるから、悩みの対象についての経験や知識は増える。

完全に堂々巡りの思考に陥ってない限りは悩んでもいいと思う。

それはきっと自分のためになる。

何故なら、それは好きなことについて考えてることになるからだ。

何故悩む対象が好きなものになるのか?

例え話をしよう。

自分は小学校も中学もあまり算数、数学が好きじゃなかった。

だから、苦手でも対して気にしなかった。

他には、苦手な食べ物があっても気にしないだろう。

アレルギーなどは除くが。

皆そうじゃないだろうか。

たいてい何か苦手なものがあっても死にはしないし、生きていけると。

言えば興味がない、無関心。

でも、今何か悩んでいることってのは確かに嫌なものであるんだけど、結局好きだから悩んでるんだと思う。

僕の場合親が嫌いだが、大事にされたいから、本当はこんなじゃなくて他の家みたいに仲良くしたいから悩んでる。

僕が今いろんなことで悩んでて、制作が手につかないのにも悩んでるのは、自分の将来をより明るいものにしたいから、自分の未来に希望をもって好きだと言えるこれからにしたいから悩んでる。

今特別喧嘩している訳ではないが、恋人との仲であれこれ悩んでいるのも結局好きだからだ。

興味が無かったり薄れたりすると、悩みすらしなくなる。

よく聞く言葉な気がするが、「好きの反対は嫌いじゃなくて無関心」というのが今よくわかる。

 

だから僕は 悩むのは良いことだと思う。

時間が消費されたり、やらなきゃいけないことが手につかなくなってしまうのは痛い。

でも、最低限自分が大事にしたいと思えるものにはしっかりと向き合って悩むべきだと思う。

時間がない中でも大事な物や人については悩むべきだ。

悩むのは時間の無駄だとか否定的な意見もあるが、本当に好きなら悩んで当たり前だ。

それを放棄してしまうと、無関心と同じになってしまう。

 

僕が親を嫌いなのは多分ここにある。

「僕のことを理解できないし、しようとも思わない。考える時間もない」

よく親に言われる言葉だが、要は親だけど子供に何の関心もないと言っているのと同じだ。

実学校でそれなりにやっていて、それを伝えようと何も興味を持たない。

批判ばかりが頭に残って褒められた記憶がない。

それを言うと「いいところなんか一つもないから褒めれなくて当たり前」と言われる。

関心を持たないんだから、自分に害が及ばない限り僕のことに気づかないのは当たり前だろうに。

嫌いになって当たり前なんだと思う。

普通は親は子供に関心を持って接するんだろう。多分。

それをせずに否定ばかりして、誰が好きになれるだろうか。

自分のことを受け入れて貰えないんだから。

これが普通、一般的だなんて思いたくない。

親も人間だから完璧なんて求めないが、それでも子供がいるなら完璧に近づけるようにはすべきだと思う。

きっと他の家庭で親に怪我とかさせられても嫌いじゃないっていう人がいるのは、きちんと子供に関心を持ってて、間違ったことをした時に謝れる親なんだと思う。

僕の場合は違う。

酷いことをされてもそのカバーがない。

いつまでも「自分は悪くない。何を悪いことしたのかわからない」

「悪いのもおかしいのも全部子供だ」と。

衣食住与えてもらって学校も行かせてもらってて幸せだろうと思う人もいるだろうが、幸せは人に寄って違う。

そもそも衣食住と学校だけで幸せが満たされる訳じゃない。

僕は例え裕福じゃなくて学校に行けなかったとしても、家族やその周りが愛してくれるならそれでいい。

衣食住が不十分で完全な健康体にはなれなくとも大事にしてもらえさえすればそれでいい。

僕はそう思う。

 

多分、もう親に関してはどうしようもないんだろう。

ネットで毒親だ何だといろいろと調べてきたが、親が変わろうとしない限りどうしようもない。

僕に無関心な以上どうすることもできない。

このまま家を出る時が来たら一生親のことを嫌いなまま過ごすだろう。

どこかで親の話を振られた時に気まずくなるだろう。

親の死に目にも会わないだろう。

僕が先に死んでも親は泣かないだろう。

そもそも会わないだろう。

だから、もう数年して家を出る時が来るまでに少しでもそうならないように変わってくれと何度も頼んだが、無理なんだろう。

同じ人間じゃないからわからなくて当たり前なんだが、人にこういったことを話すとたいてい早めに出るのが吉だと言う。

中学の時も言われた。

確かに出たい気持ちもあるが、やはり大事にされたいから悩んでるのだ。

少しでも出る前に大事にされたい。

これから上記のように人生のところどころで寂しい思いをしたくない。

だから、少しでも早く金を貯めて最短ルートで家を出たいとか、そういう気持ちではないんだ。

 

自分のことばかりで親に何かしたいとかは書いてないが、子供が親に大事にされたいと思うのは当たり前なんじゃないだろうか。

関心を持ってもらいたいと思うんじゃないだろうか。

だから小さい子供だったりすると、関心を持ってもらいたくてわざと悪いことをしたりするという話があるのでは?

基本的に大事にされるものなんだと思う。

そして大事にされてたら、自然とそれを返してあげたいと思うんだろう。

 

でも、もう無理なんだろう。

親の件に関しては堂々巡りになっている気がする。

悩むのをそろそろやめるべきなんだ。

 

そしてこれからの自分の人生をよりよくするために、別のことで悩むべきなんだ。

優先順位はどうだろう。

まず恋人のこと。そして自分の人生を左右する制作課題。そしてそれの効率をよくするために、速度を上げたいと悩んでいる。

これに関しては多分、普段の生活の速度を上げて、制作も含め全ての速度を上げるのがベストだと考えている。

そうすれば時間も多くできるだろう。

そもそもが速くなった上に時間も取れればこれは強い。

今はこの三つが大きい悩みだろうか。

悩みもあまり多く抱え過ぎると処理しきれない。

もう親のことを外すべきなんだろう。

僕も親に関して無関心になるのがいいのだろう。

難しいだろうが、そうするのがきっとベストだ。

 

悩むのは良いことだ。

ただ大きさと量には気を付けないといけない。

優先順位をつけて処理していく。

すぐに処理しきれず、それが大事な物なら時間がかかってもいいから悩み続ける。

それでも解決しないなら、次は無関心になる努力をしよう。

そうとう難しいだろうが、そうしないとどうしようもない。

いつまでも自分に処理できないものを抱え込んでもしょうがないんだ。

それを抱え続けて不幸になるより、取っ払って幸せになる方がいい。

今の僕には大事な人もいれば、それなりには評価される技術と知識がある。

この学校に来てからどんどん成長している。

きっと幸せになれる。

制作の進捗とデザインパターン

四日ぶりの更新だ。

今日は制作の進捗報告とデザインパターンについて書こうと思う。

今現在制作の方はどちらかというと進行は遅い。

プレイヤーキャラがようやく動き始めたところだ。

だが、決してサボっていた訳ではない。

プログラムを組む上での基盤を固めるために時間を費やしていた。

どういう風に組むのがいいのかと先生が皆に配っているソースを全て読んだり、クラス図をastahで記述したりしてから、Android制作の時に参考にした書籍、ソースをちらちら見ながら実際にコードを書き始めた。

そして一週間前ほど前に案の方向性が確定し、そこからプレイヤーの仮モデル作成、プレイヤーのデザイン案を考えてくれる人がいたので依頼をするなど、最近になって大きく動き始めた感じだ。

これからモデルを歩かせたり跳ばせたりする予定だ。

 

今までの段階で基盤を固めたと書いた。

サウンドを鳴らせたりすることもできずまだまだ足りないところもあるが、まず作り始める上で必要な部分の基盤は固めた。

それはどこかと言うと、ゲームのシーン偏移や入力部分、そしてキャラクターの状態偏移だ。

この三つにはデザインパターンを使っていて、シーンとキャラクターの状態偏移には「State」パターン。入力部分には「Adapter」パターンを使っている。

これらを使うのと使わないのとでコードの見易さや保守性が大きく変わるのではないだろうか。

まだまだ開発初期段階だが、それでもありがたみがわかるくらいの威力ではある。

今から自分の中でどれくらいこの二つのパターンについて理解しているかの確認のため、そしてまだデザインパターンとかよくわからないという人のために説明をしようと思う。

 

Stateパターン

これは簡単に言うと状態をクラスにしてしまうというものだ。

例えばゲームの主人公である「Player」クラスを作るとする。

仮にアクションならばきっと歩いたり走ったり跳んだりするだろう。

しかし、ダメージを受け続けて瀕死状態になった時に行動が変わるとする。

これを疑似コードで表してみよう。

 

class Player{

    void Walk()
    {
        if(m_DamageFlag)
        {
            瀕死時の処理
        }
        else{
            通常時の処理
        }
    }

    void Run()
    {
        if(m_DamageFlag)
        {
            瀕死時の処理
        }
        else{
            通常時の処理
        }
    }

    void Jump()
    {
        if(m_DamageFlag)
        {
            瀕死時の処理
        }
        else{
            通常時の処理
        }
    }

}

 

こんな感じだろうか。

まだ許せる人もいるかもしれない。

しかし、これに加えて覚醒状態があったとする。

…もう書きたくない。

しかもアクションゲームだ。

きっと他にも関数が増えるかもしれない。

これは困った。

正しく動いたとしても凄く見辛いし、これに加えてバグが出たらどうだろうか。

大量のif、else文に目を回すだろう。

これを解決するためのデザインパターンが「State」だ。

 

これを使うとどうなるか。

コードを見てもらうとよくわかる。

class Normal{
    void Walk()
    {
        通常時の処理
    }
    void Run()
    {
        通常時の処理
    }
    void Jump()
    {
        通常時の処理
    }
};

class Damage{
    void Walk()
    {
        瀕死時の処理
    }
    void Run()
    {
        瀕死時の処理
    }
    void Jump()
    {
        瀕死時の処理
    }
};

 

どうだろうか。

通常時と瀕死時の状態をわかりやすく表している。

これなら覚醒状態が追加されたり関数が追加されても問題なさそうだ。

何がこんなにも見やすくしているのだろうか。

それは状態チェックのためのif文がないことである。

状態はクラスになっているため、いちいちチェックする必要がなくなりすっきりとしている。

 

ではこのStateパターンをどう使うかだ。

これには継承を使う。

例えばStateクラスと言う基底クラスがあり、派生クラスにNormalクラスやDamageクラスがあると言った感じだ。

このStateクラスのポインタをPlayerクラスのメンバとして保持する。

ポインタであることが重要だ。

ポインタでなければStateパターンは使えない。

何故ならアップキャストが関わってくるからだ。

これに関してはわからなければ各自調べるなりしてほしい。

別に難しい話ではなく、基底クラスのポインタは派生クラスのオブジェクトを指すことができるというだけだ。

仮想関数などにも気を付けよう。

少し話が逸れたが、このポインタを仮にm_Stateとする。

そしてPlayerの初期化部分でNormalクラスをnewしてm_Stateに代入してやればいい。

そうすればm_State->Walk()で通常時のWalk()関数が呼ばれる。

 

ここで一つ疑問が浮かぶ。

状態偏移をどうすればいいのか?

今のままでは通常時の関数は呼べても瀕死時の関数が呼べないじゃないか。

これは、状態を持っているPlayerクラスに訊いてみよう。

つまり、状態偏移はPlayerクラスの仕事である。

Playerクラスに状態偏移関数を追加しよう。

ChangeState(State *_state)とでもしようか。

この引数に新たな状態クラスを渡すことで、その状態に偏移することができる。

この関数の中でNormalクラスのポインタをdeleteし、引数で渡されたDamageクラスのアドレスを代入しよう。

 

また一つ疑問だ。

代入しようと言ったが、どこで代入すればいいのだろう。

 

ここでダメージを受けた時のDamage()関数を追加しよう。

この関数内にダメージを受けた時の処理を記述する。

つまり、ここで瀕死かどうかの判断を行い、瀕死の体力になっていた場合先ほどのChangeState(State *_state)を呼び出すのだ。

もちろん、これも各状態クラスの中に入れてしまおう。

 

おそらくこれで最後の疑問だ。

状態偏移はPlayerクラスの仕事だと言ったにも関わらず、Stateクラスとその派生クラスが持つDamage()関数の中で呼び出すと言っている。

これはどういうことかというと、StateクラスにPlayerクラスのポインタを持たせておき、コンストラクタでPlayerクラスのアドレスを渡してやるのである。

こうすることでStateクラスの中にあるDamage()関数からもChangeState(State *_state)が呼べるのである。

 

これでStateパターンの説明は以上だ。

正直凄く分かりづらいと思う。

だが、説明前半のコードが見やすくなるという部分さえわかってもらえ、そしてこれがデザインパターンを学ぶきっかけになってくれたらと思う。

 

説明の前に二つのパターンについて説明すると言ったが、Stateだけで随分とスペースを取ってしまったので、Adapterはまた次回にする。

「Stateの説明がようわからん!」とか「もっとStateのコードが見たい!」と言った人はぜひ調べてほしい。

ここにもっとコードを書こうかとも考えたが、当然インデントもしれくれないし(VisualStudioからコピペしても崩れる)正直厳しい。

ただコードがすっきりするということだけは伝えたかったので少し頑張って書いた。

少しでも制作に活かしてもらえたらと思う。

今回はこれで以上だ。

ブログのネタ

そろそろ始めて二週間になる。

もうそんなにも経つのかと感じる。

そしてネタがない。

毎日するものなのかどうかは個人によりけりだろうが、何となくこれまで一日も欠かさずやってきた。

だが、これからは頻度を減らそうと思う。

毎日は少し厳しくなってきた。

ネタがないからとブログ内容を考えるために費やす時間もない。

さっさと制作を進めなくてはならないのだ。

たまにこんなことを書こうかと思いついた時にはすぐにまた記事を書くが、思いつかない限りは更新はない。

何なら制作の進捗報告にでも使おうか。

そうすれば意見も貰えるかもしれないし、一週間ごとにとか決めておけば前回との違いを見て進捗具合がわかる。

そして何より誰かに見られることでより一層早くやってやろうと意識できるんじゃなかろうか。

一週間前と同じこと書いてるぞ。となったりしたらマズイ訳で。

と、こんな感じで今日の分は終わりにする。

次からは普通にまた記事を書くかもしれないし、制作の進捗報告になるかもしれない。