前回までの状況はこちら。
最新ソースはこちら。
https://github.com/takishita2nd/Picross
サイズ変更ダイアログのテキストボックスをクリックすると、数字を入力するパレットを表示させます。
パレット自体は数独のときのものを流用します。
デザインを少し変更しています。
数独では「×」を表示していた部分を「←」(1文字消す)、「C」(全部消す)に置き換えます。
class Palette
{
public class CODE
{
public const string BS = "BS";
public const string CLR = "CLR";
}
private asd.Vector2DF palettePosition;
private const int width = 192;
private const int height = 256;
private asd.TextureObject2D _texture;
SquareObject[,] paletteSquareObjects = new SquareObject[3, 3];
SquareObject paletteBSSquareObject = new SquareObject(-1, 0, "←");
SquareObject paletteCRSquareObject = new SquareObject(-1, 1, "C");
private bool _isShow = false;
public Palette()
{
_texture = new asd.TextureObject2D();
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
paletteSquareObjects[row, col] = new SquareObject(row, col, value.ToString());
value++;
}
}
paletteBSSquareObject.SetFontOffset(14, 9);
paletteCRSquareObject.SetFontOffset(10, 9);
}
public void SetEngine()
{
asd.Engine.AddObject2D(_texture);
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
asd.Engine.AddObject2D(paletteSquareObjects[row, col].getBackTexture());
asd.Engine.AddObject2D(paletteSquareObjects[row, col].getTextObject());
}
}
asd.Engine.AddObject2D(paletteBSSquareObject.getBackTexture());
asd.Engine.AddObject2D(paletteBSSquareObject.getTextObject());
asd.Engine.AddObject2D(paletteCRSquareObject.getBackTexture());
asd.Engine.AddObject2D(paletteCRSquareObject.getTextObject());
}
public void Show(asd.Vector2DF pos)
{
palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
_texture.Position = palettePosition;
_texture.Texture = Resource.getPaletteTexture();
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
paletteSquareObjects[row, col].SetPosition(pos);
paletteSquareObjects[row, col].Show();
}
}
paletteBSSquareObject.SetPosition(pos);
paletteBSSquareObject.Show();
paletteCRSquareObject.SetPosition(pos);
paletteCRSquareObject.Show();
_isShow = true;
}
public void Hide()
{
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
paletteSquareObjects[row, col].Hide();
}
}
paletteBSSquareObject.Hide();
paletteCRSquareObject.Hide();
_texture.Texture = null;
_isShow = false;
}
public bool IsShow()
{
return _isShow;
}
public bool IsClick(asd.Vector2DF pos)
{
if (pos.X > palettePosition.X && pos.X < palettePosition.X + width
&& pos.Y > palettePosition.Y && pos.Y < palettePosition.Y + height)
{
return true;
}
else
{
return false;
}
}
public void UpdateTexture(asd.Vector2DF pos)
{
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
paletteSquareObjects[row, col].UpdateTexture(pos);
}
}
paletteBSSquareObject.UpdateTexture(pos);
paletteCRSquareObject.UpdateTexture(pos);
}
public string 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 (paletteBSSquareObject.isClick(pos))
{
return CODE.BS;
}
if (paletteBSSquareObject.isClick(pos))
{
return CODE.CLR;
}
return string.Empty;
}
}
class SquareObject : ObjectBase
{
public enum FontColor
{
Black,
Red
}
protected int _row;
protected int _col;
private string _value;
protected const int offsetX = 10;
protected const int offsetY = 10;
protected int fontOffsetX = 19;
protected int fontOffsetY = 9;
public SquareObject(int row, int col, string val)
{
width = 64;
height = 64;
_row = row;
_col = col;
_value = val;
_x = col * width + offsetX;
_y = row * height + offsetY;
_backTexture = new asd.TextureObject2D();
_backTexture.Position = new asd.Vector2DF(_x, _y);
_valueText = new asd.TextObject2D();
_valueText.Font = Resource.getPaletteFont();
_valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
}
public void SetPosition(asd.Vector2DF pos)
{
_x = _col * width + (int)pos.X;
_y = _row * height + (int)pos.Y;
_backTexture.Position = new asd.Vector2DF(_x, _y);
_valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
}
public void SetFontOffset(int x, int y)
{
fontOffsetX = x;
fontOffsetY = y;
}
public void Show()
{
_valueText.Text = _value;
}
public void Hide()
{
_backTexture.Texture = null;
_valueText.Text = "";
}
public void UpdateTexture(asd.Vector2DF pos)
{
if (pos.X > _x && pos.X < _x + width
&& pos.Y > _y && pos.Y < _y + height)
{
_backTexture.Texture = Resource.getPaletteSquareTexture();
}
else
{
_backTexture.Texture = null;
}
}
public string GetValue()
{
return _value;
}
public void SetFontColor(FontColor color)
{
switch (color)
{
case FontColor.Black:
_valueText.Font = Resource.getPaletteFont();
break;
case FontColor.Red:
_valueText.Font = Resource.getFontRed();
break;
default:
break;
}
}
}
あと、数字を表示するマスと数字以外を表示するマスとでクラスを分けていましたが、今回は同じクラスでやります。
class Dialog
{
private Palette _palette = null;
public Dialog()
{
_isShow = false;
_palette = new Palette();
_palette.Hide();
// 確定ボタン
_button = new Button(436, 400, "確定");
_button.SetFontOffset(46, 4);
_button.SetAction(() =>
{
if(_action != null)
{
_action.Invoke();
}
});
// ラベル
_label1 = new Label(320, 330, "↓");
_label2 = new Label(490, 330, "→");
// Row入力エリア
_rowText = new TextBox(350, 330, "0");
// Col入力エリア
_colText = new TextBox(520, 330, "0");
_texture = new asd.TextureObject2D();
_texture.Position = new asd.Vector2DF(_x, _y);
}
public void SetEngine()
{
asd.Engine.AddObject2D(_texture);
asd.Engine.AddObject2D(_label1.getTextObject());
asd.Engine.AddObject2D(_label2.getTextObject());
asd.Engine.AddObject2D(_rowText.getBackTexture());
asd.Engine.AddObject2D(_rowText.getTextObject());
asd.Engine.AddObject2D(_colText.getBackTexture());
asd.Engine.AddObject2D(_colText.getTextObject());
asd.Engine.AddObject2D(_button.getBackTexture());
asd.Engine.AddObject2D(_button.getTextObject());
_palette.SetEngine();
}
public void UpdateTexture(asd.Vector2DF pos)
{
if (_palette.IsShow())
{
_palette.UpdateTexture(pos);
}
else
{
_rowText.UpdateTexture(pos);
_colText.UpdateTexture(pos);
_button.UpdateTexture(pos);
}
}
public void OnClick(asd.Vector2DF pos)
{
if (_palette.IsShow() == false)
{
if (_rowText.isClick(pos))
{
_palette.Show(pos);
}
if (_colText.isClick(pos))
{
_palette.Show(pos);
}
if (_button.isClick(pos))
{
_button.OnClick();
}
}
else
{
if (_palette.IsClick(pos))
{
}
else
{
_palette.Hide();
}
}
}
}
動作はこんなかんじになりました。