【C#】【ピクロス】【ALTSEED】数字入力マスに数字を入力する

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

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

https://github.com/takishita2nd/Picross

前回追加した数字入力マスに数字を入力する処理を作っていきます。

数字入力はサイズ変更ダイアログと同じパレットを使用します。

            // パレット
            Palette palette = new Palette();
            palette.SetEngine();
            palette.Hide();

数字入力マスをクリックすると、パレットを表示させます。

パレット表示中は、マウスカーソルの所にある数字マスのテクスチャを色つきに変更します。

そして、数字をクリックすると、その数字が数字マスに入ります。

パレットの外をクリックすると、パレットを閉じ、入力終了になります。

これをコードに書いたらこうなりました。

            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                if (!dialog.IsShow())
                {
                    if (!palette.IsShow())
                    {
                        foreach (var rowList in rowNumberSquare)
                        {
                            foreach (var s in rowList)
                            {
                                s.UpdateTexture(pos);
                            }
                        }
                        foreach (var colList in colNumberSquare)
                        {
                            foreach (var s in colList)
                            {
                                s.UpdateTexture(pos);
                            }
                        }
                        foreach (Button button in buttons)
                        {
                            button.UpdateTexture(pos);
                        }
                    }
                    else
                    {
                        palette.UpdateTexture(pos);
                    }
                }
                else
                {
                    dialog.UpdateTexture(pos);
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    if (!dialog.IsShow())
                    {
                        if (!palette.IsShow())
                        {
                            int rowIndex;
                            int colIndex;
                            rowIndex = 0;
                            foreach (var rowList in rowNumberSquare)
                            {
                                colIndex = -1;
                                foreach (var s in rowList)
                                {
                                    if (s.IsClick(pos))
                                    {
                                        selectedNumberSquare = s;
                                        selectedRowIndex = rowIndex;
                                        selectedColIndex = colIndex;
                                        palette.Show(pos);
                                    }
                                    colIndex--;
                                }
                                rowIndex++;
                            }
                            colIndex = 0;
                            foreach (var colList in colNumberSquare)
                            {
                                rowIndex = -1;
                                foreach (var s in colList)
                                {
                                    if (s.IsClick(pos))
                                    {
                                        selectedNumberSquare = s;
                                        selectedRowIndex = rowIndex;
                                        selectedColIndex = colIndex;
                                        palette.Show(pos);
                                    }
                                    rowIndex--;
                                }
                                colIndex++;
                            }
                            foreach (Button button in buttons)
                            {
                                if (button.IsClick(pos))
                                {
                                    button.OnClick();
                                }
                            }
                        }
                        else
                        {
                            if (palette.IsClick(pos))
                            {
                                string v = palette.GetClickValue(pos);
                                updateTextValue(selectedNumberSquare, v);
                            }
                            else
                            {
                                palette.Hide();
                                if(selectedNumberSquare != null)
                                {
                                    if(selectedNumberSquare.GetStringValue() != string.Empty)
                                    {
                                        if (selectedRowIndex >= 0)
                                        {
                                            var square = new NumberSquare(selectedRowIndex, selectedColIndex - 1);
                                            asd.Engine.AddObject2D(square.getBackTexture());
                                            asd.Engine.AddObject2D(square.getTextObject());
                                            rowNumberSquare[selectedRowIndex].Add(square);
                                        }
                                        else if (selectedColIndex >= 0)
                                        {
                                            var square = new NumberSquare(selectedRowIndex - 1, selectedColIndex);
                                            asd.Engine.AddObject2D(square.getBackTexture());
                                            asd.Engine.AddObject2D(square.getTextObject());
                                            colNumberSquare[selectedColIndex].Add(square);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        dialog.OnClick(pos);
                    }
                }

実行結果はこんな感じになります。

数字入力を終えると、さらに入力スペースが増えるように細工しています。

ただ、このあたりの処理は変更するかもしれません。

ここどうするのが良いのかなーと言うのを未だに考えています。

【ラズパイ】Sense HATのジャイロセンサー

Sense Hatのジャイロセンサーを使っていろいろやってみようと思ったものの、思ったような結果が得られなかったので、もっとドキュメントを読み込んでいこうと思います。

ドキュメントはこれ(英語)。

https://github.com/raspberrypilearning/astro-pi-guide/blob/master/sensors/movement.md

Sense HatにはIMUというものが搭載されているらしい。

IMUにはジャイロセンサー、加速度センサー、方位磁石が搭載されています。

向きは、Pitch、Roll、Yawの三つの軸で表されます。

まぁ、これはこないだ見た。

この動画で三つの軸の関係性が分かります。

これに関するサンプルプログラムがありました。

使い方書いてあるけど、このやり方では動かなかったので、実際に試したやり方を書いておきます。

> git clone git://github.com/astro-pi/apollo-soyuz
> cd apollo-soyuz
> sudo pip3 install pi3d
> sudo ./soyuz.py

SDカードスロットがメインブースターになるイメージです。

実際に動かしてみました。

Roll軸で回転させてみたところ、それに伴って向き自体が左右に動いている事が分かりました。

Sense Hat(IMU)に搭載されているジャイロセンサーは宇宙船を操作することに特化されていて、単純に傾けたときの3軸の角度が得られる訳では無い(ような気がする)。

宇宙船補正みたいなものがあるんじゃないか。

しらんけど。

多分、思ったような数値が出なかったのは、このせいなんだろうな。

そうだよな、Sense Hatって宇宙の科学実験用のアタッチメントだもんな。

まぁ、ちょっと宇宙船の技術に触れられたのは良かったと思う(という風に、前向きに捉える)。

【ラズパイ】受信したセンサーデータを表示する。

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

前回はラズパイからセンサーで収集したデータを送信させていましたが、フォーマットがJsonなので、このままでは使用できません。

ラズパイ側のソースコードをgitHubにアップしました。

https://github.com/takishita2nd/pi/blob/master/http.py

今回はこのデータを見やすいように加工します。

GUIのほうが見やすいと思って、軽い気持ちで作ってみたのですが、思った以上にがっつりなことになってしまいました。

WPFを使用しようと思うのですが、今回はPrismという拡張機能を使用してMVVMモデルで作成しようと思います。

メニューの拡張機能からPrismを検索し、Prismをインストールします。

Visual Studioを再起動すると、新規プロジェクトにPrismが追加されているので、Prismのプロジェクトを作成します。

まずは、XAMLの作成。

<Window x:Class="BlankApp1.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="180" Width="350">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="温度" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="1" Grid.Column="0" Content="湿度" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="2" Grid.Column="0" Content="気圧" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="0" Grid.Column="1" Content="{Binding Temperature}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="1" Grid.Column="1" Content="{Binding Humidity}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Label Grid.Row="2" Grid.Column="1" Content="{Binding Pressure}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Button Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Content="Monitor" Command="{Binding ButtonClickCommand}" HorizontalAlignment="Center" VerticalAlignment="Center" Height="20" />
    </Grid>
</Window>

温度、湿度、気圧を表示するだけです。

あとはデータの待ち受けを開始するボタンを配置します。

Jsonを展開するためのクラスを定義します。

    [JsonObject("sensorModel")]
    class Sensor
    {
        [JsonProperty("temperature")]
        public int Temperature { get; set; }
        [JsonProperty("humidity")]
        public int Humidity { get; set; }
        [JsonProperty("pressure")]
        public int Pressure { get; set; }
    }

クラス名は何でもいいですが、パラメータの名前は送信側と合わせる必要があります。

最後にViewModelの処理です。

    public class MainWindowViewModel : BindableBase
    {
        private string _title = "ラズパイモニター";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }
        private int _temperature;
        private int _humidity;
        private int _pressure;
        public int Temperature 
        { 
            get { return _temperature; } 
            set { SetProperty(ref _temperature, value); }
        }
        public int Humidity
        {
            get { return _humidity; }
            set { SetProperty(ref _humidity, value); }
        }
        public int Pressure
        {
            get { return _pressure; }
            set { SetProperty(ref _pressure, value); }
        }

        public DelegateCommand ButtonClickCommand { get; }

        public MainWindowViewModel()
        {
            ButtonClickCommand = new DelegateCommand(() =>
            {
                Thread thread = new Thread(new ThreadStart(() => {
                    try
                    {
                        HttpListener listener = new HttpListener();
                        listener.Prefixes.Add("http://192.168.1.3:8000/");
                        listener.Start();
                        while (true)
                        {
                            HttpListenerContext context = listener.GetContext();
                            HttpListenerRequest req = context.Request;
                            using (StreamReader reader = new StreamReader(req.InputStream, req.ContentEncoding))
                            {
                                string s = reader.ReadToEnd();
                                Sensor sensor = JsonConvert.DeserializeObject<Sensor>(s);
                                Temperature = sensor.Temperature;
                                Humidity = sensor.Humidity;
                                Pressure = sensor.Pressure;
                            }
                            HttpListenerResponse res = context.Response;
                            res.StatusCode = 200;
                            byte[] content = Encoding.UTF8.GetBytes("HELLO");
                            res.OutputStream.Write(content, 0, content.Length);
                            res.Close();
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }));

                thread.Start();

            });
        }
    }

ボタンを押すとHTTPを待ち受け開始し、HTTPを受信したらデータ(Json)を展開しオブジェクト化します。

そして、各パラメータをプロパティに設定します。

動作結果はこうなりました。

うん、想定通り。

【C#】【ピクロス】【ALTSEED】数字入力マスを追加する。

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

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

https://github.com/takishita2nd/Picross

ピクロス解析のヒントとなる数字の入力マスを作成していきます。

イメージとしては、マウスカーソルが上にあると色が変化し、クリックするとパレットを表示する、という感じです。

まずはマスを作成しましょう。

数字を入力するマスのクラスを作成します。

class NumberSquare : ObjectBase
{
    protected int _row;
    protected int _col;
    protected const int setPositionX = 200;
    protected const int setPositionY = 200;
    protected const int fontOffsetX = 19;
    protected const int fontOffsetY = 9;
    private string _value;

    public NumberSquare(int row, int col)
    {
        width = 32;
        height = 32;
        _value = string.Empty;
        _row = row;
        _col = col;
        _x = col * width + setPositionX;
        _y = row * height + setPositionY;

        _backTexture = new asd.TextureObject2D();
        _backTexture.Texture = Resource.GetPicrossTexture();
        _backTexture.Position = new asd.Vector2DF(_x, _y);

        _valueText = new asd.TextObject2D();
        _valueText.Font = Resource.getFont();
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void SetValue(string value)
    {
        _value = value;
        _valueText.Text = _value;
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        if (pos.X > _x && pos.X < _x + width
            && pos.Y > _y && pos.Y < _y + height)
        {
            _backTexture.Texture = Resource.GetSelectedNumberTexture();
        }
        else
        {
            _backTexture.Texture = Resource.GetPicrossTexture();
        }
    }

    public int getValue()
    {
        return int.Parse(_value);
    }
}

これをUIに配置します。

マスのオブジェクトは

List<List<NumberSquare>>

の形で保持します。

一番外のList<>はROWまたはCOLのサイズ分だけ持ち、List<List<>>は入力した数字の数だけ保持します。

これをROW、COLの二つ持ちます。

    private List<List<NumberSquare>> rowNumberSquare = new List<List<NumberSquare>>();
    private List<List<NumberSquare>> colNumberSquare = new List<List<NumberSquare>>();

配置。

        // 数字の入力するマス
        for(int row = 0; row < 10; row++)
        {
            NumberSquare square = new NumberSquare(row, -1);
            asd.Engine.AddObject2D(square.getBackTexture());
            asd.Engine.AddObject2D(square.getTextObject());
            List<NumberSquare> rowList = new List<NumberSquare>();
            rowList.Add(square);
            rowNumberSquare.Add(rowList);
        }
        for (int col = 0; col < 10; col++)
        {
            NumberSquare square = new NumberSquare(-1, col);
            asd.Engine.AddObject2D(square.getBackTexture());
            asd.Engine.AddObject2D(square.getTextObject());
            List<NumberSquare> colList = new List<NumberSquare>();
            colList.Add(square);
            colNumberSquare.Add(colList);
        }

マウスがマスの上にきたときの処理。

        while (asd.Engine.DoEvents())
        {
            asd.Vector2DF pos = asd.Engine.Mouse.Position;
            if(!dialog.IsShow())
            {
                foreach (var rowList in rowNumberSquare)
                {
                    foreach (var s in rowList)
                    {
                        s.UpdateTexture(pos);
                    }
                }
                foreach (var colList in colNumberSquare)
                {
                    foreach (var s in colList)
                    {
                        s.UpdateTexture(pos);
                    }
                }
                foreach (Button button in buttons)
                {
                    button.UpdateTexture(pos);
                }
            }

そして、忘れてはいけないのが、サイズ変更を行ったとき。

サイズ変更を行ったら、それに合わせてListの数も変更しなければいけません。

        dialog.SetAction(() =>
        {
            dialog.Hide();
            int row = dialog.GetRowValue();
            int col = dialog.GetColValue();
            while(row != drawSquares.Count)
            {
                if(drawSquares.Count > row)
                {
                    {
                        // マスの削除
                        var rowList = drawSquares[drawSquares.Count - 1];
                        foreach (var c in rowList)
                        {
                            asd.Engine.RemoveObject2D(c.getBackTexture());
                        }
                        drawSquares.RemoveAt(drawSquares.Count - 1);
                    }

                    {
                        // 数字のマスの削除
                        var rowList = rowNumberSquare[rowNumberSquare.Count - 1];
                        foreach (var s in rowList)
                        {
                            asd.Engine.RemoveObject2D(s.getBackTexture());
                            asd.Engine.RemoveObject2D(s.getTextObject());
                        }
                        rowNumberSquare.RemoveAt(rowNumberSquare.Count - 1);
                    }
                }
                else
                {
                    {
                        // マスの追加
                        List<DrawSquare> rowList = new List<DrawSquare>();
                        for (int c = 0; c < drawSquares[0].Count; c++)
                        {
                            var square = new DrawSquare(drawSquares.Count, c);
                            asd.Engine.AddObject2D(square.getBackTexture());
                            rowList.Add(square);
                        }
                        drawSquares.Add(rowList);
                    }

                    {
                        // 数字のマス追加
                        var square = new NumberSquare(rowNumberSquare.Count, -1);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        asd.Engine.AddObject2D(square.getTextObject());
                        List<NumberSquare> list = new List<NumberSquare>();
                        list.Add(square);
                        rowNumberSquare.Add(list);
                    }
                }
            }
            while(col != drawSquares[0].Count)
            {
                if(drawSquares[0].Count > col)
                {
                    {
                        // マスの削除
                        foreach (var r in drawSquares)
                        {
                            asd.Engine.RemoveObject2D(r[r.Count - 1].getBackTexture());
                            r.RemoveAt(r.Count - 1);
                        }
                    }

                    {
                        // 数字のマスの削除
                        var colList = colNumberSquare[colNumberSquare.Count - 1];
                        foreach (var s in colList)
                        {
                            asd.Engine.RemoveObject2D(s.getBackTexture());
                            asd.Engine.RemoveObject2D(s.getTextObject());
                        }
                        colNumberSquare.RemoveAt(colNumberSquare.Count - 1);
                    }
                }
                else
                {
                    {
                        // マスの追加
                        int rowindex = 0;
                        int colindex = drawSquares[0].Count;
                        foreach (var r in drawSquares)
                        {
                            var square = new DrawSquare(rowindex, colindex);
                            asd.Engine.AddObject2D(square.getBackTexture());
                            r.Add(square);
                            rowindex++;
                        }
                    }

                    {
                        // 数字のマス追加
                        var square = new NumberSquare(-1, colNumberSquare.Count);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        asd.Engine.AddObject2D(square.getTextObject());
                        List<NumberSquare> list = new List<NumberSquare>();
                        list.Add(square);
                        colNumberSquare.Add(list);
                    }
                }
            }
        });

動作はこんな感じになりました。

次回は実際に数字を入力する処理を追加します。

【ラズパイ】ネットワークでセンサーデータを送信する。

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

今回は実際にセンサーの情報をWindows側に送信したいと思います。

ラズパイ側のPythonソースをこのように作成しました。

import json
import urllib.request
import time
from sense_hat import SenseHat

sense = SenseHat()

url = 'http://192.168.1.3:8000'
headers = {
    'Content-Type': 'application/json',
}

while True:
    temp = int(sense.get_temperature())
    hum = int(sense.get_humidity())
    press = int(sense.get_pressure())
    data = {
        'temperature': temp,
        'humidity': hum,
        'pressure': press,
    }
    req = urllib.request.Request(url, json.dumps(data).encode(), headers)
    with urllib.request.urlopen(req) as res:
        body = res.read()
    time.sleep(1)

センサーから温度、湿度、気圧の測定データを取得し、このデータをJson形式にして送信しています。

この処理を1秒周期で実行します。

最近のWebAPIは送受信するデータの量が増えてきているので、どのようなデータ形式も一行の文字列で表現できるJsonを使用するのが今の一般的です。

Windows側(サーバ側)の出力はこうなりました。(受信側のコードは前回から変更していません。)

温度と湿度は、ラズパイ本体からの熱の影響を受けているので、実際の部屋の中の数値とは異なりますが、まぁ、良い感じです。

【C#】【ピクロス】【ALTSEED】実際にサイズを変更する

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

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

https://github.com/takishita2nd/Picross

前回はサイズ変更ダイアログに数字を入力するところまでできましたので、今回は実際にその数字を反映させる処理を作成していきます。

まずは、ダイアログからROWとCOLを取得する処理を追加します。

class Dialog
{
        public int GetRowValue()
        {
            return int.Parse(_rowValue);
        }

        public int GetColValue()
        {
            return int.Parse(_colValue);
        }

これをダイアログを表示する側で使用します。

        dialog.SetAction(() =>
        {
            dialog.Hide();
            int row = dialog.GetRowValue();
            int col = dialog.GetColValue();
            while(row != drawSquares.Count)
            {
                if(drawSquares.Count > row)
                {
                    var rowList = drawSquares[drawSquares.Count - 1];
                    foreach(var c in rowList)
                    {
                        asd.Engine.RemoveObject2D(c.getBackTexture());
                    }
                    drawSquares.RemoveAt(drawSquares.Count - 1);
                }
                else
                {
                    List<DrawSquare> rowList = new List<DrawSquare>();
                    for (int c = 0; c < drawSquares[0].Count; c++)
                    {
                        var square = new DrawSquare(drawSquares.Count, c);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        rowList.Add(square);
                    }
                    drawSquares.Add(rowList);
                }
            }
            while(col != drawSquares[0].Count)
            {
                if(drawSquares[0].Count > col)
                {
                    foreach(var r in drawSquares)
                    {
                        asd.Engine.RemoveObject2D(r[r.Count - 1].getBackTexture());
                        r.RemoveAt(r.Count - 1);
                    }
                }
                else
                {
                    int rowindex = 0;
                    int colindex = drawSquares[0].Count;
                    foreach (var r in drawSquares)
                    {
                        var square = new DrawSquare(rowindex, colindex);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        r.Add(square);
                        rowindex++;
                    }
                }
            }
        });

SetAction()には、ダイアログでOKをクリックしたときに実行される処理をラムダ式で記述しています。

ダイアログを非表示にすると同時にROW、COLを取得し、その値に合わせて実際のピクロスのサイズを変更します。

ROWの値を変えると縦方向にマスが増えたり減ったり、COLの値を変えると横方向に、という感じです。

これはまずはROW、COLが増えたかどうかを判断し処理を変える必要があります。

ROWを変える場合は、マスのLISTオブジェクト

List<List<DrawSquare>> drawSquares

これの一番外のLISTを追加、削除します。

COLを変える場合は内側のLISTにオブジェクトを追加、削除します。

あと、実際に動かしてみて分かったのですが、エンジンにテクスチャなどのオブジェクトを追加する順番によって表示に影響が出る(後に追加した方が上に上書きされる)ので、

それを防ぐために、テクスチャの描画プライオリティを設定する必要がありました。

今回は

マスオブジェクト<<<<<ダイアログ<<パレット

の順番にプライオリティを設定しました。

動作結果はこうなりました。

ようやくここまで来たかって感じです。

次回はピクロス解析のカギとなる数字を入力する部分を作成していきます。

【ラズパイ】ネットワークでデータを送信する。

こんな感じで、ラズパイのデータをWindows PCへ送信させたいと思います。

ラズパイ側はPythonでHATのセンサーにアクセスしているので、Pythonで送信を行います。

Windows側は、言語は何でも良いのですが、今回はC#で書こうと思います。

とりあえず、今回は通信ができるところまでを確認します。

ラズパイ側のソースはこんな感じ。

import json
import urllib.request

url = 'http://192.168.1.3:8000'
data = {
    'foo': 123,
}
headers = {
    'Content-Type': 'application/json',
}

req = urllib.request.Request(url, json.dumps(data).encode(), headers)
with urllib.request.urlopen(req) as res:
    body = res.read()

こちらのソースコードを丸パクリです。

https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217

Windows側のコードはこんな感じです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace http_server
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                HttpListener listener = new HttpListener();
                listener.Prefixes.Add("http://192.168.1.3:8000/");
                listener.Start();
                while (true)
                {
                    HttpListenerContext context = listener.GetContext();
                    HttpListenerRequest req = context.Request;
                    StreamReader reader = new System.IO.StreamReader(req.InputStream, req.ContentEncoding);
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                    HttpListenerResponse res = context.Response;
                    res.StatusCode = 200;
                    byte[] content = Encoding.UTF8.GetBytes("HELLO");
                    res.OutputStream.Write(content, 0, content.Length);
                    res.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }
    }
}

ホントにデータを送受信するだけのコードで、エラーとかは全く考慮していません。

Windows側のプログラムを先に実行し、その後ラズパイのコードを実行すると、Windows側のコンソールにこんな感じで出力されます。

これをカスタマイズすればセンサーの情報もWindows PCに送信できそうです。

【C#】【ピクロス】【ALTSEED】パレットから数字を入力する

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

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

https://github.com/takishita2nd/Picross

パレットの数字をクリックすることでダイアログの数字を入力する処理を作っていきます。

主にDialogクラスの実装です。

class Dialog
{
    private string _rowValue = "10";
    private string _colValue = "10";
    private TextBox _selectedTextBox = null;
    private string _selectedValue = string.Empty;

        public void OnClick(asd.Vector2DF pos)
        {
            if (_palette.IsShow() == false)
            {
                if (_rowText.isClick(pos))
                {
                    _selectedTextBox = _rowText;
                    _selectedValue = _rowValue;
                    _palette.Show(pos);
                }
                if (_colText.isClick(pos))
                {
                    _selectedTextBox = _colText;
                    _selectedValue = _colValue;
                    _palette.Show(pos);
                }
                if (_button.isClick(pos))
                {
                    _button.OnClick();
                }
            }
            else
            {
                if (_palette.IsClick(pos))
                {
                    string v = _palette.GetClickValue(pos);
                    _selectedValue = updateTextValue(_selectedTextBox, _selectedValue, v);
                    if (_selectedTextBox.Equals(_rowText))
                    {
                        _rowValue = _selectedValue;
                    }
                    else
                    {
                        _colValue = _selectedValue;
                    }
                }
                else
                {
                    _palette.Hide();
                    _selectedTextBox = null;
                    _selectedValue = string.Empty;
                }
            }
        }

        private string updateTextValue(TextBox textBox, string value, string v)
        {
            string text = string.Empty;
            switch (v)
            {
                case Palette.CODE.BS:
                    if(value.Length != 0)
                    {
                        text = value.Remove(value.Length - 1);
                    }
                    break;
                case Palette.CODE.CLR:
                    text = string.Empty;
                    break;
                default:
                    if(value.Length < 2)
                    {
                        text = value + v;
                    }
                    else
                    {
                        text = value;
                    }
                    break;
            }
            textBox.SetText(text);
            return text;
        }
    }

テキストボックスがROWとCOLの二つがあるので、テキストボックスをクリックしたときに、どちらをクリックしたかを記憶しておきます。

パレットがクリックされた場合、何がクリックされたかをパレットから取得します。

その値を確認し、その数字をテキストボックスの値に文字列追加していきます。

しかし、今のところ、数字は2桁までとしておきます。

なので、桁が2桁オーバーしたり、0桁以下にならないようにガードかけておきます。

あ、0を入力できないや。

次回までに修正しておきまーす。

茨城県から海産物の干物が届きました。

ショッピングサイトを調べてみると、このコロナの影響で、行き場を失ってしまった食材は「復興福袋」として、格安で売り出されています。

オイラは比較的安価なこちらの商品を購入しました。


茨城県の業者なんですが、規格外の干物を格安で販売していると言うことです。

届きました。

これで2300円ですぜ。

安くないですか??

内容量はこちら。

この中身は業者お任せでこちらからは指定できないようです。

さっそく解凍して焼いて食べてみました。

これはサンマ?サバ?

フライパンで焼いたのですが。

まぁいいや。良いお酒のおつまみになりました。

でもご飯のお供としても十分美味しいです。

これだけあれば、ご飯のおかずも飽きずに食べられそうです。

最近のコロナの影響で、こういった地方の食材が行き場を失って消費されずに廃棄されてしまうということが起きてしまっていると言うことです。

こういった食材は結構Yahoo!ショッピングとか楽天市場で多く出品されています。

こういった食材ロスを無くすために、お金に余裕のある人は積極的に購入して取り寄せて消費するというのも良い貢献だと思います。


サフォーク種のホゲット肉を食らう。

元々はこのツイートからでした。

でかちょーさん、ごみぶちさんありがとうございます。

解凍しました。

今回はこの半分を頂きました。

とりあえず、サフォークということで純粋に焼肉で。

サフォーク種なんて道民でも滅多に口にできない高級品種ですからね。

これで2800円なんて、いきなり!ステーキと比較しても安い方よ。

部位は確かロースだったと思うんですが、焼くと思った以上に脂が染み出てきます。

これは美味しそうだ。

いや、実際、美味しかった。

ビールが進む。

美味しく頂きました。

さて、まだ半分残っているんだけど、どうやって食べようかな。

オススメの食べ方教えてください。

※追記

このお肉はラムよりも上位である「ホゲット」と呼ばれているみたいです。

自分、ぼっちですが何か?