はじめてのYaneSDK.NETその2

前回は「Hello, World」が飛び回っているだけでしたが、操作ができないとゲームになりません。今回はキーボード入力について紹介します。
前回のサンプルとほとんど同じですが、キーボード処理が追加されています。カーソルキーで上下左右に移動します。スペースキーを押すと加速します。

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

using YD = Yanesdk.Draw;  // 描画関連
using YI = Yanesdk.Input; // 入力デバイス関連

namespace Sample2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int x = 0;
        int y = 0;
        YD.Win32Window window;
        YD.GlTexture texture;
        YI.Key1 key;

        private void Form1_Load(object sender, EventArgs e)
        {
            // 初期処理

            // 描画サイズは320x240
            ClientSize = new Size(320, 240);
            // PictureBoxをDockStyle.Fillで貼り付けている
            // PictureBox上に描画
            window = new YD.Win32Window(pictureBox1.Handle);
            // Texture作成時はScreen.Selectを呼ぶ
            window.Screen.Select();
            // ゴシック(0がゴシック、明朝は1)、32ポイントのフォントを読み込み
            YD.Font font = new YD.Font();
            font.Load(0, 32);
            // フォント色は赤
            font.SetColor(255, 0, 0);
            // 描画用のテクスチャを用意
            texture = new YD.GlTexture();
            // カラーキーは座標(0, 0)の色とする
            texture.SetColorKeyPos(0, 0);
            // Hello, Worldの文字をテクスチャに貼り付ける
            texture.SetSurface(font.DrawBlended("Hello, World"));

            // キー入力に対応する
            key = new YI.Key1();
        }

        private void OnTick(object sender, EventArgs e)
        {
            // TimerクラスのTickイベント
            // 定期的に呼ばれる

            YD.Screen scr = window.Screen;
            // 描画はScreen.Select〜Updateで挟む
            scr.Select();

            // 画面を白でクリア
            scr.SetClearColor(255, 255, 255);
            scr.Clear();

            // アルファ転送ON
            scr.BlendSrcAlpha();
            // テクスチャを描画(Hello, World)
            scr.Blt(texture, x, y);

            // ここからがキー処理関連

            // キーの入力状態を更新する
            // 通常はフレーム毎に必ず呼ぶ
            key.Update();

            // key.IsPress (no)でキーが押されているかどうか判定します
            // Key1の場合、noは0-ESC,1-TOP,2-BOTTOM,3-LEFT,4-RIGHT,5-SPACE,6-ENTER
            // 詳細はkey.csを見てください

            int dx, dy, speed;
            dx = dy = 0;

            // スペースを押すと通常の3倍の速度
            speed = 2;
            if (key.IsPress(5))
                speed *= 3;
            
            // 斜めが早いのは仕様(^^;
            if (key.IsPress(1)) dy = -speed;    // TOP
            if (key.IsPress(2)) dy =  speed;    // BOTTOM
            if (key.IsPress(3)) dx = -speed;    // LEFT
            if (key.IsPress(4)) dx =  speed;    // RIGHT

            // キーを3つ以上押すと認識されない気が・・・SDLの制限?
            // 取りあえず加速中は斜め移動不可な仕様とごまかしてみる

            // ウィンドウからはみ出さないようにする
            if (x + dx < 0 || x + dx > pictureBox1.Width - texture.Width)
                dx = 0;
            if (y + dy < 0 || y + dy > pictureBox1.Height - texture.Height)
                dy = 0;

            x += dx;
            y += dy;

            // 描画終了
            scr.Update();
        }
    }
}

密かにジョイスティックにも対応しているハズですが、手元に無いので確認していません。(^^;