前回までの状況はこちら。
最新ソースはこちら。
https://github.com/takishita2nd/Picross
ダイアログを表示するところまで行きたいのですが、
まず、ダイアログを表示するボタンを作成しなくちゃいけないので、
class Button : ObjectBase
{
private string _text;
private const int fontOffsetX = 9;
private const int fontOffsetY = 4;
protected bool enable = true;
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.getFont();
_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 void setEnable(bool enable)
{
this.enable = enable;
}
public virtual void onClick()
{
throw new NotImplementedException();
}
}
Buttonクラスを作成。ほぼほぼ数独解析ツールのコードをコピーしました。
座標とかサイズは微調整していますが。
これを継承してサイズ変更ボタンを作成。
class SizeButton : Button
{
public SizeButton() : base(10, 10, "サイズ変更")
{
}
public override void onClick()
{
Dialog dialog = Controll.GetDialog();
dialog.Show();
}
}
class Controll
{
private static Dialog _dialog = null;
public static Dialog GetDialog()
{
if(_dialog == null)
{
_dialog = new Dialog();
_dialog.SetEngine();
}
return _dialog;
}
}
各種コントロールもシングルトン形式にすれば、アクセスが簡単になるかと思って。
class Dialog
{
private asd.TextureObject2D _texture;
public Dialog()
{
_texture = new asd.TextureObject2D();
_texture.Position = new asd.Vector2DF(300, 300);
}
public void SetEngine()
{
asd.Engine.AddObject2D(_texture);
}
public void Show()
{
_texture.Texture = Resource.getDialogTexture();
}
public void Hide()
{
_texture.Texture = null;
}
class PicrossUI
{
public void Run()
{
asd.Engine.Initialize("ピクロス解析ツール", 1000, 800, new asd.EngineOption());
List<Button> buttons = new List<Button>();
var sizeButton = new SizeButton();
asd.Engine.AddObject2D(sizeButton.getBackTexture());
asd.Engine.AddObject2D(sizeButton.getTextObject());
buttons.Add(sizeButton);
while (asd.Engine.DoEvents())
{
asd.Vector2DF pos = asd.Engine.Mouse.Position;
foreach (Button button in buttons)
{
button.updateTexture(pos);
}
if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
{
foreach (Button button in buttons)
{
if (button.isClick(pos))
{
button.onClick();
}
}
}
asd.Engine.Update();
}
asd.Engine.Terminate();
}
}
ダイアログ表示とか、ボタン押下時の処理とか、本来ウインドウシステムがやっていることを、全て自前でやらなくちゃ行けないので、ちょっと面倒な事になっています。
頭がごっちゃになりそう。
デリゲートとか上手に使うと上手くいきそうな気もするんですが。
もうちょっと考えてみます。