IMathLib-ソースコード-

  • pocket
  • はてなブックマーク

#ifndef IMATHLIB_H_MEDIA_INPUT_HPP
#define IMATHLIB_H_MEDIA_INPUT_HPP

#include "IMathLib/math/liner_algebra/vector.hpp"

namespace iml {
	namespace ml {

		// ボタン入力の基本クラス
		class button_input {
			friend class mouse;
			friend class keyboard;

			bool	push_m;			// 押している
			bool	trigger_m;		// 押した瞬間
			bool	release_m;		// 離した瞬間

			// 次の状態に遷移するための更新処理
			void update() {
				// トリガー系の変数を初期化
				if (this->trigger_m) this->trigger_m = false;
				else if (this->release_m) this->release_m = false;
			}
			// key downイベント
			void key_down() {
				this->trigger_m = true;
				this->push_m = true;
			}
			// key upイベント
			void key_up() {
				this->release_m = true;
				this->push_m = false;
			}
		public:
			constexpr button_input() : push_m(false), trigger_m(false), release_m(false) {}

			// 各種状態の取得
			bool push() const { return this->push_m; }
			bool trigger() const { return this->trigger_m; }
			bool release() const { return this->release_m; }

			// 2つのボタンに関する判定
			friend constexpr button_input operator+(const button_input& lhs, const button_input& rhs) {
				button_input temp;
				temp.push_m = lhs.push_m && rhs.push_m;
				temp.trigger_m = (lhs.push_m && rhs.trigger_m) || (lhs.trigger_m && rhs.push_m);
				temp.trigger_m = (!lhs.push_m && rhs.release_m) || (lhs.release_m && !rhs.push_m);
				return temp;
			}

			friend bool event();
		};


		// マウスのクラス
		class mouse {
		public:
			static inline button_input		l;				// 左ボタン
			static inline button_input		r;				// 右ボタン
			static inline button_input		m;				// 中央ボタン
		private:
			static inline vector2<int_t>	pos_m;			// 現在のマウスポインタの座標
			static inline vector2<int_t>	mov_m;			// 前回からの移動量
			static inline int_t				wheel_h_m;		// 水平ホイール
			static inline int_t				wheel_v_m;		// 垂直ホイール

			// ボタン情報の更新受付を開始する
			static void update() {
				mouse::l.update();
				mouse::r.update();
				mouse::m.update();
				mouse::mov_m[0] = 0;
				mouse::mov_m[1] = 0;
				mouse::wheel_h_m = 0;
				mouse::wheel_v_m = 0;
			}
		public:
			static const vector2<int_t>& pos() { return mouse::pos_m; }
			static const vector2<int_t>& mov() { return mouse::mov_m; }
			static const int_t& wheel_h() { return mouse::wheel_h_m; }
			static const int_t& wheel_v() { return mouse::wheel_v_m; }

			friend bool event();
		};

		// キーボードの構造体
		class keyboard {
			static inline bool				scancode_m = true;		// スキャンコードを用いるかのフラグ
			static inline std::string		input_text_m;			// 入力されたテキスト
			static inline std::string		editting_text_m;		// 編集中のテキスト
			static inline Sint32			editting_cursor_m;		// 編集中のテキストへのカーソル
		public:
			// 各種キーボード入力
			static inline button_input		key_a;				// 各英語
			static inline button_input		key_b;
			static inline button_input		key_c;
			static inline button_input		key_d;
			static inline button_input		key_e;
			static inline button_input		key_f;
			static inline button_input		key_g;
			static inline button_input		key_h;
			static inline button_input		key_i;
			static inline button_input		key_j;
			static inline button_input		key_k;
			static inline button_input		key_l;
			static inline button_input		key_m;
			static inline button_input		key_n;
			static inline button_input		key_o;
			static inline button_input		key_p;
			static inline button_input		key_q;
			static inline button_input		key_r;
			static inline button_input		key_s;
			static inline button_input		key_t;
			static inline button_input		key_u;
			static inline button_input		key_v;
			static inline button_input		key_w;
			static inline button_input		key_x;
			static inline button_input		key_y;
			static inline button_input		key_z;
			static inline button_input		key_1;				// 各数字
			static inline button_input		key_2;
			static inline button_input		key_3;
			static inline button_input		key_4;
			static inline button_input		key_5;
			static inline button_input		key_6;
			static inline button_input		key_7;
			static inline button_input		key_8;
			static inline button_input		key_9;
			static inline button_input		key_0;
			static inline button_input		key_f1;				// ファンクションキー
			static inline button_input		key_f2;
			static inline button_input		key_f3;
			static inline button_input		key_f4;
			static inline button_input		key_f5;
			static inline button_input		key_f6;
			static inline button_input		key_f7;
			static inline button_input		key_f8;
			static inline button_input		key_f9;
			static inline button_input		key_f10;
			static inline button_input		key_f11;
			static inline button_input		key_f12;
			static inline button_input		key_enter;			// ENTER
			static inline button_input		key_escape;			// ESCAPE
			static inline button_input		key_backspace;		// BACKSPACE
			static inline button_input		key_tab;			// TAB
			static inline button_input		key_space;			// SPACE
			static inline button_input		key_right;			// ←
			static inline button_input		key_left;			// →
			static inline button_input		key_down;			// ↓
			static inline button_input		key_up;				// ↑
			static inline button_input		key_lctrl;			// LEFT CONTROL
			static inline button_input		key_rctrl;			// RIGHT CONTROL
			static inline button_input		key_lshift;			// LEFT SHIFT
			static inline button_input		key_rshift;			// RIGHT SHIFT
			static inline button_input		key_lalt;			// LEFT ALT
			static inline button_input		key_ralt;			// RIGHT ALT

			// キーコードかスキャンコードかのセット
			static void set_scancode() { keyboard::scancode_m = true; }
			static void set_keycode() { keyboard::scancode_m = false; }
		private:
			// ボタン情報の更新受付を開始する
			static void update() {
				keyboard::key_a.update();
				keyboard::key_b.update();
				keyboard::key_c.update();
				keyboard::key_d.update();
				keyboard::key_e.update();
				keyboard::key_f.update();
				keyboard::key_g.update();
				keyboard::key_h.update();
				keyboard::key_i.update();
				keyboard::key_j.update();
				keyboard::key_k.update();
				keyboard::key_l.update();
				keyboard::key_m.update();
				keyboard::key_n.update();
				keyboard::key_o.update();
				keyboard::key_p.update();
				keyboard::key_q.update();
				keyboard::key_r.update();
				keyboard::key_s.update();
				keyboard::key_t.update();
				keyboard::key_u.update();
				keyboard::key_v.update();
				keyboard::key_w.update();
				keyboard::key_x.update();
				keyboard::key_y.update();
				keyboard::key_z.update();
				keyboard::key_1.update();
				keyboard::key_2.update();
				keyboard::key_3.update();
				keyboard::key_4.update();
				keyboard::key_5.update();
				keyboard::key_6.update();
				keyboard::key_7.update();
				keyboard::key_8.update();
				keyboard::key_9.update();
				keyboard::key_0.update();
				keyboard::key_f1.update();
				keyboard::key_f2.update();
				keyboard::key_f3.update();
				keyboard::key_f4.update();
				keyboard::key_f5.update();
				keyboard::key_f6.update();
				keyboard::key_f7.update();
				keyboard::key_f8.update();
				keyboard::key_f9.update();
				keyboard::key_f10.update();
				keyboard::key_f11.update();
				keyboard::key_f12.update();
				keyboard::key_enter.update();
				keyboard::key_escape.update();
				keyboard::key_backspace.update();
				keyboard::key_tab.update();
				keyboard::key_space.update();
				keyboard::key_right.update();
				keyboard::key_left.update();
				keyboard::key_down.update();
				keyboard::key_up.update();
				keyboard::key_lctrl.update();
				keyboard::key_rctrl.update();
				keyboard::key_lshift.update();
				keyboard::key_rshift.update();
				keyboard::key_lalt.update();
				keyboard::key_ralt.update();
			}
			// キーボードの各々の入力の反映
			static void key_down_ev(const SDL_KeyboardEvent& ev) {
				// スキャンコードの処理をするとき
				if (keyboard::scancode_m) {
					switch (ev.keysym.scancode) {
					case SDL_SCANCODE_A:
						keyboard::key_a.key_down();
						break;
					case SDL_SCANCODE_B:
						keyboard::key_b.key_down();
						break;
					case SDL_SCANCODE_C:
						keyboard::key_c.key_down();
						break;
					case SDL_SCANCODE_D:
						keyboard::key_d.key_down();
						break;
					case SDL_SCANCODE_E:
						keyboard::key_e.key_down();
						break;
					case SDL_SCANCODE_F:
						keyboard::key_f.key_down();
						break;
					case SDL_SCANCODE_G:
						keyboard::key_g.key_down();
						break;
					case SDL_SCANCODE_H:
						keyboard::key_h.key_down();
						break;
					case SDL_SCANCODE_I:
						keyboard::key_i.key_down();
						break;
					case SDL_SCANCODE_J:
						keyboard::key_j.key_down();
						break;
					case SDL_SCANCODE_K:
						keyboard::key_k.key_down();
						break;
					case SDL_SCANCODE_L:
						keyboard::key_l.key_down();
						break;
					case SDL_SCANCODE_M:
						keyboard::key_m.key_down();
						break;
					case SDL_SCANCODE_N:
						keyboard::key_n.key_down();
						break;
					case SDL_SCANCODE_O:
						keyboard::key_o.key_down();
						break;
					case SDL_SCANCODE_P:
						keyboard::key_p.key_down();
						break;
					case SDL_SCANCODE_Q:
						keyboard::key_q.key_down();
						break;
					case SDL_SCANCODE_R:
						keyboard::key_r.key_down();
						break;
					case SDL_SCANCODE_S:
						keyboard::key_s.key_down();
						break;
					case SDL_SCANCODE_T:
						keyboard::key_t.key_down();
						break;
					case SDL_SCANCODE_U:
						keyboard::key_u.key_down();
						break;
					case SDL_SCANCODE_V:
						keyboard::key_v.key_down();
						break;
					case SDL_SCANCODE_W:
						keyboard::key_w.key_down();
						break;
					case SDL_SCANCODE_X:
						keyboard::key_x.key_down();
						break;
					case SDL_SCANCODE_Y:
						keyboard::key_y.key_down();
						break;
					case SDL_SCANCODE_Z:
						keyboard::key_z.key_down();
						break;
					case SDL_SCANCODE_1:
						keyboard::key_1.key_down();
						break;
					case SDL_SCANCODE_2:
						keyboard::key_2.key_down();
						break;
					case SDL_SCANCODE_3:
						keyboard::key_3.key_down();
						break;
					case SDL_SCANCODE_4:
						keyboard::key_4.key_down();
						break;
					case SDL_SCANCODE_5:
						keyboard::key_5.key_down();
						break;
					case SDL_SCANCODE_6:
						keyboard::key_6.key_down();
						break;
					case SDL_SCANCODE_7:
						keyboard::key_7.key_down();
						break;
					case SDL_SCANCODE_8:
						keyboard::key_8.key_down();
						break;
					case SDL_SCANCODE_9:
						keyboard::key_9.key_down();
						break;
					case SDL_SCANCODE_0:
						keyboard::key_0.key_down();
						break;
					case SDL_SCANCODE_F1:
						keyboard::key_f1.key_down();
						break;
					case SDL_SCANCODE_F2:
						keyboard::key_f2.key_down();
						break;
					case SDL_SCANCODE_F3:
						keyboard::key_f3.key_down();
						break;
					case SDL_SCANCODE_F4:
						keyboard::key_f4.key_down();
						break;
					case SDL_SCANCODE_F5:
						keyboard::key_f5.key_down();
						break;
					case SDL_SCANCODE_F6:
						keyboard::key_f6.key_down();
						break;
					case SDL_SCANCODE_F7:
						keyboard::key_f7.key_down();
						break;
					case SDL_SCANCODE_F8:
						keyboard::key_f8.key_down();
						break;
					case SDL_SCANCODE_F9:
						keyboard::key_f9.key_down();
						break;
					case SDL_SCANCODE_F10:
						keyboard::key_f10.key_down();
						break;
					case SDL_SCANCODE_F11:
						keyboard::key_f11.key_down();
						break;
					case SDL_SCANCODE_F12:
						keyboard::key_f12.key_down();
						break;
					case SDL_SCANCODE_RETURN:
						keyboard::key_enter.key_down();
						break;
					case SDL_SCANCODE_ESCAPE:
						keyboard::key_escape.key_down();
						break;
					case SDL_SCANCODE_BACKSPACE:
						keyboard::key_backspace.key_down();
						break;
					case SDL_SCANCODE_TAB:
						keyboard::key_tab.key_down();
						break;
					case SDL_SCANCODE_SPACE:
						keyboard::key_space.key_down();
						break;
					case SDL_SCANCODE_RIGHT:
						keyboard::key_right.key_down();
						break;
					case SDL_SCANCODE_LEFT:
						keyboard::key_left.key_down();
						break;
					case SDL_SCANCODE_DOWN:
						keyboard::key_down.key_down();
						break;
					case SDL_SCANCODE_UP:
						keyboard::key_up.key_down();
						break;
					case SDL_SCANCODE_LCTRL:
						keyboard::key_lctrl.key_down();
						break;
					case SDL_SCANCODE_RCTRL:
						keyboard::key_rctrl.key_down();
						break;
					case SDL_SCANCODE_LSHIFT:
						keyboard::key_lshift.key_down();
						break;
					case SDL_SCANCODE_RSHIFT:
						keyboard::key_rshift.key_down();
						break;
					case SDL_SCANCODE_LALT:
						keyboard::key_lalt.key_down();
						break;
					case SDL_SCANCODE_RALT:
						keyboard::key_ralt.key_down();
						break;
					}
				}
				else {
					switch (ev.keysym.sym) {
					case SDLK_a:
						keyboard::key_a.key_down();
						break;
					case SDLK_b:
						keyboard::key_b.key_down();
						break;
					case SDLK_c:
						keyboard::key_c.key_down();
						break;
					case SDLK_d:
						keyboard::key_d.key_down();
						break;
					case SDLK_e:
						keyboard::key_e.key_down();
						break;
					case SDLK_f:
						keyboard::key_f.key_down();
						break;
					case SDLK_g:
						keyboard::key_g.key_down();
						break;
					case SDLK_h:
						keyboard::key_h.key_down();
						break;
					case SDLK_i:
						keyboard::key_i.key_down();
						break;
					case SDLK_j:
						keyboard::key_j.key_down();
						break;
					case SDLK_k:
						keyboard::key_k.key_down();
						break;
					case SDLK_l:
						keyboard::key_l.key_down();
						break;
					case SDLK_m:
						keyboard::key_m.key_down();
						break;
					case SDLK_n:
						keyboard::key_n.key_down();
						break;
					case SDLK_o:
						keyboard::key_o.key_down();
						break;
					case SDLK_p:
						keyboard::key_p.key_down();
						break;
					case SDLK_q:
						keyboard::key_q.key_down();
						break;
					case SDLK_r:
						keyboard::key_r.key_down();
						break;
					case SDLK_s:
						keyboard::key_s.key_down();
						break;
					case SDLK_t:
						keyboard::key_t.key_down();
						break;
					case SDLK_u:
						keyboard::key_u.key_down();
						break;
					case SDLK_v:
						keyboard::key_v.key_down();
						break;
					case SDLK_w:
						keyboard::key_w.key_down();
						break;
					case SDLK_x:
						keyboard::key_x.key_down();
						break;
					case SDLK_y:
						keyboard::key_y.key_down();
						break;
					case SDLK_z:
						keyboard::key_z.key_down();
						break;
					case SDLK_1:
						keyboard::key_1.key_down();
						break;
					case SDLK_2:
						keyboard::key_2.key_down();
						break;
					case SDLK_3:
						keyboard::key_3.key_down();
						break;
					case SDLK_4:
						keyboard::key_4.key_down();
						break;
					case SDLK_5:
						keyboard::key_5.key_down();
						break;
					case SDLK_6:
						keyboard::key_6.key_down();
						break;
					case SDLK_7:
						keyboard::key_7.key_down();
						break;
					case SDLK_8:
						keyboard::key_8.key_down();
						break;
					case SDLK_9:
						keyboard::key_9.key_down();
						break;
					case SDLK_0:
						keyboard::key_0.key_down();
						break;
					case SDLK_F1:
						keyboard::key_f1.key_down();
						break;
					case SDLK_F2:
						keyboard::key_f2.key_down();
						break;
					case SDLK_F3:
						keyboard::key_f3.key_down();
						break;
					case SDLK_F4:
						keyboard::key_f4.key_down();
						break;
					case SDLK_F5:
						keyboard::key_f5.key_down();
						break;
					case SDLK_F6:
						keyboard::key_f6.key_down();
						break;
					case SDLK_F7:
						keyboard::key_f7.key_down();
						break;
					case SDLK_F8:
						keyboard::key_f8.key_down();
						break;
					case SDLK_F9:
						keyboard::key_f9.key_down();
						break;
					case SDLK_F10:
						keyboard::key_f10.key_down();
						break;
					case SDLK_F11:
						keyboard::key_f11.key_down();
						break;
					case SDLK_F12:
						keyboard::key_f12.key_down();
						break;
					case SDLK_RETURN:
						keyboard::key_enter.key_down();
						break;
					case SDLK_ESCAPE:
						keyboard::key_escape.key_down();
						break;
					case SDLK_BACKSPACE:
						keyboard::key_backspace.key_down();
						break;
					case SDLK_TAB:
						keyboard::key_tab.key_down();
						break;
					case SDLK_SPACE:
						keyboard::key_space.key_down();
						break;
					case SDLK_RIGHT:
						keyboard::key_right.key_down();
						break;
					case SDLK_LEFT:
						keyboard::key_left.key_down();
						break;
					case SDLK_DOWN:
						keyboard::key_down.key_down();
						break;
					case SDLK_UP:
						keyboard::key_up.key_down();
						break;
					case SDLK_LCTRL:
						keyboard::key_lctrl.key_down();
						break;
					case SDLK_RCTRL:
						keyboard::key_rctrl.key_down();
						break;
					case SDLK_LSHIFT:
						keyboard::key_lshift.key_down();
						break;
					case SDLK_RSHIFT:
						keyboard::key_rshift.key_down();
						break;
					case SDLK_LALT:
						keyboard::key_lalt.key_down();
						break;
					case SDLK_RALT:
						keyboard::key_ralt.key_down();
						break;
					}
				}
			}
			static void key_up_ev(const SDL_KeyboardEvent& ev) {
				// スキャンコードの処理をするとき
				if (keyboard::scancode_m) {
					switch (ev.keysym.scancode) {
					case SDL_SCANCODE_A:
						keyboard::key_a.key_up();
						break;
					case SDL_SCANCODE_B:
						keyboard::key_b.key_up();
						break;
					case SDL_SCANCODE_C:
						keyboard::key_c.key_up();
						break;
					case SDL_SCANCODE_D:
						keyboard::key_d.key_up();
						break;
					case SDL_SCANCODE_E:
						keyboard::key_e.key_up();
						break;
					case SDL_SCANCODE_F:
						keyboard::key_f.key_up();
						break;
					case SDL_SCANCODE_G:
						keyboard::key_g.key_up();
						break;
					case SDL_SCANCODE_H:
						keyboard::key_h.key_up();
						break;
					case SDL_SCANCODE_I:
						keyboard::key_i.key_up();
						break;
					case SDL_SCANCODE_J:
						keyboard::key_j.key_up();
						break;
					case SDL_SCANCODE_K:
						keyboard::key_k.key_up();
						break;
					case SDL_SCANCODE_L:
						keyboard::key_l.key_up();
						break;
					case SDL_SCANCODE_M:
						keyboard::key_m.key_up();
						break;
					case SDL_SCANCODE_N:
						keyboard::key_n.key_up();
						break;
					case SDL_SCANCODE_O:
						keyboard::key_o.key_up();
						break;
					case SDL_SCANCODE_P:
						keyboard::key_p.key_up();
						break;
					case SDL_SCANCODE_Q:
						keyboard::key_q.key_up();
						break;
					case SDL_SCANCODE_R:
						keyboard::key_r.key_up();
						break;
					case SDL_SCANCODE_S:
						keyboard::key_s.key_up();
						break;
					case SDL_SCANCODE_T:
						keyboard::key_t.key_up();
						break;
					case SDL_SCANCODE_U:
						keyboard::key_u.key_up();
						break;
					case SDL_SCANCODE_V:
						keyboard::key_v.key_up();
						break;
					case SDL_SCANCODE_W:
						keyboard::key_w.key_up();
						break;
					case SDL_SCANCODE_X:
						keyboard::key_x.key_up();
						break;
					case SDL_SCANCODE_Y:
						keyboard::key_y.key_up();
						break;
					case SDL_SCANCODE_Z:
						keyboard::key_z.key_up();
						break;
					case SDL_SCANCODE_1:
						keyboard::key_1.key_up();
						break;
					case SDL_SCANCODE_2:
						keyboard::key_2.key_up();
						break;
					case SDL_SCANCODE_3:
						keyboard::key_3.key_up();
						break;
					case SDL_SCANCODE_4:
						keyboard::key_4.key_up();
						break;
					case SDL_SCANCODE_5:
						keyboard::key_5.key_up();
						break;
					case SDL_SCANCODE_6:
						keyboard::key_6.key_up();
						break;
					case SDL_SCANCODE_7:
						keyboard::key_7.key_up();
						break;
					case SDL_SCANCODE_8:
						keyboard::key_8.key_up();
						break;
					case SDL_SCANCODE_9:
						keyboard::key_9.key_up();
						break;
					case SDL_SCANCODE_0:
						keyboard::key_0.key_up();
						break;
					case SDL_SCANCODE_F1:
						keyboard::key_f1.key_up();
						break;
					case SDL_SCANCODE_F2:
						keyboard::key_f2.key_up();
						break;
					case SDL_SCANCODE_F3:
						keyboard::key_f3.key_up();
						break;
					case SDL_SCANCODE_F4:
						keyboard::key_f4.key_up();
						break;
					case SDL_SCANCODE_F5:
						keyboard::key_f5.key_up();
						break;
					case SDL_SCANCODE_F6:
						keyboard::key_f6.key_up();
						break;
					case SDL_SCANCODE_F7:
						keyboard::key_f7.key_up();
						break;
					case SDL_SCANCODE_F8:
						keyboard::key_f8.key_up();
						break;
					case SDL_SCANCODE_F9:
						keyboard::key_f9.key_up();
						break;
					case SDL_SCANCODE_F10:
						keyboard::key_f10.key_up();
						break;
					case SDL_SCANCODE_F11:
						keyboard::key_f11.key_up();
						break;
					case SDL_SCANCODE_F12:
						keyboard::key_f12.key_up();
						break;
					case SDL_SCANCODE_RETURN:
						keyboard::key_enter.key_up();
						break;
					case SDL_SCANCODE_ESCAPE:
						keyboard::key_escape.key_up();
						break;
					case SDL_SCANCODE_BACKSPACE:
						keyboard::key_backspace.key_up();
						break;
					case SDL_SCANCODE_TAB:
						keyboard::key_tab.key_up();
						break;
					case SDL_SCANCODE_SPACE:
						keyboard::key_space.key_up();
						break;
					case SDL_SCANCODE_RIGHT:
						keyboard::key_right.key_up();
						break;
					case SDL_SCANCODE_LEFT:
						keyboard::key_left.key_up();
						break;
					case SDL_SCANCODE_DOWN:
						keyboard::key_down.key_up();
						break;
					case SDL_SCANCODE_UP:
						keyboard::key_up.key_up();
						break;
					case SDL_SCANCODE_LCTRL:
						keyboard::key_lctrl.key_up();
						break;
					case SDL_SCANCODE_RCTRL:
						keyboard::key_rctrl.key_up();
						break;
					case SDL_SCANCODE_LSHIFT:
						keyboard::key_lshift.key_up();
						break;
					case SDL_SCANCODE_RSHIFT:
						keyboard::key_rshift.key_up();
						break;
					case SDL_SCANCODE_LALT:
						keyboard::key_lalt.key_up();
						break;
					case SDL_SCANCODE_RALT:
						keyboard::key_ralt.key_up();
						break;
					}
				}
				else {
					switch (ev.keysym.sym) {
					case SDLK_a:
						keyboard::key_a.key_up();
						break;
					case SDLK_b:
						keyboard::key_b.key_up();
						break;
					case SDLK_c:
						keyboard::key_c.key_up();
						break;
					case SDLK_d:
						keyboard::key_d.key_up();
						break;
					case SDLK_e:
						keyboard::key_e.key_up();
						break;
					case SDLK_f:
						keyboard::key_f.key_up();
						break;
					case SDLK_g:
						keyboard::key_g.key_up();
						break;
					case SDLK_h:
						keyboard::key_h.key_up();
						break;
					case SDLK_i:
						keyboard::key_i.key_up();
						break;
					case SDLK_j:
						keyboard::key_j.key_up();
						break;
					case SDLK_k:
						keyboard::key_k.key_up();
						break;
					case SDLK_l:
						keyboard::key_l.key_up();
						break;
					case SDLK_m:
						keyboard::key_m.key_up();
						break;
					case SDLK_n:
						keyboard::key_n.key_up();
						break;
					case SDLK_o:
						keyboard::key_o.key_up();
						break;
					case SDLK_p:
						keyboard::key_p.key_up();
						break;
					case SDLK_q:
						keyboard::key_q.key_up();
						break;
					case SDLK_r:
						keyboard::key_r.key_up();
						break;
					case SDLK_s:
						keyboard::key_s.key_up();
						break;
					case SDLK_t:
						keyboard::key_t.key_up();
						break;
					case SDLK_u:
						keyboard::key_u.key_up();
						break;
					case SDLK_v:
						keyboard::key_v.key_up();
						break;
					case SDLK_w:
						keyboard::key_w.key_up();
						break;
					case SDLK_x:
						keyboard::key_x.key_up();
						break;
					case SDLK_y:
						keyboard::key_y.key_up();
						break;
					case SDLK_z:
						keyboard::key_z.key_up();
						break;
					case SDLK_1:
						keyboard::key_1.key_up();
						break;
					case SDLK_2:
						keyboard::key_2.key_up();
						break;
					case SDLK_3:
						keyboard::key_3.key_up();
						break;
					case SDLK_4:
						keyboard::key_4.key_up();
						break;
					case SDLK_5:
						keyboard::key_5.key_up();
						break;
					case SDLK_6:
						keyboard::key_6.key_up();
						break;
					case SDLK_7:
						keyboard::key_7.key_up();
						break;
					case SDLK_8:
						keyboard::key_8.key_up();
						break;
					case SDLK_9:
						keyboard::key_9.key_up();
						break;
					case SDLK_0:
						keyboard::key_0.key_up();
						break;
					case SDLK_F1:
						keyboard::key_f1.key_up();
						break;
					case SDLK_F2:
						keyboard::key_f2.key_up();
						break;
					case SDLK_F3:
						keyboard::key_f3.key_up();
						break;
					case SDLK_F4:
						keyboard::key_f4.key_up();
						break;
					case SDLK_F5:
						keyboard::key_f5.key_up();
						break;
					case SDLK_F6:
						keyboard::key_f6.key_up();
						break;
					case SDLK_F7:
						keyboard::key_f7.key_up();
						break;
					case SDLK_F8:
						keyboard::key_f8.key_up();
						break;
					case SDLK_F9:
						keyboard::key_f9.key_up();
						break;
					case SDLK_F10:
						keyboard::key_f10.key_up();
						break;
					case SDLK_F11:
						keyboard::key_f11.key_up();
						break;
					case SDLK_F12:
						keyboard::key_f12.key_up();
						break;
					case SDLK_RETURN:
						keyboard::key_enter.key_up();
						break;
					case SDLK_ESCAPE:
						keyboard::key_escape.key_up();
						break;
					case SDLK_BACKSPACE:
						keyboard::key_backspace.key_up();
						break;
					case SDLK_TAB:
						keyboard::key_tab.key_up();
						break;
					case SDLK_SPACE:
						keyboard::key_space.key_up();
						break;
					case SDLK_RIGHT:
						keyboard::key_right.key_up();
						break;
					case SDLK_LEFT:
						keyboard::key_left.key_up();
						break;
					case SDLK_DOWN:
						keyboard::key_down.key_up();
						break;
					case SDLK_UP:
						keyboard::key_up.key_up();
						break;
					case SDLK_LCTRL:
						keyboard::key_lctrl.key_up();
						break;
					case SDLK_RCTRL:
						keyboard::key_rctrl.key_up();
						break;
					case SDLK_LSHIFT:
						keyboard::key_lshift.key_up();
						break;
					case SDLK_RSHIFT:
						keyboard::key_rshift.key_up();
						break;
					case SDLK_LALT:
						keyboard::key_lalt.key_up();
						break;
					case SDLK_RALT:
						keyboard::key_ralt.key_up();
						break;
					}
				}
			}

			friend bool event();
		};
	}
}


#endif