//usingディレクティブで名前空間の参照を簡単にします。
using System;
using System.Drawing;
using System.Windows.Forms;
using Wakaba;

namespace Game
{
    class Game
    {
        //星の数
        private const int STAR_MAX = 50;
        //星の移動速度
        private const int STAR_SPEED = 4;
        //星の回転速度
        private const int STAR_ROLL_SPEED = 8;

        private struct StarPos
        {
            //X座標
            public int X;
            //Y座標
            public int Y;
            //X移動量
            public int AddX;
            //Y移動量
            public int AddY;
        }

        private const int MAPCHIP_SIZE = 32;
        //スクロールスピード
        private const int SCROLL_SPEED = 4;

        //fps計測用
        private static int mintFps;
        //フレームスキップ計測用
        private static int mintSkip;

        //オブジェクト変数を宣言します。
        private static Wakaba.GameTimer t;
        private static Helper w;

        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                Random objRnd = new Random();
                int intRnd;
                int intScroll = 0;

                int intRoll = 0;
                StarPos[] Position = new StarPos[STAR_MAX + 1];

                int intBackFps=0;
                int intBackSkip=0;

                //オブジェクト変数をインスタンス化します。
                w = new Helper();

                //若葉ヘルパーを初期化します。
                w.Initialize();

                //fps表示用スプライトを作成する
                w.SpriteCreate("fps", 128, 32);
                w.SpritePosition("fps", 0, 0, 0);
                w.SpriteShow("fps");

                w.SpriteCreate("マップチップ", MyGame1.Properties.Resources.map, Helper.TransparentColor.None);

                w.SpriteCreate("背景1", 640, 480);
                w.SpriteShow("背景1");

                w.SpriteCreate("背景2", 640, 480);
                w.SpriteShow("背景2");

                //マップチップを作成する
                for (int i = 0; i <= 14; i++)
                {
                    for (int j = 0; j <= 19; j++)
                    {
                        intRnd = objRnd.Next(0, 3);
                        w.SpriteCopy("背景1", (short)(j * MAPCHIP_SIZE), (short)(i * MAPCHIP_SIZE), "マップチップ", intRnd * MAPCHIP_SIZE, 0, MAPCHIP_SIZE, MAPCHIP_SIZE);
                    }
                }
                w.SpriteCopy("背景2", 0, 0, "背景1", 0, 0, 640, 480);

                //星を作成する
                w.SpriteCreate("星", MyGame1.Properties.Resources.star, Helper.TransparentColor.PictureTopLeft);
                for (int i = 1; i <= STAR_MAX; i++)
                {
                    w.SpriteCreate("星" + i, "星", 0, 0, 64, 64);
                    w.SpriteHitAdd("星" + i, "当り星", 0, 0, 64, 64);

                    objRnd = new Random(i);
                    Position[i].X = objRnd.Next(0, 640 - 64);
                    Position[i].Y = objRnd.Next(0, 480 - 64);
                    Position[i].AddX = STAR_SPEED;
                    Position[i].AddY = STAR_SPEED;

                    w.SpritePosition("星" + i, i, Position[i].X, Position[i].Y);
                    w.SpriteTransparent("星" + i, 128);

                    w.SpriteShow("星" + i);
                }

                //fps計測タイマー設定
                t = new Wakaba.GameTimer();
                t.Tick += new GameTimer.TickEventHandler(t_Tick);
                t.Interval = 1000;
                t.TimerStart();

                do
                {
                    //スクリーン変更を判定する
                    if (w.KeyPush(Helper.KeyCodes.CodeZ))
                    {
                        w.ScreenChange(Helper.ScreenMode.Full);
                    }
                    else if (w.KeyPush(Helper.KeyCodes.CodeX))
                    {
                        w.ScreenChange(Helper.ScreenMode.Window);
                    }

                    //星を移動する
                    for (int j = 1; j <= STAR_MAX; j++)
                    {

                        Helper.SpriteInfo info = w.SpriteInformation("星" + j);

                        if (info.X < 0)
                        {
                            Position[j].AddX = STAR_SPEED;
                        }

                        if (640 - 64 < info.X)
                        {
                            Position[j].AddX = -STAR_SPEED;
                        }

                        if (info.Y < 0)
                        {
                            Position[j].AddY = STAR_SPEED;
                        }

                        if (480 - 64 < info.Y)
                        {
                            Position[j].AddY = -STAR_SPEED;
                        }

                        Position[j].X += Position[j].AddX;
                        Position[j].Y += Position[j].AddY;

                        w.SpriteRotation("星" + j, intRoll);
                        w.SpritePosition("星" + j, j, Position[j].X, Position[j].Y);
                    }

                    if (intRoll > 360)
                    {
                        intRoll = 0;
                    }
                    else
                    {
                        intRoll += STAR_ROLL_SPEED;
                    }

                    //背景をスクロールする
                    w.SpritePosition("背景1", STAR_MAX + 1, intScroll, 0);
                    w.SpritePosition("背景2", STAR_MAX + 1, intScroll - 640, 0);

                    intScroll += SCROLL_SPEED;
                    if (intScroll > 640)
                    {
                        intScroll = 0;
                    }

                    //fps表示
                    if (mintFps == intBackFps & mintSkip == intBackSkip)
                    {
                    }
                    else
                    {
                        string msg = "fps" + mintFps + " skip" + mintSkip;

                        w.SpriteFillColor("fps");
                        w.SpriteText("fps", msg, 0, 0, "MS ゴシック", 16, FontStyle.Bold, Brushes.Black);

                        intBackFps = mintFps;
                        intBackSkip = mintSkip;
                    }

                    w.ScreenRefresh(true);
                }

                while (!w.WindowClosing & !w.KeyPush(Helper.KeyCodes.CodeEscape));

                w.ScreenChange(Helper.ScreenMode.Window);

            }
            catch (Exception ex)
            {
                //エラーメッセージを表示します。
                MessageBox.Show(ex.Message + ex.StackTrace);
            }

            //若葉ヘルパーのオブジェクトを破棄します。
            t.Dispose();
            w.Dispose();
        }

        static void t_Tick()
        {
            //fps表示
            if (w != null)
            {

                mintFps = w.ScreenFpsCount;
                mintSkip = w.ScreenFpsSkipCount;

                w.ScreenFpsCount = 0;
                w.ScreenFpsSkipCount = 0;
            }
        }
    }
}