命令関数群をクラスにする
機能を設計する段階では、Spaceキーしか機能しない命令関数群でした。
ここからは、Spaceキー以外にも同じ機能が使えるように機能を複製できるようにします。
機能を設計した「class_sp1.hsp」を改変していきます。
複製される機能で使う変数の列挙
機能内で使う変数名を網羅します。
#module 変数名1,変数名2,変数名3...
#ifndef __KeyButton__
#define __KeyButton__
/*////////////////////////////////////////////////////////////////////
キーボタンクラス
キーボタンの入力をサポートします
////////////////////////////////////////////////////////////////////*/
#module KeyButton _keycode, _flag, _hold, _down, _up
#global
#endif
複製される機能の初期化
機能の変数宣言と複製時の初期値を設定する処理を書きます。
例えば、Spaceキーと同じ機能を他のキーでも使いたいとき、キーコードだけを違うものに変えれば実現できます。
この処理は、メインプログラムからnewmodをした時に呼び出されます。
#modinit 引数の型1 引数名1,引数の型2 引数名2...
/*////////////////////////////////////////////////////////////////////
処理:初期化
概要:キーボタン機能を使えるように初期化します
引数:新規キーボタン名,キーコード
戻値:
--------------------------------------------------------------------*/
#modinit int keycode
dim _keycode //キーコード
_keycode = keycode //※命令関数群はこのキーコードで動く
dim _flag //押下フラグ(0:離上,1:押下)
dim _hold //押下離上時間
dim _down //押下時フラグ(押した瞬間だけ1)
dim _up //離上時フラグ(離した瞬間だけ1)
return
引数にキーコードを指定して_keycodeに控えています。
メインプログラムからnewmodで複製時にキーコードが指定されることで、指定キーコード用の機能が作成されます。
複製される機能の命令
複製される機能の共通命令処理を書きます。
例えば、キー入力状態のフラグやデータを更新する処理や、機能の中のデータを書き換えたりする処理です。
#modfunc 新しい命令名 引数の型1 引数名1,引数の型2 引数名2...
/*////////////////////////////////////////////////////////////////////
処理:メイン
概要:キーボタンを常に監視し、フラグを更新します
引数:キーボタン名
戻値:
--------------------------------------------------------------------*/
#modfunc KeyButtonMain
getkey _flag,_keycode //_keycode押下中1、離上中0が_flagに代入
if _flag == 1{ //押下中のとき
if _hold <= 0{ //押下離上時間が0以下のとき
_down == 1 //押下時フラグを1にする
_hold = 0 //押下離上時間が0にする
}else{ //そうでないとき
_down == 0 //押下時フラグを0にする
}
_up = 0 //離上時フラグを0にする
_hold++ //押下離上時間をインクリメント(カウントアップ)
}else{ //押下中でないとき
if _hold >= 0{ //押下離上時間が0以上のとき
_up == 1 //離上時フラグを1にする
_hold = 0 //押下離上時間が0にする
}else{ //そうでないとき
_up == 0 //離上時フラグを0にする
}
_down = 0 //押下時フラグを0にする
_hold-- //押下離上時間をデクリメント(カウントダウン)
}
_hold = limit(_hold,-9999,9999) //押下離上時間の最大最小値内にする
return
複製される機能の関数
複製される機能の共通関数処理を書きます。
例えば、キー押下状態の取得や、キーが押された瞬間のフラグ値を返す処理です。
#modcfunc 新しい関数名 引数の型1 引数名1,引数の型2 引数名2...
/*////////////////////////////////////////////////////////////////////
処理:押下状態を返す
概要:押下状態を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonFlag
return _flag
/*////////////////////////////////////////////////////////////////////
処理:押下時間を返す
概要:押下時間を返します
引数:キーボタン名
戻値:押下時間
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonHold
return _hold
/*////////////////////////////////////////////////////////////////////
処理:押下を返す
概要:押下を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonDown
return _down
/*////////////////////////////////////////////////////////////////////
処理:離上を返す
概要:離上を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonUp
return _up
複製された機能の削除
複製された機能を使わなくなった時の処理を書きます。
基本的には初期状態に変数を戻して安全に削除する処理です。
#modterm 引数の型1 引数名1,引数の型2 引数名2...
/*////////////////////////////////////////////////////////////////////
処理:停止
概要:キーボタン機能を停止します
引数:キーボタン名
戻値:
--------------------------------------------------------------------*/
#modterm
_keycode = 0 //キーコード
_flag = 0 //押下フラグ(0:離上,1:押下)
_hold = 0 //押下離上時間
_down = 0 //押下時フラグ(押した瞬間だけ1)
_up = 0 //離上時フラグ(離した瞬間だけ1)
return
変更点の全容
上記の全説明より作成できる「class_sp1.hsp」と同等のプログラムを見てみましょう。
#ifndef __KeyButton__
#define __KeyButton__
/*////////////////////////////////////////////////////////////////////
キーボタンクラス
キーボタンの入力をサポートします
////////////////////////////////////////////////////////////////////*/
#module KeyButton _keycode, _flag, _hold, _down, _up
/*////////////////////////////////////////////////////////////////////
処理:初期化
概要:キーボタン機能を使えるように初期化します
引数:新規キーボタン名,キーコード
戻値:
--------------------------------------------------------------------*/
#modinit int keycode
dim _keycode //キーコード
_keycode = keycode //※命令関数群はこのキーコードで動く
dim _flag //押下フラグ(0:離上,1:押下)
dim _hold //押下離上時間
dim _down //押下時フラグ(押した瞬間だけ1)
dim _up //離上時フラグ(離した瞬間だけ1)
return
/*////////////////////////////////////////////////////////////////////
処理:メイン
概要:キーボタンを常に監視し、フラグを更新します
引数:キーボタン名
戻値:
--------------------------------------------------------------------*/
#modfunc KeyButtonMain
getkey _flag,_keycode //_keycode押下中1、離上中0が_flagに代入
if _flag == 1{ //押下中のとき
if _hold <= 0{ //押下離上時間が0以下のとき
_down == 1 //押下時フラグを1にする
_hold = 0 //押下離上時間が0にする
}else{ //そうでないとき
_down == 0 //押下時フラグを0にする
}
_up = 0 //離上時フラグを0にする
_hold++ //押下離上時間をインクリメント(カウントアップ)
}else{ //押下中でないとき
if _hold >= 0{ //押下離上時間が0以上のとき
_up == 1 //離上時フラグを1にする
_hold = 0 //押下離上時間が0にする
}else{ //そうでないとき
_up == 0 //離上時フラグを0にする
}
_down = 0 //押下時フラグを0にする
_hold-- //押下離上時間をデクリメント(カウントダウン)
}
_hold = limit(_hold,-9999,9999) //押下離上時間の最大最小値内にする
return
/*////////////////////////////////////////////////////////////////////
処理:停止
概要:キーボタン機能を停止します
引数:キーボタン名
戻値:
--------------------------------------------------------------------*/
#modterm
_keycode = 0 //キーコード
_flag = 0 //押下フラグ(0:離上,1:押下)
_hold = 0 //押下離上時間
_down = 0 //押下時フラグ(押した瞬間だけ1)
_up = 0 //離上時フラグ(離した瞬間だけ1)
return
/*////////////////////////////////////////////////////////////////////
処理:押下状態を返す
概要:押下状態を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonFlag
return _flag
/*////////////////////////////////////////////////////////////////////
処理:押下時間を返す
概要:押下時間を返します
引数:キーボタン名
戻値:押下時間
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonHold
return _hold
/*////////////////////////////////////////////////////////////////////
処理:押下を返す
概要:押下を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonDown
return _down
/*////////////////////////////////////////////////////////////////////
処理:離上を返す
概要:離上を返します
引数:キーボタン名
戻値:真偽値
--------------------------------------------------------------------*/
#modcfunc GetKeyButtonUp
return _up
#global
#endif
上記のファイルができたら、「class_sp2.hsp」として保存しましょう。
Copyright © 2002-2025 team.Dakuji All Rights Reserved.