/// <summary> /// フォトの初期化 /// </summary> /// <param name="target">対象ブロック</param> private void InitializeFont(BlockBase target) { //文字の作成 _textObj.Font = Engine.Graphics.CreateDynamicFont("", target.BlockSize / 2, new Color(255, 0, 0, 255), 1, new Color(255, 255, 255, 255)); _textObj.Text = "▲"; //文字位置の調整 var xCorrect = _textObj.Font.CalcTextureSize("S", WritingDirection.Horizontal).X / 2; _textObj.Position = new Vector2DF(target.XPosition + xCorrect, target.YPosition); //レイヤーへ追加 target.Layer.AddObject(_textObj); }
/// <summary> /// 旗マークが間違っていた場合、強制オープン /// </summary> /// <param name="target">対象ブロック</param> public void TryOpen(BlockBase target) { //最初に文字を解放 _textObj.Dispose(); //その後で強制オープンの処理 target.ChangeState(new OpenedState(target)); if (target.AroundMinesNum == 0) { foreach (var block in target.NeighborBlockList) { block.CurrentState.TryOpen(block); } } }
/// <summary> /// オープンされたものは色を濃く /// </summary> /// <param name="target">対象のブロック</param> public void OnMouseOver(BlockBase target) { var rect = MakeRectShape(target); target.Shape = rect; //地雷を空けたら少し赤くして、他は緑色 if (target.HasMine) { target.Color = new Color(255, 50, 50); } else { target.Color = new Color(100, 150, 100); } }
/// <summary> /// 周囲のブロックを強制オープンしようと試みる /// </summary> /// <param name="target">対象ブロック</param> public void TryOpen(BlockBase target) { /* * 1.最初にTryOpenが実行されたブロックをオープンにする * 2.TryOpenが実行されたブロックの周りが0ならば * 3.各ブロックを走査し * 4.再帰的にTryOpenを呼ぶ */ target.ChangeState(new OpenedState(target)); //1 if (target.AroundMinesNum == 0) //2 { foreach (var block in target.NeighborBlockList) //3 { block.CurrentState.TryOpen(block); //4 } } }
/// <summary> /// 周りの地雷数によって色を変える /// </summary> /// <param name="target">対象ブロック</param> private Color GetProperColor(BlockBase target) { //地雷持ちは赤色にする if (target.HasMine) { return(new Color(255, 0, 0)); } //周囲の地雷数によって色を変える switch (target.AroundMinesNum) { case 1: return(new Color(0, 0, 255)); case 2: return(new Color(0, 100, 0)); case 3: return(new Color(255, 0, 0)); case 4: return(new Color(0, 0, 150)); case 5: return(new Color(150, 0, 0)); case 6: return(new Color(0, 0, 150)); case 7: return(new Color(0, 0, 0)); case 8: return(new Color(150, 150, 150)); default: return(new Color(255, 255, 255)); } }
/// <summary> /// クリックされてもやることはない /// </summary> /// <param name="target">対象のブロック</param> public void OnClicked(BlockBase target) { //特にすることはない }
////============================================================================= //// コンストラクタ //// ////============================================================================= public OpenedState(BlockBase target) { InitializeFont(target); }
/// <summary> /// すでにオープンなので何もしない /// </summary> /// <param name="target">対象ブロック</param> public void ForceOpen(BlockBase target) { //特に処理はない }
/// <summary> /// すでにオープンになっている /// </summary> /// <param name="target">対象ブロック</param> public void TryOpen(BlockBase target) { //特にすることはない }
/// <summary> /// 強制的に周囲のブロックごとオープンする /// </summary> /// <param name="target">対象ブロック</param> public void ForceOpen(BlockBase target) { target.ChangeState(new OpenedState(target)); }
/// <summary> /// 旗を立てる処理 /// </summary> /// <param name="target">対象ブロック</param> public void OnRightClicked(BlockBase target) { target.ChangeState(new FlagedState(target)); }
/// <summary> /// 旗マークを解除する /// </summary> /// <param name="target">対象ブロック</param> public void OnRightClicked(BlockBase target) { _textObj.Dispose(); target.ChangeState(new ClosedState()); }
/// <summary> /// 旗を立ててガードしているので何もしない /// </summary> /// <param name="target">対象ブロック</param> public void OnClicked(BlockBase target) { //特に何もしない }
////============================================================================= //// コンストラクタ //// ////============================================================================= public FlagedState(BlockBase target) { InitializeFont(target); }