技術的な話がなにもないとさみしいので,後半は上級者向けでいきましょう。テーマは乱数です。
ViZiMOには,乱数が用意されていません。ルーム内は物理法則が支配していますので,100個のサイコロを同時に乱舞させるルームを作っても,起動するたびに出てくる目は毎回同じです。世界はきっちりとしており,およそランダム性とは縁のないシステムです。
だいたい察しはつくと思いますが,唯一いい加減なのは,プレイヤーそのものです。プレイヤーの行動からランダム性を引き出すのが基本となります。
では,どのようにして乱数を得るかですが,100分の1秒タイマーの下1桁を使えば,1桁の乱数として十分使えそうというのが,まず思い浮かびます。しかし,ViZiMOではタイマーと即値の比較は100分の1秒単位でできるのですが,上の桁をマスクするのは,1秒単位でしかできません。一応,タイマーが1秒以上なら1秒を引いて,イベントを100個並べてやれば疑似乱数は取れるのですが……。
ということで,タイマーをそのまま使うのは,あまり実用的でないと分かります。
次に考えられるのは,整数値の範囲で処理を行うことです。例えば,スコアボードに絶えず値を加算して(ほしい乱数の範囲を超えたら値を引きます),あるタイミングで取り出すというものです。0から5までの乱数がほしい場合には,
のような感じになります。値を取り出すたびに個別処理が必要なので,乱数を多用するのは結構面倒な作業になります。
この方式は,ゲームのメインループが十分に高速な場合には,ほぼ乱数として機能しますが,同時に複数の乱数が必要な場合や,もっぱらプログラム内部で使用する(プレイヤーが介入しない)場合には適さない可能性もあります。
上の例のように1を加算していった場合,出てくる数字は,
の順になり,とくに一つのループ内で連続して使用する場合には適しません。例えば,取り出す数値の幅を0から6に変えると,
のような順序の取り出し方も可能になります。ゲームデザイン側で工夫することで,ディアブロ3 RMT,多少は規則性を分かりにくくすることができます(数値の大小が関連しないゲームでは無意味ですが)。
サンプルでは,1から100までの乱数を取る処理を行っています。タイマーは,0.01秒単位で値を加算するためのトリガーとして回されています。実際には,1秒で100まで上がるようなことはありませんが。100を超えると,100を引いて加算は続きます。なお,ここでは毎回17を足しています。
ほとんどなにもしていない処理なので高速に回っていますが,重めの処理に組み込むと癖も出やすくなるかと思われます。ここでは検証を兼ねて100までの乱数を出していますが,ゲーム内で100個の乱数が必要なケースは多くありませんから,必要最小限の値で回すようにすべきでしょう。
高速に何度も呼ばれないものについては,ゲーム内の物理的な動きを利用してやることもできます。完全な乱数にはならないのですが,プレイヤーが予測できないという意味では,十分実用になります。ゲーム内でビジュアルに表現したいときには,有効な手法です,Diablo3 RMT。
かつて使ったことがあるのは,バンパーの上にサイコロを複数載せて,それらの衝突状況から数値を決めるというものでした。プレイ開始時点から回し続けると,十分予測できないものになります。
また,現実世界と同様に,オブジェクトとして用意されているサイコロを振ってみるというのも手ではあります。ViZiMOのシステムでは,サイコロのどの面が上を向いているかなどは,判定できないのですが,マルチプレイヤーゲームであれば,プレイヤーが判断してゲームを進めるという展開もありでしょう。
ということで,日本の伝統的なダイスゲームを作成してみました。親と子に分かれ6面体ダイスを3個振って,出た目の構成で勝ち負けを決めます。6D3というやつですね。ルールは複雑なのでしてください。このゲームはマルチプレイヤー専用で,ゲームの進行はもっぱら人間が行うことになります。ゲーム内のチャットで点数処理などを行ってもらいましょう。分かりにくければ,ダイスを2個にして,目の合計が奇数か偶数かを予想するタイプにするのもよいでしょう。
ゲームの仕組みは単純でも,マルチプレイヤーであれば,道具立てに関わらず楽しめるものもできるわけです。カウンタやイベントもほとんど必要ありません。
関連トピック記事:
リネージュ?についてのアクセサリー精錬
14 年前
0 件のコメント:
コメントを投稿