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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1126
影の匠選択肢を上にあげるのがうまくいかない5解決


影の匠

リンク

2013/11/26(Tue) 22:41:22|NO.58478

質問です
今、メニューを作成しているのですが、上キーを押してもうまく反応してくれないんです。
具体的に言いますと、下キーを押すと下の選択肢が緑になるのですが上キーを押すと一番上の選択肢が緑に変わってしまいます。
HSPの達人の皆様、もしよければ私に下のソースのおかしい所を指摘してください。
お願いします

/////メニュー/////
bmcnt = 7 ;bmcnt=選択肢の数+1です
dim whatmenu,bmcnt
repeat bmcnt : whatmenu(cnt) = 0 : loop ;whatmenu=その選択肢を緑にするかどうかを決める(0なら黒、1なら白)
whatmenu(0) = 1

repeat
redraw 0
stick ky,2|8
if ky&16{end}
if ky&2{
wait 10
repeat bmcnt
if whatmenu(cnt) = 1{
whatmenu(cnt) = 0
if cnt > 0{whatmenu(cnt-1) = 1}
if cnt <= 0{whatmenu(bmcnt-1) = 1}
}
loop
}
if ky&8{
wait 16
repeat bmcnt
if whatmenu(cnt) = 1{;不具合発生箇所と思われる場所
whatmenu(cnt) = 0
if cnt < bmcnt-3 {whatmenu(cnt+1) = 1}
if cnt >= bmcnt-3 {whatmenu(0) = 1}
}
loop
}


repeat bmcnt-1
if whatmenu(cnt) = 0{
color ,,,
}if whatmenu(cnt) = 1{
color 0,255,
}
pos 0,5+cnt*22
if cnt=0{mes "AAAA"}
if cnt=1{mes "BBBB"}
if cnt=2{mes "CCCC"}
if cnt=3{mes "DDDD"}
if cnt=4{mes "EEEE"}
if cnt=5{mes "FFFF"}
loop

await 16
redraw
loop



この記事に返信する


影の匠

リンク

2013/11/26(Tue) 23:13:47|NO.58479

;whatmenu=その選択肢を緑にするかどうかを決める(0なら黒、1なら白)
→;whatmenu=その選択肢を緑にするかどうかを決める(0なら黒、1なら緑)



さか

リンク

2013/11/26(Tue) 23:20:00|NO.58480

whatmenu(cnt+1)=1した次にcntが増加するので=0になってしまうのではないかと思います。
以下のようにwhatmenu()=1の箇所でroopから抜けるようにしたらどうでしょう。
ついでに-3は-2のようです。
if cnt < bmcnt-2 {whatmenu(cnt+1) = 1: break}
if cnt >= bmcnt-2 {whatmenu(0) = 1: break}

実際にはなにか意図があるのかも知れませんがループとifが多すぎて複雑化しすぎてる
と思います。シンプルに作るほどバグの発生も防げます。



暇人

リンク

2013/11/27(Wed) 00:07:23|NO.58481

配列のフラグでどれが選択中か確認にして次に移動させるより
今選択中を示す変数を作ってやった方が分かりやすい

/////メニュー///// bmcnt = 6 dim whatmenu,bmcnt repeat bmcnt : whatmenu(cnt) = 0 : loop whatmenu(0) = 1 repeat redraw 0 stick ky,2|8 if ky=0 {next_wait=0} if ky&16{end} whatmenu(what_index) = 0 if (ky&2)>0 and (next_wait<cnt) { next_wait=cnt+10//cnt+キーが押され続けても連打にならないフレーム数 what_index-- if what_index<0 {what_index=bmcnt-1} } if (ky&8)>0 and (next_wait<cnt) { next_wait=cnt+10 what_index++ if what_index>=bmcnt {what_index=0} } whatmenu(what_index) = 1 repeat bmcnt if whatmenu(cnt) = 0{ color ,,, }if whatmenu(cnt) = 1{ color 0,255, } pos 0,5+cnt*22 if cnt=0{mes "AAAA"} if cnt=1{mes "BBBB"} if cnt=2{mes "CCCC"} if cnt=3{mes "DDDD"} if cnt=4{mes "EEEE"} if cnt=5{mes "FFFF"} loop await 16 redraw loop


たんに選択中かどうか分かれば良いなら↓でも良い

bmcnt = 6 mes_menu="AAAA","BBBB","CCCC","DDDD","EEEE","FFFF" repeat redraw 0 stick ky,2|8 if ky=0 {next_wait=0} if ky&16{end} if (ky&2)>0 and (next_wait<cnt) { next_wait=cnt+10 what_index=(what_index-1+bmcnt)\bmcnt } if (ky&8)>0 and (next_wait<cnt) { next_wait=cnt+10 what_index=(what_index+1)\bmcnt } repeat bmcnt if what_index = cnt {color 0,255,}else{color 0,0,} pos 0,5+cnt*22 mes mes_menu(cnt) loop await 16 redraw loop



影の匠

リンク

2013/11/27(Wed) 00:14:08|NO.58482

さかさん、ありがとうございます。
さかさんの言う通りにやってみたら治りました。
これからは、できるだけシンプルに作れるようにがんばります。



影の匠

リンク

2013/11/27(Wed) 00:21:44|NO.58483

暇人さんもありがとうございます。
暇人さんのソースの方がシンプルなので、そちらの方を今後使っていこうと思います。



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