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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0622
sky音量スライダーがうまく動作しません。3解決


sky

リンク

2014/6/22(Sun) 23:47:28|NO.62572

 こんばんは。
 アドバイスをいただいたこともあり、初めてのhspプログラム・簡易音楽プレイヤーが完成にちかづいてきました。
 今は、コンボボックスで音量のパーセント値を選択して、音量を変更させるという機能を作っています。
 上矢印を押すと、音量地に1プラス、下を押すと1マイナス、エンターで繁栄。
 if文で、音量地が100委上0以下にならないようにも対処したつもりです。
 でも、実際実行してみると、マイナス値がでたり、キーとパーセント値がまったく対応してなかったりと、思ったとおりにいきません。
なにがいけないのでしょうか?
 下に、簡略かしたスクリプトをのせるので、アドバイスお願いします。


#include "hspogg.as" screen 1,600,300 dim volume_set volume_set=0 button "Select",*select button "Play",*play button "down",*down sdim content,1024 mesbox content,300,100,0 id_mes=stat stop *select dialog "ogg",16,"ogg" if stat=0: goto *info dmmini dmmload file,0,0 goto *info stop *play dmmvol 0,volume_set dmmplay 0 goto *info stop *down sdim volume_content,400 repeat 101 volume_content+=""+(100-cnt)+"\n" loop objsize 80,100 pos 5,0 combox volume_set,200,volume_content id_com=stat objsel id_com button "ok",*ok id_ok=stat repeat stick code,10,0 if code=2: volume_set+=1 if code>100: volume_set=100 if code=8: volume_set-=1 if code<0: volume_set=0 if code=32: break await 3 loop volume_set=(volume_set-100)*100 dmmvol 0,volume_set stop *ok dmmvol 0,volume_set clrobj id_com clrobj id_ok goto *info *info repeat content="" redraw 0 dmmstat iplay,0,1 content+=" (Volume="+(iplay+10000)/100+"%)\n" objprm id_mes,""+content await 1000 redraw 1 loop



この記事に返信する


掘木

リンク

2014/6/23(Mon) 00:46:18|NO.62573

コンボボックスの挙動はいろいろ実験してみましたか?盛大な勘違いが予想されます。
適当にrepeat-loop内にtitleでも仕込んでvolume_setの中身を監視してみましょう。

提示されたコードの非常に動作が不安定です・・・。volume_setだらけで説明しづらいです。


combox volume_set,200,volume_content repeat stick code,10,0 if code=2: volume_set+=1 if code>100: volume_set=100 if code=8: volume_set-=1 if code<0: volume_set=0 if code=32: break await 3 loop // ・・・ volume_set=(volume_set-100)*100 dmmvol 0,volume_set
stickでcodeに値が入り、
codeが100を超えた際(Escキーやタブキーを押したり、右クリックしたりする)とvolume_setが100になる。
dmmvolに渡す値の元となるvolume_setを0から100に制限しているポイントが見当たりません。

と、これだけなら変数名間違いですねー で済むのですが・・・。

コンボボックスは
選択項目をマウス動作、キーボード動作等によって変わる時に、
第一引数で指定した値が変わります。上から順に0、1・・・と振られた番号が代入されます。
(提示されたコードでは"100"を選ぶとvolume_setに0が入ります。)
この際、指定した変数の値を変えてもコンボボックスの選択位置は変わりません。
(コードのどこかでvolume_setに5を入れても自動的に"95"を選んだような表示にはなりません。)

ここから、問題点として次のようなことが浮上します

1.コンボボックスにフォーカスがあっている際にアローキー(↑or↓)を押した時、
  「コンボボックスが行う上下の項目の選択によるvolume_setの値の変更」と、
  「repeat-loop内で行うstickとif文の内部によるvolume_setの値の変更」が被ります。
  また、上キーを押した際、コンボボックス側で行うvolume_setの値の変更(-1)とrepeat-loop内で行うvolume_setの値の変更(+1)のプラスマイナスが逆です。
  どちらが優先されるのでしょう?
2.コンボボックスにフォーカスがない状態でアローキー(↑or↓)を押した際、
  「repeat-loop内でのvolume_setの値の変更」が起こりますが、画面に何の変化も起きないため
  ユーザーはその動作によって今のvolume_setの値が分かりません。(コンボボックスの表示は変わらないからね)
  また、この状態ではvolume_setの値の範囲は制限されていないため平然とマイナス値をとりえます。
3.キーボードのEnterキーの入力によって音量設定を行うとstopするためmesbox側の表示は更新されません。
  一応dmmvolに到達し、それっぽい変換を施しているため音量の変化は見込めますが、
  このときコンボボックスもokボタンも消えないためもはや一体何を行ってるのかわけがわからなく・・・

それ以外に・・・
4.ボタン"ok"によるジャンプによってdmmvolを行う際に、渡される値はvolume_setです。
  この値はコンボボックスで選んだ場合0〜100が、キー入力後の場合の値は不明です。
  dmmvolに渡す値は-10000〜0の範囲に留めるべきでしょう。

なお、dmmvolの音量設定に関して、-10000が0%で、0が100%ですが、-5000が50%・・・というわけではないので注意しましょう。
(どういう用途で使っているのか不明だったので前スレでは言わなかったが)



創造師

リンク

2014/6/23(Mon) 01:51:09|NO.62574

はじめまして。

偶然通りかかったのでレス付けさせていただきます。
この質問に関して、「掘木」さんが言われているとおり、

コンボボックスの動作仕様を理解されていないように思います。
基本的にボタンやコンボボックス等のオブジェクト関係は一度作ったら、
放置プレイしてユーザーの操作を待つのが基本なので、
スクリプト側から操作させるというのは本来、やってはイケナイ事です。
(ただし、設定した状況を反映させる等、ユーザー操作が及ばない範囲であればおkです)

――と、説教くさいことはここまでにして、回答(?)の方にうつります。
まず、確認なのですが、本質問については「down」ボタンを
押した後の話ということで間違いないですか?

本質問が「down」ボタンを押した後のこととして話を進めると、

*down sdim volume_content,400 repeat 101 volume_content+=""+(100-cnt)+"\n" loop objsize 80,100 pos 5,0 combox volume_set,200,volume_content id_com=stat objsel id_com button "ok",*ok id_ok=stat repeat stick code,10,0 if code=2: volume_set+=1 if code>100: volume_set=100 if code=8: volume_set-=1 if code<0: volume_set=0 if code=32: break await 3 loop volume_set=(volume_set-100)*100 dmmvol 0,volume_set stop
まずはこの部分について。

コンボボックスについては自動的にキー操作を受け付けているので、
「上矢印を押すと、音量地に1プラス、下を押すと1マイナス、」
↑これをやりたいのであれば、

*down sdim volume_content,400 repeat 101 volume_content+=""+(100-cnt)+"\n" loop objsize 80,100 pos 5,0 combox volume_set,200,volume_content id_com=stat objsel id_com button "ok",*ok id_ok=stat repeat stick code,10,0 if code=32: break await 3 loop volume_set=(volume_set-100)*100 dmmvol 0,volume_set stop
↑これでよいかと。
0以下になるなら無い、100以上になるなら無いはWindowsシステムで制御されてるので
こっちで書く必要ありません。
ちなみに、

if code>100: volume_set=100 if code<0: volume_set=0
この辺りのコードで音量の制限やってるのだと思いますが、
「code」変数は「キー入力状態ID格納用変数」なので、
「音量状態格納用変数」ではありません。


次に「エンターで繁栄。」について、
反映する処理の該当箇所は

volume_set=(volume_set-100)*100 dmmvol 0,volume_set
上記かと思いますが、「volume_set」変数はコンボボックスが管理している変数なので、
別変数を用意した方がいいです。

volume_result=(volume_set-100)*100 dmmvol 0,volume_result
↑こんな感じに。
後は併せて「*ok」「*play」以降にある「dmmvol命令」の指定も修正。

*play dmmvol 0,volume_result dmmplay 0 goto *info stop <〜省略〜> *ok dmmvol 0,volume_result clrobj id_com clrobj id_ok goto *info
これで一先ず、意図した音量が入るようになったと思います。


とはいっても、oggファイルをロードしてないので
Enter後の「dmmvol」でおちますが;;

ちなみに「select」ボタンによるロードがバグっててロードできないので、
oggファイルを読まない状態で「down」ボタンを押して各種動作の確認をしました。


P.S
たぶんこの辺りだけじゃなくて「*select」も直さないとだめだけど、
一先ず、今回質問されている部分に絞って回答しておきました。



sky

リンク

2014/6/23(Mon) 18:39:25|NO.62580

 解答ありがとうございます。
 まず、コンボボックスのcombox命令のパラメーターの異味を勘違いしていました。
 今回のスクリプトの場合なら、100を選択している時に、volume_setには「0」が、
0を選択している時には、volume_setに「100」がセットされるわけですね。
 そして、オブジェクトは選択しの更新があるたびに、自動的に変数の内容を更新するということですね。
 テストしてみたところ、うまくいきました。
ありがとうございます。
オブジェクトの管理する変数は自動更新される、重要なことを学べました。



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