HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0531
úキーが押された瞬間を調べるスクリプトの説明5解決


ú

リンク

2009/5/31(Sun) 02:31:12|NO.25468

下記のページに記載されている「キー入力の状態を詳しく検知するためのテクニック」という項目を見て
一時間程悩んだのですが、全然内容が理解できません。
何方かサンプルスクリプトをくださいませんか。

http://www5.atwiki.jp/hsp-gamefactory/pages/11.html



この記事に返信する


SYAM

リンク

2009/5/31(Sun) 03:00:42|NO.25469

テクニックってより考え方ですね。
余分なところを省いた、スクリプトとして書くべきことは、こんだけです。

----------------------------
ループ開始。
・getkey でキーの状態を調べて、
 もし、前回押されてなくて今回押されてたら 「押された」
 もし、前回押されてなくて今回も押されてなければ「押されていない」
 もし、前回押されてて今回も押されてたら 「押されている」
 もし、前回押されてて今回押されてなければ「放された」
・さっきのgetkeyの結果を、ループの次の回で比較に使うために別の変数に保存。
ループここまで。
----------------------------

キー入力は過去ログに何度か出てきていますから、スクリプトは省きます。
キー入力 とか トリガー で検索したら引っかかってくるんじゃ ないかなー。



SYAM

リンク

2009/5/31(Sun) 03:26:24|NO.25470

サンプル、見つかったのでせっかくだから貼っておきます。

http://hsp.tv/play/pforum.php?mode=pastwch&num=5833

このスクリプトだと押しっぱなしとか放したとかの検出をしていませんが、先の解説でやっていることはまさにこれです。


ほかにも、ifを使わない方法のスクリプトも以前貼ったので、興味あったら検索してみてください。「リリースタイプ」で検索したら出てきます。たぶん。



VGM

リンク

2009/5/31(Sun) 06:27:37|NO.25471

このようなモジュールを作ってみました。
よろしければお使い下さい。
//////////////////////////////////////////////////
// getkey_ex // // ky() == 1 押した瞬間 // // ky() == -1 放した瞬間 // // ky() >= 1 押している間増え続ける // // ky() == 0 押されていない // ////////////////////////////////////////////////// #module #deffunc getkey_ex_ini array kyind_ kyindmax=length(kyind_) dim kyind,kyindmax repeat kyindmax kyind(cnt)=kyind_(cnt) loop dim ky@,256 return #deffunc getkey_ex mref st,64 : st=ginfo(2) //statにアクティブなウィンドウIDが入る if st>=0 : { repeat kyindmax getkey kytmp,kyind(cnt) if kytmp=1 : { ky@(kyind(cnt))++ } else { if ky@(kyind(cnt))>0 : ky@(kyind(cnt))=-1 : else : ky@(kyind(cnt))=0 } loop } return #global ////////////////////////////////////////////////// // 制作開始日 2009/05/12 01:24 // // 最終更新日 2009/05/31 06:12 // // by VGM (ご自由にお使い下さい) // ////////////////////////////////////////////////// //以下サンプルプログラム #const VK_ESCAPE 0x1B ;ESC #const VK_LEFT 0x25 ;← #const VK_UP 0x26 ;↑ #const VK_RIGHT 0x27 ;→ #const VK_DOWN 0x28 ;↓ dim kyind,5 //必ず監視するキーの数で初期化 kyind=VK_LEFT,VK_UP,VK_RIGHT,VK_DOWN,VK_ESCAPE //監視するキー getkey_ex_ini kyind //最初に実行(監視するキーを変更する時に実行) cx=320 : cy=240 repeat getkey_ex st=stat //statにアクティブなウィンドウIDが入る if ky(VK_ESCAPE) : end //[Esc] if (ky(VK_LEFT)=1) or ((ky(VK_LEFT)>=30) and (ky(VK_LEFT)\5=0)) : cx-=10 //↑押した瞬間と一定時間経過後に一定時間ごとに移動 if ky(VK_UP)=1 : cy-=10 //↑押した瞬間だけ移動 if (ky(VK_RIGHT)=1) or (ky(VK_RIGHT)>=50) : cx+=10 //↑押した瞬間と一定時間経過後移動 if ky(VK_DOWN)=-1 : cy+=10 //↑放した瞬間だけ移動 redraw 2 : color : boxf : color 255,255,255 : pos cx,cy : mes "o" pos 0,0 : mes "cx "+cx+" / cy "+cy repeat length(kyind) mes "key "+kyind(cnt)+" / "+ky(kyind(cnt)) loop mes "stat (winID) = "+st redraw 1 : await 30 loop



VGM

リンク

2009/5/31(Sun) 06:53:45|NO.25472

ひとつ説明不足がありましたので補足。
ウィンドウがアクティブでない間は、キー検出を中断します。

サンプルプログラムの
getkey_ex
st=stat
の後に↓を挿入するとHSPの処理を止めることが出来ます。
	if st<0 : wait 5 : continue	//ウィンドウがアクティブでない間処理中止




ú

リンク

2009/5/31(Sun) 13:23:54|NO.25475

>SYAMさん
ありがとうございます。
やっと理解できた気がします。

>VGMさん
こんなつもりじゃ無かったのですが・・
わざわざありがとうございます。是非使わせていただきます。



ONION software Copyright 1997-2023(c) All rights reserved.