前回までの状況はこちら。
最新ソースはこちら(gitHub)。
https://github.com/takishita2nd/sudokuGUI
今回はマウスクリックで数字を入力するためのパレットを表示させます。
パレットには、こんな画像を用意しました。
これをマウスをクリックした箇所に表示させます。
それと同時に、マウスカーソルが示すマスの色も固定させます。
そして、パレットの外をクリックすると、パレットを消してマスの色も元に戻します。
まず、パレットクラスを作成します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace sudokuGUI
{
class Palette
{
private asd.Vector2DF palettePosition;
private const int width = 192;
private const int height = 256;
private asd.TextureObject2D _texture;
public Palette()
{
_texture = new asd.TextureObject2D();
}
public asd.TextureObject2D getPaletteTexture()
{
return _texture;
}
public void Show(asd.Vector2DF pos)
{
palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
_texture.Position = palettePosition;
_texture.Texture = Resource.getPalette();
}
public void Hide()
{
_texture.Texture = null;
}
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;
}
}
}
}
getPaletteTexture()では、Altseedエンジンに追加するオブジェクトを返します。
show()でマウスのポジションを渡し、その座標にオブジェクトを設定してテクスチャを表示させます。(座標の位置は少しカスタマイズしています。)
Hide()でオブジェクトのテクスチャを消します。
isClick()では、渡されたマウスの座標がテクスチャの範囲内かどうかを返します。
これを使用して実装します。
private bool mouseHold;
private Palette palette = null;
:
// パレット
palette = new Palette();
asd.Engine.AddObject2D(palette.getPaletteTexture());
// 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 (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
{
if (mouseHold)
{
if (!palette.isClick(pos))
{
palette.Hide();
mouseHold = false;
}
}
else
{
mouseHold = true;
palette.Show(pos);
}
}
// Altseedを更新する。
asd.Engine.Update();
}
今までMain関数に実装していた処理はSudokuUIクラスに移しました。(あまりMain関数にあれこれ書くのは好きじゃ無い。)
mouseHoldはマウスをクリックした状態を保持し、trueの場合はマウスをクリックされている状態で、パレットを表示している状態を示しています。
そして、mouseHold=trueのときは、マスのテクスチャの色を変える処理を行わないようにしています。
動かしてみると、こんな感じになります。
かなり、形が見えてきましたね。