はじめての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(); } } }
密かにジョイスティックにも対応しているハズですが、手元に無いので確認していません。(^^;