その前に...【告知】

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;

           }             //現実にはダイアログ処理なので、このようなシーケンシャルな処理ではなく、①~③ボタン処理になる

 

まだ全然に詰められていませんが、

 

「ユーザー自身がアバターを作って世界に参加する」

 

という線で考えてみましょう。

 

いずれにしても時間がかかりそうなので、ブログは別トピで進めるかもしれません。悪しからず。