忍者ブログ

同人ゲームやフリーゲームはもちろん、ゲームデザイナーを目指す人、これからゲームを作りたい人、今もゲームを作っているがなかなかうまくいかない人向けの、ゲーム開発に関するブログ。

2016/06/10 (Fri)
オブジェクト指向、私の解釈と説明
ゲームに限らずプログラミングに触れるようになると必ず「オブジェクト指向」という単語を耳にすることが有る。どうやら便利な物らしい、という事で調べると良くわからない解説やたとえ話にぶつかって結局全く理解できない。恐らく誰しもが通る道だと思う。

 wikipediaの記述はこうだ。

オブジェクト指向プログラミングとは、オブジェクトと呼ばれる機能の部品でソフトウェアを構成させるものであり、一般的に以下の機能や特徴を活用したプログラミング技法のことをいう。



……日本語でおk

 オブジェクト指向に限らずだが、プログラムの用語を調べると大概数式に遭遇することがあり、そんな物は求めていないと言う気になる。説明不足を指摘するプレイヤーが求めているのは説明ではない説と全く同じで、使い方を求めているんであって、説明は求めていないのだ。

 だがしかし、使い方の実例と言う物はこれまた少なく、出てきたとしてもソースコード。違うそうじゃない。

 と言う訳でない物は作れ。カス子で培ったフロンティアスピリッツで、間違えていると言う指摘覚悟で筆者なりの理解を、整理もかねて記述したいと思う。間違ってると思った方は、より間違ってないであろう説明をご自身の手で作ってもらいたい。

オブジェクト指向とそうでない物

 オブジェクト指向を理解するには、同じ挙動をするものでオブジェクト指向のものとそうでないものを見比べると良いと思う。と言う訳で例題。

例題1:面構成

ツクールでアクションゲームを作った。この時各面の遷移をどう管理するか。全8面。用意したMAPも8つ。検討した結果、以下のようなものにしようと考えた。

マップID
1 6
2 8
3 1
4 2
5 10
6 9
7 4
8 3

 ぱっと思いつくのは、適当な変数、便宜上「面構成配列」とするが、この面構成配列に[6,8,1,2,10,9,4,2]と配列を代入するもの。これはオブジェクト指向か否か。



 面構成配列 = [6,8,1,2,10,9,4,3]




 正解は、面構成配列に配列を代入したものはオブジェクト指向では無い。オブジェクト指向の場合はどう記述するか。以下のように設定する。

マップID 次の面ID@メモ欄
1 2
2 10
3 0
4 3
6 8
8 1
9 4
10 9

 次の面のIDを各マップのメモ欄辺りに記述して、クリア時にこいつを読み込むという手法を取る。

 処理の違いを見てみよう。例えばゲームクリアをした際、面構成配列を採用した場合は以下の物が必要となる。

 次の面ID = 面構成配列[クリア面数]
 
 要するに、クリア面数を代入している変数が新たに必要となる。

 対してオブジェクト指向だとこうなる。

 次の面ID = 次の面ID@メモ欄

 一行削れただけだが、意外にこの一行がエラーを産む元になったりする。

 さて、ここでステージの構成を入れ替える事になったとしよう。4面と8面を入れ替える事になった。どうするか。配列の数字を入れ替えるだけだ。



 面構成配列 = [6,8,1,3,10,9,4,2]

 こういう場合は、オブジェクト指向よりも面構成配列を採用したほうが数が少ないから、まだぱっと解る。だが、もしこれが数がもっと増えたらどうなるか? また、テストプレイ中、今触っている面のIDが何番かというのは判断しづらく、難易度が高いからこの面は入れ替えようという際にはまずマップ画面を探すはずだ。オブジェクト指向を採用していた際、マップ画面はその画面を開いているので、メモ欄に次のステージを新たな物に書き換え、前のステージなどを変更する。

 面構成配列を採用していた場合はもう一つ、どこにその変数を用意したか、探すのが面倒になる場合が有る。また修正中にカンマを間違えて消してしまったり、気が付いたらステージ数が7になっていたりという事も起こりうる。そういった凡ミスをオブジェクト指向は防ぐことが出来る。

 もちろん、オブジェクト指向でも凡ミスは発生する。ステージのつながりがおかしかったりエラーで終了したりする。が、問題は今、その時プレイしていたステージにあるため、問題点も探しやすい。

 まだ面構成の話なので、オブジェクト指向の便利さと言う物はこの文章では伝わりにくいと思う。が、オブジェクト指向がどういう物なのかについては大体解ってもらえたと思う。

 要は、どこかで一括で管理するものはオブジェクト指向では無くて、バラバラに設定していればオブジェクト指向、となる。

例題2:装備に応じて立ちグラフィックを変更する
 数が増えれば増えるほど、オブジェクト指向はその真価を発揮するようになる。装備品によって立ちグラフィックが変化するゲームを作ったとしよう。まぁエロ同人ではド定番だが、これをどう処理して実装するか。

 何も考えずに作るとしたらこうだ。

 アクター1が、頭部にヘルメットを装備しているとき、ピクチャ4に「ヘルメット装備画像」を表示
 アクター1が、頭部に帽子を装備しているとき、ピクチャ4に「帽子装備画像」を表示
 ・
 ・
 ・
 アクター1が、武器に弓を装備しているとき、ピクチャ5に「弓装備画像」を表示

 と、条件式を作って、全てのパターンを用意する。単純作業で量も多いが実装は不可能ではない。もちろん、これはオブジェクト指向ではない。

 オブジェクト指向ではどうするか。

 アクターに以下のように設定していく。

<立ち:ヘルメット "ヘルメット装備画像">
<立ち:帽子 "帽子装備画像">



<立ち:弓 "弓装備画像">

 そして、立ち画像を表示する際にはこのように実装する。

 アクター1の頭部の装備を確認⇒アクターのメモ欄から<立ち:装備品 "画像">を取得して対応するものを表示。

 どういう事かと言うと、条件式を一切合切カットしている。ソースコードがすっきりするのはもちろんだが、単純に条件式のみで実装した場合、ピクチャ番号を間違える場合がある。また、数が増えれば増えるほどソースコードは長くなり、間違えた場所を探すのが難しくなる。

 対してオブジェクト指向であれば、少なくともピクチャ番号が装備部位では統一される。間違えたとしても、特定の装備だけ間違えるという事は無い。その場合、5か6行のなかから一つを修正してやれば良い。

 デバッグも1つの装備がきちんと表示されれば、ファイル名の間違いが無い限りはきちんと表示されるためいちいち全部を確認する必要は無い。(後々あらためて一通り確認はするべきだが)

 例題ではアクターは一人だったが、実際に作られるゲームでは2,3人になる事も多いだろう。筆者のように人員整理が上手く出来なければ20何人という事も有る。(RAVAGE

 全員分の着せ替えを、条件式で作っていくとなると、装備品が各5種類、部位が5か所アクター3人としても、条件式は75行必要となる。一行に1分かかったとしても一時間以上かかる計算だ。この単純作業に耐えられるかどうかという問題と同時に、どこか間違えたとき、75行から探さなければならず、この修正作業がまた時間がかかってしまう。メンテナンスのしにくさ、という意味でも条件式のみで作るよりは、オブジェクト指向で作成したほうが楽だ。

例題3:特定のアイテムを所有している場合にイベントが有る、という通知を行う
 SAVAGEがちょうど過渡期で、オブジェクト指向ではない物からオブジェクト指向へと処理を変更していっている所なので、実例として見てもらいたい。

 SAVAGEでは特定の拠点を介抱した際、特定のカードを持っていると掛け合いのイベントが発生するようになっている。イベントが発生している場合、フキダシアイコンを表示させているのだが、この管理をコモンイベントで行っている。

 まず、所持しているアイテムをチェックして該当するものが有れば「イベントがあるかもスイッチ」をonにしている。

 つづいて、有るかもスイッチがonの時、実際に該当するイベントを精査して、どの一度も発生していないイベントが一つでもあれば、通知をonにし、発生通知がonの時、特定の拠点にフキダシを表示させている。
所持アイテムをチェックして……

実際にフラグが立てれるかをチェックして



フラグが立っていたら吹き出しを表示


 こういう処理の仕方をしていると、イベントの新規追加と言う物が難しい。なので、次はこういう風に変更してみた。

 イベントそのものに、必要なカードと既読かどうかのスイッチ番号を代入して、どれか一つでも実行できそうなら吹き出しを表示させる、という手法だ。代入はカスタムルートでスクリプトが使えるのでそちらで行う。

オブジェクト指向で組みなおすとこうなる。
実際、一番上のコモンイベントは不要。

 見比べてみて欲しい。コモンイベントを3つまたいでいたものが、わずか3つの命令で済んでいる。ややこしい条件式も要らないし、なによりもイベントの追加がこれによって非常に容易になった。

 追加のしやすさ、メンテナンスのしやすさがオブジェクト指向を採用する利点であり、規模が大きくなればなるほどその恩恵は大きくなる。

まとめ
 実例として表示されるのは以上までだが、少なくともオブジェクト指向ではない処理の仕方と言う物についてはご理解いただけたのではないかなと思う。簡単に言ってしまうと、条件式を多用してしまうのはオブジェクト指向では無い、という事だ。

 もちろん、オブジェクト指向はいくつかのデータを効率よく扱うために検討が必要なので、小規模なもの、例えば3つ4つの分岐程度であれば、オブジェクト指向で組む方が時間の無駄となる

 よって、無暗に最初からオブジェクト指向を視野に入れず、条件式だけでぱぱっと組んでしまい、数が多くて面倒になりそうだ、という場合は今組んだ条件式から省けそうな物を省くにはどうしたらいいだろうか、と検討してみるのが学習の流れとしては良いと思う。

 以上、筆者なりのオブジェクト指向の解釈を披露してみた。株式会社とかの例を出されるよりかは解りやすかったと、個人的には思っている。もし間違っていると感じたら、上回る内容のものを各自で作ってみてもらいたい。こちらもその方がより勉強になるはずなので。

PR
コメント
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 

No Title

難しい、わからぬ
  • NONAME さん |
  • 2016/06/12 (17:39) |
  • Edit |
  • 返信

No Title

難しい、わからぬ
  • NONAME さん |
  • 2016/06/13 (11:48) |
  • Edit |
  • 返信
  
プロフィール
HN:
3dpose
Webサイト:
性別:
男性
自己紹介:
素材屋GYMを運営。
TRPGや同人ゲームなどを制作。
P R
Copyright ©  -- ゲームデザインブログ --  All Rights Reserved

Design by CriCri / Material by 妙の宴 / powered by NINJA TOOLS / 忍者ブログ / [PR]