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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0921
tataragetkeyの押しっぱなしについて7解決


tatara

リンク

2015/9/21(Mon) 23:45:33|NO.71838

HSP初心者です。宜しくお願い致します。

getkeyでスペースキーが入力されると画面が更新されるスクリプトを
作りたいのですが、一回の入力のつもりが押しっぱなしに成ってしまい
ます。
repeat
   getkey sp,32
   if sp=1{
break
}
   wait 1
loop
キー入力を一回のみさせたいのですが、何か良い方法は無いでしょうか?



この記事に返信する


スペース

リンク

2015/9/22(Tue) 00:38:41|NO.71839

tataraさんが貼ったスクリプトを見る限り、スペースキーを押すとループから抜けてしまいますよね。
その時点で処理が全て停止するので、画面はその後一切更新されないと思うのですが。
もしスクリプトの一部を貼っているのでしたら、もう少し広い範囲を貼って頂けると嬉しいです。
とりあえず、キーを押した瞬間を検出するこういう方法があります。

repeat getkey sp,32 if sp=1&spbac=0://更新処理をここに書いてください Color 255,255,255:boxf Color 0,0,0:pos 0,0:mes cnt spbac=sp await 16 loop



スペース

リンク

2015/9/22(Tue) 00:40:03|NO.71840

私中国人デスカ?

キーを押した瞬間を検出するこういう方法があります。×
キーを押した瞬間を検出するならこういう方法があります。○



葡萄色

リンク

2015/9/22(Tue) 01:41:18|NO.71841

HSP初心者ということですので少し難しいかもしれませんがウィンドウメッセージというものを使うと完結に処理できます。
以下がサンプルスクリプトになります。

#const WM_KEYDOWN $100 oncmd gosub *keydown, WM_KEYDOWN stop *keydown if wParam = 32 : //ここに更新処理書く return
〜簡単な解説〜
ウィンドウメッセージはユーザーが何かしらの操作を行ったときなどに、それをソフトウェアに通知してくれる(教えてくれる)Windowsの機能です。
ウィンドウメッセージには様々な種類が有り、今回の場合何かしらのキーが押された場合に通知してくれるWM_KEYDOWNというウィンドウメッセージを使っています。
ウィンドウメッセージは1つ1つ別のコード(番号)が割り振られており、WM_KEYDOWNの場合は16進法表記で$100が割り振られています。

oncmd命令は第1パラメータに指定されたコードのウィンドウメッセージが通知されたばあい、指定されたラベルにジャンプする機能を持っています。
oncmd命令の詳説はHSP Document Library(F1キーを押すと出てくるやつ)に譲ります。

このサンプルスクリプトの場合、keydownラベルにジャンプした後wParamというシステム変数にキーコードが勝手に格納(代入)されているため、それをif命令でスペースキーのキーコードか判別しています。
if命令の後(「//ここに更新処理書く」と書かれている場所)に描画を更新するプログラムを書けば思い通りの処理になると思います。

〜補足〜
ウィンドウメッセージを使う利点ですが、ループでキーが押されているか確認すると押されてない間もif命令が何回も実行されて無駄な処理をすることになります。
しかしウィンドウメッセージの場合は通知が来た時だけ処理をすればいいので無駄な処理が発生しません。

#constは定数を定義するプリプロセッサ命令です(詳説はHSP Document Libraryに譲ります)。
このサンプルスプリクトでは分かりやすくするために定数を定義していますが、oncmd命令に直接$100を指定しても問題はありません。
つまり、以下のような記述でも構いません。
oncmd gosub *keydown, $100

また、わざわざ16進法で表記する必要もなく$100の代わりに256を指定しても問題はありません(ちなみに$は16進法で記述したい場合に頭に付ける記号)。 なんにせよ自分の分かりやすい書き方をするのが一番です。 長くなって申し訳ありません。



tatara

リンク

2015/9/22(Tue) 02:51:51|NO.71843

皆さん返信ありがとうございます。
スペースさん、葡萄色さんのスクリプトを自分なりに考えてはみたのですが、当方ド素人で
上手く動かす事が出来ませんでした...
簡単なノベルゲームを作成しているのですが、画面の切り替えで詰まっています。

gsel 0 ; 画面「0」に描画先指定 redraw 0 ; 画面の更新を中断する pos 0,0 ; 背景画像の貼り付け gcopy 2,0,0,640,480 color 0,0,255 gmode 4,,,180 ; テキスト背景の貼り付け pos 0,380 gcopy 1,0,0,680,100 color 255,255,255 ; セリフの表示 pos 10,390 mes "セリフ1" pos 580,450 ; 『▼』の表示 mes "▼" redraw 1 repeat   getkey sp,32    if sp=1{ break }    wait 1 redraw 0 cls ;画面リセット 場面変更 pos 0,0 ; 背景画像の貼り付け gcopy 2,0,0,640,480 color 0,0,255 gmode 4,,,180 ; テキスト背景の貼り付け pos 0,380 gcopy 1,0,0,680,100 color 255,255,255 ; セリフの表示 pos 10,390 mes "セリフ2" pos 580,450 ; 『▼』の表示 mes "▼" redraw 1 ; 画面の更新を再開する repeat     getkey sp,32     if sp=1{    break }    wait 1 loop redraw 0 ;画面の更新を再開する cls ;画面リセット 場面変更 pos 0,0 ; 背景画像の貼り付け gcopy 2,0,0,640,480
こんな感じで続いて行くのですが...
stick命令も試してみましたが何も上のと変化がありませんでした。



tatara

リンク

2015/9/22(Tue) 03:01:57|NO.71844

stick命令はこんな風に書きました。

redraw 1 ; 画面の更新を再開する repeat stick a,0 if a&16{break} wait 1 loop redraw 0 ;画面の更新を中止する



レノス

リンク

2015/9/22(Tue) 03:32:40|NO.71845

2つ上のスクリプト、
最初のwait命令の次の行に loop を書かないといけないはずですが、忘れています。
スクリプトの左側のスペースの数は、きちんと揃えたほうがいいですよ。

redraw 1 repeat stick a if a & 16 { break } wait 1 loop redraw 0
私が試したかぎり、2つ上のスクリプトの getkey を stick に変えたものは、
「押しっぱなし」にはならずに動きました



tatara

リンク

2015/9/22(Tue) 11:47:58|NO.71846

レノスさんの回答を試してみたら上手く動かす事が出来ました。
皆さんの回答は非常に勉強に成りました。
本当にありがとうございました!



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