【C#】【ALTSEED】【数独】パレットから数字を入力する

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/sudokuGUI

今回でパレット処理を完成させます。

パレットの数字をクリックしたら、そのパレットマスの数字を取得して、パレットを消去し、マスに数字を入力します。

まずは、パレットのどのマスがクリックされたかを確認します。

これはSquareObjectに実装します。

    public bool isClick(asd.Vector2DF pos)
    {
        if (pos.X > _x && pos.X < _x + width
            && pos.Y > _y && pos.Y < _y + height)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

やっていることはupdateTexture()と同じで、マウスカーソルがマスの中にあるかどうかを判定して、true/falseを返します。

そしてもう一つ。

        public int getValue()
        {
            return _value;
        }

こっちは特に説明は入らないですよね。

これをPaletteクラスに実装します。

        public int getClickValue(asd.Vector2DF pos)
        {
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    if(paletteSquareObjects[row, col].isClick(pos) == true)
                    {
                        return paletteSquareObjects[row, col].getValue();
                    }
                }
            }
            if (PaletteBatsuSquareObject.isClick(pos))
            {
                return 0;
            }
            return 0;
        }

isClick()でマウスカーソルがマスの中にあるかを確認して、その中にあればgetValue()で値を取得します。

これを×にも実装し、こちらは空白を意味する0を返します。

これをsudokuUIに実装します。

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                if (!mouseHold)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            squareObjects[row, col].updateTexture(pos);
                            if(squareObjects[row, col].isClick(pos) == true)
                            {
                                clickedSquareObject = squareObjects[row, col];
                            }
                        }
                    }
                }
                else
                {
                    //palette.updateTexture(pos);
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    if (mouseHold)
                    {
                        if (!palette.isClick(pos))
                        {
                            palette.hide();
                            mouseHold = false;
                        }
                        else
                        {
                            int value = palette.getClickValue(pos);
                            if(clickedSquareObject != null)
                            {
                                clickedSquareObject.setValue(value);
                                palette.hide();
                                mouseHold = false;
                            }
                        }
                    }
                    else
                    {
                        mouseHold = true;
                        palette.show(pos);
                        for (int row = 0; row < 9; row++)
                        {
                            for (int col = 0; col < 9; col++)
                            {
                                if (squareObjects[row, col].isClick(pos) == true)
                                {
                                    clickedSquareObject = squareObjects[row, col];
                                }
                            }
                        }
                    }
                }

mouseHold==true(パレット表示中)で、パレットがクリックされた場合、先ほど実装したgetClickValue()を使用して、数値を取得します。

9×9のどこをクリックしたかを覚えておかなければならないため、パレットを表示する際に、どのマスをクリックされたかを覚えておきます。

この覚えたマスに対して、パレットから取得した数値を設定します。

ちなみに、palette.updateTexture(pos)をコメント化しているのは、パレットにもマウスカーソルでテクスチャを適用しようとすると、パレットを消したときにテクスチャが残ってしまうからです。

多分、エンジンのバグ。

なので、パレットにはマウスカーソルでテクスチャ適用は諦めました。

実行結果はこんな感じです。

だいぶ形になってきました。

完成まであと少しです。