前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudokuGUI
処理を行うボタンを設置します。
作成するボタンは「解析開始」ボタンと、入力した数字を全部消去する「クリア」ボタンです。
まず、ボタンを配置するところから作ります。
ボタンを配置するためにボタン用のクラスを作成します。
しかし、すでに作成しているSquareObjectクラスと重複している部分があるので、新たにObjectBaseクラスを作成して、共通部分はこちらに書きます。
class ObjectBase
{
protected int _x;
protected int _y;
protected asd.TextureObject2D _backTexture;
protected asd.TextObject2D _valueText;
protected int width;
protected int height;
public asd.TextureObject2D getBackTexture()
{
return _backTexture;
}
public asd.TextObject2D getTextObject()
{
return _valueText;
}
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;
}
}
}
そして、SquareObjectクラスと新たに作成するボタンクラスはこのObjectBaseクラスを継承します。
SquareObjectの記載は省略します。gitHubのソースを参照してください。
class Button : ObjectBase
{
private string _text;
private const int fontOffsetX = 39;
private const int fontOffsetY = 9;
public Button(int x, int y, string text)
{
width = 256;
height = 64;
_x = x;
_y = y;
_text = text;
_backTexture = new asd.TextureObject2D();
_backTexture.Position = new asd.Vector2DF(_x, _y);
_valueText = new asd.TextObject2D();
_valueText.Text = _text;
_valueText.Font = Resource.getTextFont();
_valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
}
public void updateTexture(asd.Vector2DF pos)
{
if (pos.X > _x && pos.X < _x + width
&& pos.Y > _y && pos.Y < _y + height)
{
_backTexture.Texture = Resource.getButtonTexture();
}
else
{
_backTexture.Texture = null;
}
}
public virtual void onClick(SquareObject[,] squareObjects)
{
throw new NotImplementedException();
}
}
onClick()にクリック時の処理を記載します。
実際はこのクラスを継承して使用するので、ここでは未実装Exceptionを投げて例外を発生させます。
このクラスを継承して、まずはクリア処理を作成します。
class ClearButton : Button
{
public ClearButton() : base(600, 500, "クリア")
{
}
public override void onClick(SquareObject[,] squareObjects)
{
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
squareObjects[row, col].setValue(0);
}
}
}
}
これを使用して、処理を作成します。
// ボタン
Button clear = new ClearButton();
asd.Engine.AddObject2D(clear.getBackTexture());
asd.Engine.AddObject2D(clear.getTextObject());
Button start = new Button(600, 570, "解析開始");
asd.Engine.AddObject2D(start.getBackTexture());
asd.Engine.AddObject2D(start.getTextObject());
// 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);
}
}
clear.updateTexture(pos);
start.updateTexture(pos);
}
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
{
if (clear.isClick(pos))
{
clear.onClick(squareObjects);
}
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];
}
}
}
}
}
}
// Altseedを更新する。
asd.Engine.Update();
}
実行結果はこんな感じ。
次回は解析処理を実装していきます。