見出し画像

ダンスゲーを作りたい#42 【試作】プレイシステムの基盤その4(CPUってどうやって作る?)

さて、目下最大レベルの鬼門、CPUの作成です。

各種ゲームのCPUって正直一番すげぇんじゃないかって思ってます。

中身まで考えてたら進んだ実感が消えてモチベーション持ってかれるので、ガワだけ進めていきます。

方式の想定

最終何があったら嬉しいかに重点を置くと、現在の時間を与えたら入力するかしないか込みで何を入力するかを返ししてくれる子がいたらうれしいなってなります。

それをベースに構成を考えたらこうなりました。

画像1

そういう処理を作る部分はスコアの算出法とかをもとに策定すればいいとして、一旦そういう処理がある前提でそういうテスト関数を作って挙動してもらおうと思います。

テストCPUクラス

CPUの中身は現状ブラックボックスですが、とりあえず時間を入れると何したいかを返してくれるpublic関数を持ってるということだけ決定しているので、テスト用のCPUクラスを作って適当に曲開始から2秒後にスタートして、1秒おきに事前に決めた配列から技を出したがるように作ってみました。

public class VirtualPlayer{
   /*何するかの決め方はあとで考える*/
   bool Started = false;
   float Spase=0f; float lasttime = 0f;
   int[] list = new int[4] {0,1,2,2};
   int Count=-1;
   /*毎フレーム呼んで何するかを返す*/
   public int getMove(float MuiscTime){
       Spase=MuiscTime-lasttime;
       //Debug.Log("inGetMove_MT::"+MuiscTime);
       if(MuiscTime>2f && !Started){
           Started=true;
           return 10;
       }
       if(Count>list.Length-2){
           return -1;
       }
       if(Spase>1f && Started){
           Spase=0;
           lasttime=MuiscTime;
           Count+=1;
           return list[Count];
       }
       return -1;
   }
}

この子のインスタンスをプレイマネージャ内に持って、Update内で毎フレーム時間を与え、何したいか聞いてあげます。

    
    public VirtualPlayer CPU;
    //良きタイミングで初期化してあげる
    
    void Update(){
       if(CPU!=null){
           int MoveID = CPU.getMove(Manager.AudioManager.GameMusic.NowTime);
           switch(MoveID){
               case -1:
                   break;
               case 10:
                   OnMoveStartBT("P2",null,null,null);
                   break;
               default:
                   string[] TL = new string[5] {"S00001","S00002","S00001","S00002","S00001"};
                   OnCPUMoveBT(TL[MoveID]);
                   break;
           }
       }
   }

マネージャ側では受け取ったIDに応じてプレイヤーのボタン入力に相当する処理を呼び出してあげることで仮想的なプレイヤーが爆誕しました。

現段階でIDだけ返すよりは技情報はCPUに持たせて技IDの文字列返してくれた方が都合良さそうということだけわかったので後で詰める際にはそういう仕様にしたいところです。

とりあえずこれで動いてくれました。

画像2

gif時間の都合上1Pが踊り始めるとこで切ってますが左側が2Pのクラスが操作してるキャラクターで、右がユーザ入力で動くキャラクターです。実はアキバレにも出てきた右から左の法則に則っていたり?

これで二人分の入力情報の保存はできたので、後はこれをスコアマネージャに送り込んでスコアを算出してもらうだけです。

スコアマネージャの算出法の決定版とかは書くとしても、他は特段書くようなこともないので、インプット情報を入れたらスコアが出てくる関数があって、そこに入れてスコア出たらリザルトに行くっていう流れだということだけ書いておきます。

概念的な難しい事を今考えるの嫌なので、ひとまずフローを完成させていきましょう。

というわけで次回はリザルト画面を作りましょうか。

この記事が気に入ったらサポートをしてみませんか?