連載
3Dゲームを作れるSNS「ViZiMO」でのゲーム作りを支援する連載の第3回です。前回は若干走りすぎたきらいがありましたので,今回は,少しペースを抑えて,面倒なイベントなどを使わないでゲームを作る方法を探ってみます。実際,シンプルなゲームならゲームオーバー処理だけ覚えておけば,それだけでいろいろな種類のゲームが作れるのです。
ちょっともの足りない人のためには,ViZiMOで乱数を扱う際の基礎などを解説してみましょう。
ちょっと唐突ですが,ViZiMOでゲームを作る際に,プログラミング経験は必要でしょうか?
まあ,全然ないよりはあったほうがいいと思います。用意された部品で組み上げるという意味では,一般のプログラムと変わるところがありません。パズルを組み上げるように,用意された処理がなんに使えるかを考えながら,どのような処理をしたいのかを実現していく過程は言語やシステムを問わず要求される部分です。プログラミング経験者なら,多かれ少なかれ,そういうものを組み立てることに慣れているので,経験のない人よりは慣れも早いでしょう。
ただ,制限のきつさは相当なものです。先月解説したように「変数値の代入」はハイテクだというのは,ごく一般のプログラミング経験のある人には想像を絶する世界だと思います(「即値の代入」はできるのですが)。あまりになにもできないので投げ出している人もいるのではないかと思いますが,現状のViZiMOの範囲でも結構いろんなことはできるものです。なまじどういう処理をしなければいけないかが分かるので,げんなりすることもあるのですが,それを割り切れれば道は開けます。
逆にいえば,ViZiMOは既存のプログラミング環境とはかけ離れたものなので,プログラム経験がない人でも知識的には差はありませんし,そもそもできることが少ないので,覚えるべきことはあっという間に覚えてしまうでしょう。応用していくプロセスについては,なにかプログラムを作ったことがある人のほうが鍛えられていると思われるものの,なにも特別なものが要求されるわけではありません。むしろ最近の至れり尽くせりの開発環境に慣れていないほうが,素直に取り組めるのかもしれません。
いずれにしても,ViZiMOはパズルみたいなものです。制限が多いから面白いという側面も無視できない要素です。
前回は,なるべく単純なゲームということでレースゲームにしたのですが,予想以上に複雑になってしまいました。ViZiMOのプログラムは,いくつものダイアログに設定が分散されている状態なので,たとえ全部をキャプチャして載せたとしても,全体の流れをつかむことは至難の業です。プログラムファイルを公開するので大丈夫だろうと甘く見ていたところに,プログラムを共有できないという厳しい現実が待ち構えていました。まさか,そんな制限をしているとは……。そこで今回は,できるだけイベントなどを使わずにゲームを作ることを考えてみましょう。
まず,考えられるのは,ViZiMOの基本機能だけを使用してゲームを作ることです。先月のレースゲームも,レース部分自体はViZiMOの基本機能しか使っていないのですが,それでも周回を数えたり,ランキング処理で複雑なことをやっていました。これが,周回型ではなくて,構造的に直線の競争だったら,ゴール時の判定くらいで済みますので,かなり簡単になります。シングルプレイヤー専用のゲームにすれば,ゴール地点のオブジェクトとプレイヤーとの接触判定で,勝利フラグと終了イベントを並べれば,ゲームになってしまいます。
必要なものは,プレイヤー1とゴールを示すオブジェクトとの接触判定をするカウンタと,ゲームの終了処理を行うイベントだけです。ゴールとの接触判定は,前回もやっていますが,さらにシンプルに,2個のオブジェクトの接触だけで済ませます。
もの足りなければ,第1回でやったように時間制限をつけるなり,先週の周回を参考にチェックポイントを作ったり,第1回のように,アイテム集めを絡めたりと,応用はいくらでもできます。タイマーを回せば,タイムアタックもできますし,マルチプレイゲームにしていくことも可能です。今回は,とにかく欲張るのはやめて,シンプルなゲームにしておきます。
少し複雑なイベントを組むようになると,たまにうまく動いたり動かなかったりすることがあります。そんなときは,イベントの処理順に問題があることがあります。
まず,基本的にダメなのが,イベント中でそのイベントを無効化する処理を書く場合です。これは処理の最後に置かないと,その処理まで進んだところで終了し,残りの処理は行われません。
次に,スコアボードを初期化する場合などに,スコアボードを停止(無効化)してから値を設定しようとすると,うまく動かないことがあります。100%失敗するわけではないようですが,初期化を先にしてから停止するようにしましょう。
カウンタとイベントは前述のものだけあればゲームになります。技術的な解説は早くも終了です。
あとは,ゲーム開始地点から,ゴールまで行くだけ。目的はシンプルです。ただ,その過程をどういう風に作るかで,ゲーム内容はまったく変わってきます。そこに必要なのが想像力というものです。
どのように作るかについては,まったくルールはありません。個人的な見解としては,ゲームの構成要素をできるだけ少なくしたほうがよいというのがありますが,まあ,あんまりごちゃごちゃといろんな要素をつけるより,シンプルにまとめたほうがカッコいいよという程度のことです。
これに多少のアレンジを加えると,ゲームの幅がさらに広がるわけですが,それは自由課題ということで。レースゲームにするもよし,アクションゲームにするもよし,はたまたアドベンチャーゲームにすることもできます。
私が最初に作成したゲームも,終了判定以外にイベントを使わない簡単なものでした。それでも,単純なゲーム性だけでいうと,いまだにいちばん面白い作品になっているかもしれません。
さて,サンプルはなんでもいいんですが,今回作ってみたのは迷路です。仕掛けはなにもありません。敵もいません。使ったパーツは,ほぼ地面のみ。迷路といっても,壁で向こうが見えないわけでもないので,迷うことはほとんどないでしょう。道の上を歩いてゴールまで進むだけのゲームです。一応,タイムアタック要素くらいはつけましょうか。「そんなのでゲームになるのか?」という意見もありましょうが,それは遊ぶ人次第でしょう。
さて,適当に作ってみた迷路は,想定より道が狭くなって,私の作るルームとしては,難易度は少し高めなものになりました(注:最終的に全体を少し拡大したとのこと)。詳しくは,ViZルームでご確認ください。
今回作ったものは,上記のように,基本的には,単に道があちこちつながっただけのものです。ただ,ちょっとだけ傾けてあります。また,道しかないのですが,道以外の部分は,まさになにもありません。落ちないでください。道はゴールまでつながっていますので,ちゃんと辿っていけばゲームはクリアできるはずです。とくに通りにくいところや難所もありません(たぶん)。ただ,迷路ですので,当然ながら順路以外の部分もあります。ジャンプも可能です。視界は,素通しですので,もしかしたら近道が見つかるかもしれません。ただし落ちたらスタート地点からやり直しです。
……と,当初の予定ではこんな感じでバランスを取ったつもりなのですが,よもや順路どおりに歩いてゴールへ行くだけでも大変とは思いませんでした。慣れればきっと走り抜けることができるようになると思われるのですが。
ViZiMOでは,なにかのオブジェクトが自分自身以外のオブジェクトに対して操作を行うときには最低1個ずつのカウンタとイベントが必要になりますが,自分自身を操作するときには,なにも必要ありません。オブジェクトのプロパティで出てくる接触時の動作指定は,非常に便利に使えるものです。指定できるのは,爆発,出現,消失の3種類だけ。しかし,消失あたりはとても幅広く使えます。
例えば,オブジェクトがどこにあるかを知るためには,非表示にしたオブジェクトとの接触判定を取ることがよく行われています。この場合,非表示オブジェクトは,
- 重さ:0.01kg
- 反発率:0
- 物理運動:する
- 初期状態をアクティブ:しない
- 衝突判定:する
- 接触アクション:消失
に設定しておくと,ゲーム内のオブジェクトに与える影響が最小限になります。
技術的な話がなにもないとさみしいので,後半は上級者向けでいきましょう。テーマは乱数です。
ViZiMOには,乱数が用意されていません。ルーム内は物理法則が支配していますので,100個のサイコロを同時に乱舞させるルームを作っても,起動するたびに出てくる目は毎回同じです。世界はきっちりとしており,およそランダム性とは縁のないシステムです。
だいたい察しはつくと思いますが,唯一いい加減なのは,プレイヤーそのものです。プレイヤーの行動からランダム性を引き出すのが基本となります。
では,どのようにして乱数を得るかですが,100分の1秒タイマーの下1桁を使えば,1桁の乱数として十分使えそうというのが,まず思い浮かびます。しかし,ViZiMOではタイマーと即値の比較は100分の1秒単位でできるのですが,上の桁をマスクするのは,1秒単位でしかできません。一応,タイマーが1秒以上なら1秒を引いて,イベントを100個並べてやれば疑似乱数は取れるのですが……。
ということで,タイマーをそのまま使うのは,あまり実用的でないと分かります。
次に考えられるのは,整数値の範囲で処理を行うことです。例えば,スコアボードに絶えず値を加算して(ほしい乱数の範囲を超えたら値を引きます),あるタイミングで取り出すというものです。0から5までの乱数がほしい場合には,
- スコアボードが6以上なら,6を引く
- スコアボードが0のときの処理
- スコアボードが1のときの処理
- スコアボードが2のときの処理
- スコアボードが3のときの処理
- スコアボードが4のときの処理
- スコアボードが5のときの処理
- スコアボードに1を足す
のような感じになります。値を取り出すたびに個別処理が必要なので,乱数を多用するのは結構面倒な作業になります。
この方式は,ゲームのメインループが十分に高速な場合には,ほぼ乱数として機能しますが,同時に複数の乱数が必要な場合や,もっぱらプログラム内部で使用する(プレイヤーが介入しない)場合には適さない可能性もあります。
上の例のように1を加算していった場合,出てくる数字は,
- +1: 0 1 2 3 4 5
の順になり,とくに一つのループ内で連続して使用する場合には適しません。例えば,取り出す数値の幅を0から6に変えると,
- +3: 0 3 6 2 5 1 4
- +5: 0 5 3 1 6 4 2
のような順序の取り出し方も可能になります。ゲームデザイン側で工夫することで,多少は規則性を分かりにくくすることができます(数値の大小が関連しないゲームでは無意味ですが)。
サンプルでは,1から100までの乱数を取る処理を行っています。タイマーは,0.01秒単位で値を加算するためのトリガーとして回されています。実際には,1秒で100まで上がるようなことはありませんが。100を超えると,100を引いて加算は続きます。なお,ここでは毎回17を足しています。
ほとんどなにもしていない処理なので高速に回っていますが,重めの処理に組み込むと癖も出やすくなるかと思われます。ここでは検証を兼ねて100までの乱数を出していますが,ゲーム内で100個の乱数が必要なケースは多くありませんから,必要最小限の値で回すようにすべきでしょう。
高速に何度も呼ばれないものについては,ゲーム内の物理的な動きを利用してやることもできます。完全な乱数にはならないのですが,プレイヤーが予測できないという意味では,十分実用になります。ゲーム内でビジュアルに表現したいときには,有効な手法です。
かつて使ったことがあるのは,バンパーの上にサイコロを複数載せて,それらの衝突状況から数値を決めるというものでした。プレイ開始時点から回し続けると,十分予測できないものになります。
また,現実世界と同様に,オブジェクトとして用意されているサイコロを振ってみるというのも手ではあります。ViZiMOのシステムでは,サイコロのどの面が上を向いているかなどは,判定できないのですが,マルチプレイヤーゲームであれば,プレイヤーが判断してゲームを進めるという展開もありでしょう。
歯車の歯の間にある8個のコインのうち1個だけ重いという数理パズルの実装例。ちなみに,このルームは,コインをかき混ぜて天秤に載せるまではよいのだが,2回目の天秤に載せたコインが判別できなくて頓挫中とのこと
ということで,日本の伝統的なダイスゲームを作成してみました。親と子に分かれ6面体ダイスを3個振って,出た目の構成で勝ち負けを決めます。6D3というやつですね。ルールは複雑なのでWikipediaなどを参照してください。このゲームはマルチプレイヤー専用で,ゲームの進行はもっぱら人間が行うことになります。ゲーム内のチャットで点数処理などを行ってもらいましょう。分かりにくければ,ダイスを2個にして,目の合計が奇数か偶数かを予想するタイプにするのもよいでしょう。
ゲームの仕組みは単純でも,マルチプレイヤーであれば,道具立てに関わらず楽しめるものもできるわけです。カウンタやイベントもほとんど必要ありません。
できるだけ複雑なイベントを組まずにゲームを作るには,用意されているオブジェクトや仕組みを利用していくか,マルチプレイヤーにして,プレイヤー自身に遊びの要素を任せるというのが有効になります。ここで,もう少し欲張ってしまうとカウンタやイベントが満載になりがちなのですが,まずはゲームの素の部分から固めていくことが重要です。重要なのは,基本的なアイデアの部分です。ゲームの本体を作るためには,それだけで十分な場合も多いのです。
ただ,ちょっと欲張ったり,ここから進んである程度まで行くと,ViZiMOではちょっとしたことをするにもたくさんの手順が必要になることに慣れてもらうしかありません。ViZiMOは,ものごとをまとめつつ個別に処理するということが不得手なのです。オブジェクトの配列はあるけど,インデックスがないといえば分かる人には分かるでしょうか。
今回は,できるだけViZiMO上の処理を簡単に済ませるゲームを作る方法を中心にしてみました。来週は,また少しややこしい方面に向かいそうですが,なるべく簡単に使えるサンプルを紹介したいと思います。では,また来週。
オブジェクトをグループ化しておくと,便利なことは多々あります。ただ,ViZiKit上で普通にオブジェクトグループを選択して,Ctrl-Cなどでコピーをすると,グループ化されていない状態でオブジェクトが生成されてしまいます。しかし,オブジェクト管理ウィンドウで「複製」のボタンを使用すると,オブジェクトグループのままコピーを行うことができます。
グループ内の要素を同様の方法で複製すると,グループ内に複製されたオブジェクトができるので,なにかと便利です。普通の複製も同じ処理にしてくれるといいのですが……。
追記:Ctrl-Cの操作でもオブジェクトグループ単位での複製が可能です。しかし,オブジェクトグループにならない場合もあるようなので,オブジェクト管理ウィンドウの使用をお勧めします。
|
- 関連タイトル:
ViZiMO
- この記事のURL:
(C)2007 MiCROViSiON Inc.