その前に...【告知】
C#版のCellプログラム、"Cells"は"Cell_World.dll"と"Cells.exe"、"HowToPlayCell.txt"(「使い方」のテキスト)および"world_terrain.trn"(「地形」データ)があると動きます。
従ってソースファイルである "Cell_World.cs" と"Cells.cs"をコンパイルする必要がありますが、Bitmapリソースを使っているので、それぞれ "Cell_World.resources" と "Cells.resources" ファイルも必要となります。
ブログではこれらをすべてカバーできないので、BCCForm and BCCSkeltonパッケージの"BCCForm_and_BCCSkelton\SampleBCCSkelton\MSCompAss\Debug\Samples\Cells"フォールダーに、アイコンファイルとコンパイル用のCells.batも含めて、入っていますので関心のある方はダウンロードしてください。(もうアップされていると思いますが、入っていなければ少し時間を取ってください。又↓の通り、今後バージョンアップがあると思います。)
ーーーーー 本文 ーーーーー
色々と悩んでいましたが、今朝寝床(寝床と浴槽は発想の天国!)で、
ユーザー(プレーヤー)が「世界」に入って生きてみては?
という(よくよく考えれば至極当たり前の)は思いつきが生まれました。
取り敢えず、これでいってみよー!
ということで、以下に「思い付き仕様」をメモしておきましょう。
1.どのようにユーザーが世界に入るのか?
(1)ユーザーが「私もやりたい!」と希望する場合(これはゲーム開始ダイアログにチェックボックスを追加しましょう)、
(2)生成するセル(Cellクラスインスタンス)の一つを選択(どれにするかは、World.rand.Nextの乱数でいいでしょう)し、
(3)アバターとして乗り移ったセルのIDをフラグ(整数フィールド "int MyID = Not_Found;" )に建て
(4)World.Goes_Around()メソッドのforループで、"if(i == MyID) <自分処理メソッド>"のように外出し処理する。
2.ユーザーに自分を認知させるのか?
(1)これはさせたいので、"if(i == MyID) <自分処理メソッド>"の開始時に識別できるセルの姿とし、処理終了後通常の姿に戻すか、
(2)常時自分の姿のままで表示するか
検討を要する。尚、その画像は(C++のセルプロジェクト開始時に作って一度も使わなかった)次を採用する。
3.どのように自分のアバターを操るのか?
ウィンドウプログラムなので、又たくさんのセルがいるので、リアルタイム処理はプログラムのみならず、ユーザーにも負担が大きすぎるので、基本的に専用のアバター操縦用Modal Dialog(昔の鉄人28号の操縦機、ですな-Modalにしないと、考えている時間がなく老人には無理だし、時間を取り過ぎるとタイムアウトエラーになるから)を表示して専用メソッドに飛ばします。
//if(i == Me)の場合の処理
private void Let_Me_Do_MyWay(int MyID) //このメソッド自体をダイアログ化するか?
{
Cell Me = CellList[MyID]; //アバターセルの参照
Me.VitalCheck(); //自分の生死状態をチェック
if(Me.Alive)
{
Check_Around(Me); //自分の周囲を確認する
Point loc = Me.Where(); //自分の位置を取得
Map[loc.Y * Wld_Width + loc.X] = ' '; //対象セルxの旧座標を' 'にする
int val = Me.Find_Cell(); //対象セルxの周囲にセルがいるか確認
int dir = val & 0x0F; //dirは周囲のセルの絶対方向(0 - 7)
int id = val >> 4; //idはそのセルのID(16倍されている)
if(val != Not_Found) //周囲にセルが見つかったならば①
{ //処理は考え中
}
else //周囲にセルがいないならば
{
dir = Me.Find_Food(); //周囲に食物があるかどうか確認する②
if(dir != Not_Found) //あれば移動して、摂食する
Me.Get_Food(dir);
else
{
dir = Me.Find_Field(); //周囲に野原があるかどうか確認する③
if(dir != Not_Found) //あれば移動する
Me.Get_Move(dir);
}
}
loc = Me.Where(); //対象セルの移動があり得るので再取得
Map[loc.Y * Wld_Width + loc.X] = 'C'; //マップのセルxの新座標を'C'にする
Me.Aging(); //老化による減衰と生命力消耗
Me.Param_Change(); //状況変化から各種パラメーターを調整
}
else //死んでいたら何もしないで戻る
return;
} //現実にはダイアログ処理なので、このようなシーケンシャルな処理ではなく、①~③はボタン処理になる
まだ全然に詰められていませんが、
「ユーザー自身がアバターを作って世界に参加する」
という線で考えてみましょう。
いずれにしても時間がかかりそうなので、ブログは別トピで進めるかもしれません。悪しからず。
