using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace DirectX_BallExample
{
    public partial class Form1 : Form
    {
        private Device device;
        private Sprite sprite;

        private MyCharacter mychar;
        private BombCollection bombcollection;
        private Texture texture;

        public Form1()
        {
            // 自身のフォームの大きさを設定
            InitializeComponent();

            // 初期化パラメータ
            PresentParameters pparam = new PresentParameters();
            pparam.Windowed = true;
            pparam.SwapEffect = SwapEffect.Discard;            

            // デバイスオブジェクトの作成
            device = new Device(
                    0, DeviceType.Hardware, this,
                    CreateFlags.SoftwareVertexProcessing,
                    pparam
            );

            // スプライト作成
            sprite = new Sprite(device);

            // その他、このゲームで必要とするオブジェクト
            // 自機
            mychar = new MyCharacter(device, pparam.BackBufferWidth, pparam.BackBufferHeight);
            // ミサイル
            bombcollection = new BombCollection(device, pparam.BackBufferWidth, pparam.BackBufferHeight);
            // 背景画像
            texture = Texture.FromBitmap(device,DirectX_BallExample.Properties.Resources.backimage,
                Usage.None, Pool.Managed);

            // タイマー設定
            timer1 = new Timer();
            timer1.Interval = 100;
            timer1.Enabled = true;
            timer1.Tick += new System.EventHandler(this.timer1_Tick);

        }

        protected void Draw()
        {
            // 各種描画
            device.Clear(ClearFlags.Target, Color.White, 0, 0);

            device.BeginScene();

            sprite.Begin(SpriteFlags.AlphaBlend);

            // 背景
            sprite.Draw2D(texture, new Point(0, 0), 0, new Point(0, 0), Color.White);
            // 自機描画
            mychar.DrawMychar(sprite);
            // ミサイル描画
            bombcollection.DrawBomb(sprite);

            sprite.End();

            device.EndScene();

            device.Present();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Draw();
        }

        private const int unit_move = 5;

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // 自機を動かす
            switch (e.KeyCode)
            {
                case Keys.Left:
                    // 左移動
                    mychar.MoveX(-unit_move);
                    break;
                case Keys.Right:
                    // 右移動
                    mychar.MoveX(+unit_move);
                    break;
                case Keys.Space:
                    // ミサイル発射
                    bombcollection.AddBomb(mychar.CenterTop);
                    break;

            }
            Draw();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // ミサイルを動かす
            bombcollection.MoveBomb();
            Draw();
        }


    }
}