input/IDSwitch.js

/**
 * IDSwitch.js
 *
 * @module InputDetect
 * @author natade (https://github.com/natade-jp)
 * @license MIT
 */

/**
 * スイッチ(ボタン)の押下状態を管理するクラスです。
 * ボタンの押下・離す・押し続け・押した瞬間・離した瞬間など、さまざまなスイッチの状態を判定できます。
 */
export default class IDSwitch {
	/**
	 * 押す、離すが可能なボタンスイッチの状態管理クラス
	 * @constructor
	 */
	constructor() {
		this._initIDSwitch();
	}

	/**
	 * スイッチの状態を初期化します。
	 * @private
	 */
	_initIDSwitch() {
		/**
		 * 押した瞬間にtrueになります(1フレームのみ)
		 * @type {boolean}
		 */
		this.istyped = false;

		/**
		 * 押している間trueになります(押しっぱなし判定)
		 * @type {boolean}
		 */
		this.ispressed = false;

		/**
		 * 離した瞬間にtrueになります(1フレームのみ)
		 * @type {boolean}
		 */
		this.isreleased = false;

		/**
		 * 押している時間(フレーム数)
		 * @type {number}
		 */
		this.pressed_time = 0;
	}

	/**
	 * このスイッチの状態をコピーした新しいインスタンスを返します。
	 * @returns {IDSwitch} 複製したIDSwitchインスタンス
	 */
	clone() {
		const ret = new IDSwitch();
		ret.istyped = this.istyped;
		ret.ispressed = this.ispressed;
		ret.isreleased = this.isreleased;
		ret.pressed_time = this.pressed_time;
		return ret;
	}

	/**
	 * ボタンが押されたことを記録します。
	 * 1フレーム目はistyped、以降はispressedがtrueになります。
	 */
	keyPressed() {
		if (!this.ispressed) {
			this.istyped = true;
		}
		this.ispressed = true;
		this.pressed_time++;
	}

	/**
	 * ボタンが離されたことを記録します。
	 * isreleasedがtrueになり、ispressedがfalseになります。
	 */
	keyReleased() {
		this.ispressed = false;
		this.isreleased = true;
		this.pressed_time = 0;
	}

	/**
	 * フォーカスが外れた場合に状態をリセットします。
	 */
	focusLost() {
		this.keyReleased();
	}

	/**
	 * 他のIDSwitchインスタンスへ現在のスイッチ状態を渡します。
	 * 1フレームごとに必要な値だけを転送し、istyped/isreleasedはfalse化されます。
	 * @param {IDSwitch} c - 情報を受け取るIDSwitchインスタンス
	 * @throws {string} - cがIDSwitchのインスタンスでない場合
	 */
	pickInput(c) {
		if (!(c instanceof IDSwitch)) {
			throw "IllegalArgumentException";
		}
		c.ispressed = this.ispressed;
		c.istyped = this.istyped;
		c.isreleased = this.isreleased;
		c.pressed_time = this.pressed_time;
		this.isreleased = false;
		this.istyped = false;
	}
}