【C#】【ALTSEED】【数独】マウス操作をいろいろ

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

今回はマウス操作を試してみます。

マウスカーソルの位置をリアルタイムで表示、さらに左クリックするとその座標を表示する、という感じでやってみます。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("数独解析ツール", 1000, 800, new asd.EngineOption());

            // 下地
            var background = new asd.GeometryObject2D();
            asd.Engine.AddObject2D(background);
            var bgRect = new asd.RectangleShape();
            bgRect.DrawingArea = new asd.RectF(0, 0, 1000, 800);
            background.Shape = bgRect;

            // テクスチャー
            asd.Texture2D texture = asd.Engine.Graphics.CreateTexture2D("squares.png");

            // マス
            int offsetX = 10;
            int offsetY = 10;
            var square = new asd.TextureObject2D();
            square.Position = new asd.Vector2DF(offsetX, offsetY);
            square.Texture = texture;
            asd.Engine.AddObject2D(square);

            int fontOffsetX = 19;
            int fontOffsetY = 9;
            var font = asd.Engine.Graphics.CreateFont("number.aff");
            var obj = new asd.TextObject2D();
            obj.Font = font;
            obj.Position = new asd.Vector2DF(offsetX + fontOffsetX, offsetY + fontOffsetY);
            obj.Text = "1";
            asd.Engine.AddObject2D(obj);

            var obj2 = new asd.TextObject2D();
            obj2.Font = font;
            obj2.Position = new asd.Vector2DF(64 + offsetX + fontOffsetX, 64 + offsetY + fontOffsetY);
            obj2.Text = "2";
            asd.Engine.AddObject2D(obj2);

            var mouseXText = new asd.TextObject2D();
            mouseXText.Position = new asd.Vector2DF(700, 600);
            mouseXText.Font = font;
            asd.Engine.AddObject2D(mouseXText);

            var mouseYText = new asd.TextObject2D();
            mouseYText.Position = new asd.Vector2DF(700, 670);
            mouseYText.Font = font;
            asd.Engine.AddObject2D(mouseYText);

            var mouseHXText = new asd.TextObject2D();
            mouseHXText.Position = new asd.Vector2DF(800, 600);
            mouseHXText.Font = font;
            asd.Engine.AddObject2D(mouseHXText);

            var mouseHYText = new asd.TextObject2D();
            mouseHYText.Position = new asd.Vector2DF(800, 670);
            mouseHYText.Font = font;
            asd.Engine.AddObject2D(mouseHYText);


            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                mouseXText.Text = string.Format("{0}", pos.X);
                mouseYText.Text = string.Format("{0}", pos.Y);

                if(asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    mouseHXText.Text = string.Format("{0}", pos.X);
                    mouseHYText.Text = string.Format("{0}", pos.Y);
                }

                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

なかなか良さそうです。

じゃあ、次回からUIをもっと詰めて、クラス構成を考えてみましょう。

相変わらず体調がよろしくないのです。

午前中はなんとか動けるのですが、

午後になると耳鳴りと目の疲れが出てきてほとんど頭が働かなくなります。

今の1日のスケジュールはこんな感じ。

  • 午前6時 起床
  •  ~  朝飯・テレビ
  • 午前8時
  •  ~  パソコン作業
  • 正午  昼飯
  •  ~  主にゲーム
  •     ※この当たりから耳鳴りと目の疲れが出てくる
  • 午後4時 お風呂
  •  ~  テレビ
  • 午後5時 夕食
  •  ~  主に動画とか
  • 午後9時 就寝

こうやって見ると、健康的な生活を過ごしていると思われますが、

生産的な作業が半日しかできていない状態です。

原因は分かっているんですよ。

首と肩のこりです。

肩の方はだいぶ調子が良くなったのですが、

首の方が辛いです。

一生懸命首の筋肉を伸ばしているんですけどね。

ストレッチってヤツです。

今はとにかくストレッチを続けて、症状が改善するのを待つしか無くて。

まぁ、焦らず頑張ります。

【C#】【ALTSEED】【数独】文字列を表示する

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

実際に文字、というか、数字を画面に表示するのですが、

ゲームライブラリを使用しているので、普通に文字を表ずる事ができないのですよ。

このライブラリではフォントジェネレータというツールを使って、使用する文字を別ファイルで用意する必要があります。

こんなテキストファイルを作成して、

こんな感じでフォントファイルを作成します。

このとき生成されるaffファイルとpngファイルを実行プログラムと同じ場所に設置します。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("数独解析ツール", 1000, 800, new asd.EngineOption());

            // 下地
            var background = new asd.GeometryObject2D();
            asd.Engine.AddObject2D(background);
            var bgRect = new asd.RectangleShape();
            bgRect.DrawingArea = new asd.RectF(0, 0, 1000, 800);
            background.Shape = bgRect;

            // テクスチャー
            asd.Texture2D texture = asd.Engine.Graphics.CreateTexture2D("squares.png");

            // マス
            int offsetX = 10;
            int offsetY = 10;
            var square = new asd.TextureObject2D();
            square.Position = new asd.Vector2DF(offsetX, offsetY);
            square.Texture = texture;
            asd.Engine.AddObject2D(square);

            var font = asd.Engine.Graphics.CreateFont("number.aff");
            var obj = new asd.TextObject2D();
            obj.Font = font;
            obj.Position = new asd.Vector2DF(100, 100);
            obj.Text = "1357";
            asd.Engine.AddObject2D(obj);

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

とりあえず、数字を表示することは問題なさそう。

あとは、フォントサイズと表示位置を微調整する。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("数独解析ツール", 1000, 800, new asd.EngineOption());

            // 下地
            var background = new asd.GeometryObject2D();
            asd.Engine.AddObject2D(background);
            var bgRect = new asd.RectangleShape();
            bgRect.DrawingArea = new asd.RectF(0, 0, 1000, 800);
            background.Shape = bgRect;

            // テクスチャー
            asd.Texture2D texture = asd.Engine.Graphics.CreateTexture2D("squares.png");

            // マス
            int offsetX = 10;
            int offsetY = 10;
            var square = new asd.TextureObject2D();
            square.Position = new asd.Vector2DF(offsetX, offsetY);
            square.Texture = texture;
            asd.Engine.AddObject2D(square);

            int fontOffsetX = 19;
            int fontOffsetY = 9;
            var font = asd.Engine.Graphics.CreateFont("number.aff");
            var obj = new asd.TextObject2D();
            obj.Font = font;
            obj.Position = new asd.Vector2DF(offsetX + fontOffsetX, offsetY + fontOffsetY);
            obj.Text = "1";
            asd.Engine.AddObject2D(obj);

            var obj2 = new asd.TextObject2D();
            obj2.Font = font;
            obj2.Position = new asd.Vector2DF(64 + offsetX + fontOffsetX, 64 + offsetY + fontOffsetY);
            obj2.Text = "2";
            asd.Engine.AddObject2D(obj2);

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

うん、いいんじゃないでしょうか。

【料理】【味噌消費】大根と豚バラブロックのみそ煮込み

レシピはこちらを参照しました。(クラシル)

https://www.kurashiru.com/recipes/e7ad9350-1ed7-4db3-9972-e3449ed0669e

まずは材料の仕込み。

大根とショウガ。

豚バラ肉は焼き色を付けます。

これを炊飯器に入れて、味付け。

炊飯スイッチオン!

あれ?2時間経っても炊飯が終わらないぞ?

炊飯完了条件のスイッチが入らなかったのかも。

何が違うんや。

まぁ、いいや。

オープン。

大根も豚肉も柔らかく煮込まれました。

そりゃあ、2時間も煮込めば(ry

これはお酒が飲みたくなる。

太るからやらないけど。

【C#】【Altseed】【数独】マスを作成する

とりあえず、下地となるマスを書いてみます。

最初考えたのは、

こんな画像を用意して、9×9に並べてみました。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("数独解析ツール", 1000, 800, new asd.EngineOption());

            // 下地
            var background = new asd.GeometryObject2D();
            asd.Engine.AddObject2D(background);
            var bgRect = new asd.RectangleShape();
            bgRect.DrawingArea = new asd.RectF(0, 0, 1000, 800);
            background.Shape = bgRect;

            // テクスチャー
            asd.Texture2D texture = asd.Engine.Graphics.CreateTexture2D("square.png");

            // マス
            int offsetX = 10;
            int offsetY = 10;
            int width = 64;
            int height = 64;

            for(int row = 0; row < 9; row++)
            {
                for(int col = 0; col < 9; col++)
                {
                    var square = new asd.TextureObject2D();
                    square.Position = new asd.Vector2DF(width * row + offsetX, height * col + offsetY);
                    square.Texture = texture;
                    asd.Engine.AddObject2D(square);
                }
            }


            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

イメージとしては上の画像をテクスチャとして並べただけです。

スクショでは分かりませんが、内側の線が全て太く描画されてしまいました。

これは、ちょっと見づらいですね・・・

よし、9×9マスの画像を作成して、1枚のテクスチャーにしよう。

上の画像を修正して、

これを一つのテクスチャオブジェクトに貼り付けます。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("数独解析ツール", 1000, 800, new asd.EngineOption());

            // 下地
            var background = new asd.GeometryObject2D();
            asd.Engine.AddObject2D(background);
            var bgRect = new asd.RectangleShape();
            bgRect.DrawingArea = new asd.RectF(0, 0, 1000, 800);
            background.Shape = bgRect;

            // テクスチャー
            asd.Texture2D texture = asd.Engine.Graphics.CreateTexture2D("squares.png");

            // マス
            int offsetX = 10;
            int offsetY = 10;
            var square = new asd.TextureObject2D();
            square.Position = new asd.Vector2DF(offsetX, offsetY);
            square.Texture = texture;
            asd.Engine.AddObject2D(square);


            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

うん、いいんじゃないでしょうか。

次は文字の作成をやってみます。

【C#】openTKを使用してみる

前回はAltseedというライブラリを使用してみたのですが、

このライブラリって調べてみると、構造はシンプルでゲーム制作に必要な機能は一通り揃っている(と思う)のですが、

シンプルすぎるというか、基本的なグラフィックス機能が少々貧弱な気がします。

例えば、四角形を表示させる場合、色の指定はできず、基本的に画像をテクスチャとして表示する、というイメージです。

なので、もうちょっと調べてみました。

ゲームライブラリにこだわらず、グラフィックスライブラリという括りで検索してみると、openTKというライブラリを発見しました。

https://opentk.net/index.html

これはopenGLのラッパーのライブラリですね。

openGLの機能はほぼほぼ使用できると考えていいようです。

NuGetに登録されているのでNuGetからopenTKを検索するとダウンロードして参照できるようになります。

サンプルコードを入力してみました。

https://masuqat.net/programming/csharp/OpenTK00-03.php

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;

namespace OpenTK_sample
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            using (Game window = new Game())
            {
                window.Run(30.0);
            }
        }
    }

    class Game : GameWindow
    {
        public Game() : base(800, 600, GraphicsMode.Default, "0-3:GameWindow")
        {
        }

        //ウィンドウの起動時に実行される。
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            GL.ClearColor(Color4.Black);
            GL.Enable(EnableCap.DepthTest);
        }

        //ウィンドウのサイズが変更された場合に実行される。
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);

            GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
            GL.MatrixMode(MatrixMode.Projection);
            Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, (float)Width / (float)Height, 1.0f, 64.0f);
            GL.LoadMatrix(ref projection);
        }

        //画面描画で実行される。
        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            GL.MatrixMode(MatrixMode.Modelview);
            Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
            GL.LoadMatrix(ref modelview);

            GL.Begin(BeginMode.Quads);

            GL.Color4(Color4.White);                            //色名で指定
            GL.Vertex3(-1.0f, 1.0f, 4.0f);
            GL.Color4(new float[] { 1.0f, 0.0f, 0.0f, 1.0f });  //配列で指定
            GL.Vertex3(-1.0f, -1.0f, 4.0f);
            GL.Color4(0.0f, 1.0f, 0.0f, 1.0f);                  //4つの引数にfloat型で指定
            GL.Vertex3(1.0f, -1.0f, 4.0f);
            GL.Color4((byte)0, (byte)0, (byte)255, (byte)255);  //byte型で指定
            GL.Vertex3(1.0f, 1.0f, 4.0f);

            GL.End();

            SwapBuffers();
        }
    }
}

これだけではちょっと難しそうだけど、必要なものだけ使用すればうまくいきそう。

ただ、一番の問題は座標系。

openGLの世界では、(0,0)がウインドウの中心にあり、左上が(-1.0-1.0)で右下が(1.0,1.0)になる。

これはこれで扱いが難しい。

うーん、ハードルが高い・・・。

CGを使うにはちょうどいいかもしれないけどね。

【C#】Altseedを導入する

数独解析ツールをGUI化するにあたって、

まずはAltseedライブラリが使用できることを確認します。

まずは、以下のサイトからライブラリをダウンロード。

https://altseed.github.io/index.html

zipファイルを解凍すると、ドキュメント、ライブラリ本体、サンプルプログラムなどが入っています。

基本的にドキュメントの中にあるイントロダクションを参照すれば良いのですが、内容が古いのか、この通りにやっても上手くいかないので、手順をまとめておきます。

あ、開発環境はWindows10、Visual Studio 2019です。

まず、Visual Studio 2019を立ち上げでプロジェクトを新規作成します。

作成するプロジェクトの種類は.NET Frameworkのコンソールアプリです。

プロジェクトを作成したら、参照の追加で、Altseed.dllを追加します。

Altseed_core.dllは、たぶんネイティブのDLLなので、C#から参照できません。プロジェクトをビルドした後、実行ファイルと同じフォルダにコピーしてください。

サンプルプログラムは以下の通りです。

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

namespace sudokuGUI
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Altseedを初期化する。
            asd.Engine.Initialize("Empty", 640, 480, new asd.EngineOption());

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                // Altseedを更新する。
                asd.Engine.Update();
            }

            // Altseedを終了する。
            asd.Engine.Terminate();
        }
    }
}

実行すると、こうなります。

サブスクリプションを見直した結果

こちらの記事でサブスクの利用状況を洗い出したのですが、

見直した結果、以下の様になりました。

  • iCloud 130円
  • ガルパPASS 480円
  • Office365 Solo 1284円
  • Conoha 1925円
  • ブックウォーカー 720円
  • TechCommit 1100円
  • プリコネR 700円
  • Yahoo!プレミアム 508円
  • Googleストレージ 250円
  • Amazon Music Unlimited 780円
  • ナビタイム 400円
  • DropBox 1650円
  • Dアニメストア 440円
  • タイムズカーシェア 1540円
  • radikoプレミアム 385円
  • ATOKパスポート 550円
  • PlayStation Network 850円

合計9424円。

2988円の削減が見込めます。

1万円以下の目標達成。

大きなポイントは、DropBoxを解約したこと。

保存しているメディアファイルのサイズが思ったより少なかったので、oneDriveの1TBに収まりましたので、DropBoxは不要になりました。

もし、サイズが足りなくなっても、oneDriveに1TB追加で1124円で容量追加できます。

DropBoxを2TB利用するよりも安上がりです。

あと、マガジンウォーカーがサービス終了したので、その代替サービスとなるブックウォーカー読み放題を使用開始しました。

月刊コミックは今まで通り読むことができますし、新たにきらら関連雑誌も読み放題に含まれるようになりました。

ただし、週刊アスキーが読み放題で無くなってしまった・・・

そして、一番残念なのが、iOSのリーダーアプリの使い勝手が絶望的に悪い。

一度ダウンロードしてしまえばマシになるのですが、それまでの操作感が最悪。

Webで見た方が良いのか、アプリで見た方が良いのか、いろいろ試してみたいと思います。

【C#】【数独】数独解析ツールGUI化計画

さて、数独解析のアルゴリズム部分は完成して、大抵の問題は解くことができました。

これをもっと使いやすいものにしたい。

CUIではなく、GUIに。

C#はWindows FormsとかWPFというGUIがありますが、多分、これをそのまま使用すると、プルダウンリストが画面に大量に配置することになり、見た目が汚くなると思う。

そういうのは嫌なので、そういったコントロールは使用せずに、実現したいと思う。例えばゲームエンジンのGUIを使うとか。

C#でゲームエンジンというと、真っ先に思い浮かぶのはUnity。

でも、Unityは違うと思うんすよね。

Unityは3Dは得意だけど、2Dはあまり得意としていない(できなくは無いけど)

そこで思い出したのが、昔調べたゲームライブラリで、Altseedというライブラリがあります。

https://altseed.github.io/index.html

C++、C#、Javaで使用できるライブラリで、クロスプラットフォームでも使用できます。

もっと調べれば、他にライブラリがあるかもしれないけど、できることは大差ないので、これで行こうと思う。

今後はこのライブラリを使って数独解析ツールのGUI化に乗り出します。