小ワザ
配列変数をループして表示させる †
よく音ゲーなどで曲目を円状にループさせているのを見かけますが、
アレをHSPで実現させます。
一部説明がアレな部分がありますので、
そこはどうにかしてください。すいません。
PCソフトとかゲームで、
*****
?????
+++++
\\\\\
/////
(記号は何か単語)
こういう表示を見たことはありませんか?
きっとあると思います。
(例えがわかり難いと言う(爆
こういうの、結構見栄えがいい上に
直感的でわかりやすいと思うんですが。
何かを選択させるとき。
ファイルロードの画面とかで使える可能性がある。
というわけで、やっていきます。
まあ色々あるんですが、今回は比較的ラク(と思われる)方法を。
- 表示する配列変数のデータを用意する。
- 1番目に表示する要素の番号を決める。ここでは、キー入力によって決めている。
- そこからすべての項目を足し算と、剰余演算で計算する。
- 表示する番号が要素数を超えていなければ、普通に1ずつ足してずらす。。
- 表示する番号が要素数からはみ出ていれば、1を足した番号から要素数を引く。
いま、100個項目があるとする。(番号は0 - 99)
たとえば、1番目に表示するのが4番だったら、
4,5,6,7,8,9,10,....
と、普通に1ずつ足して、表示する項目を決定する。
しかし、96番が最初のときだと、&br;
96,97,98,99,100,101...
と、要素の番号からはみ出てしまう。そこで、
超えた分についてはそこから項目数の100をひいて、
96,97,98,99,0,1,...
として、エラーを防ぐ。
今回は、ファイラーっぽいサンプルで。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
-
|
|
|
|
|
|
!
-
|
!
-
|
|
|
!
-
|
|
|
!
-
|
|
!
-
|
-
|
!
|
|
|
|
-
|
|
|
!
!
|
screen 0,640,160
title "上下キーで移動、左で上階層へ、Enterで決定"
font msgothic,20
#const koumoku_file 0x100 #const koumoku_dir 0x101 #const draw_max 8 #const enterkoumoku 3
dim drawkoumoku,draw_max dim koumoku_type,64 sdim dirlists,256 sdim dirbuf
sdim filebuf
sdim listbuf
koumokumax=0 first=0
gosub *load
*main
repeat
redraw 2
color : boxf
pos 0,0
color 255,255
mes dir_cur
color 255,255,255
pos 0,20
repeat draw_max
color 255,255,255
drawkoumoku(cnt)= (first + cnt) \ koumokumax
if cnt = enterkoumoku : color 255
pos 0,cnt*20+20
mes dirlists(drawkoumoku(cnt))
color : boxf 400,cnt*20+20,640,cnt*20+40
color 255,255,255
pos 400,cnt*20+20
if koumoku_type(drawkoumoku(cnt)) = koumoku_file {
exist dirlists(drawkoumoku(cnt))
mes ""+((strsize/1024)+((strsize-sirsize/1024*1024)!=0))+"KB"
}
if koumoku_type(drawkoumoku(cnt)) = koumoku_dir {
mes "<DIR>"
}
loop
stick key
if key&2 {
first--
if first < 0 : first += koumokumax
}
if key&8 {
first++
if first > koumokumax -1 : first -= koumokumax
}
if key&1 {
chdir "../"
gosub *load
}
if key&32 {
if koumoku_type(drawkoumoku(enterkoumoku)) = koumoku_file {
exec dirlists(drawkoumoku(enterkoumoku)),16
}
if koumoku_type(drawkoumoku(enterkoumoku)) = koumoku_dir {
chdir dirlists(drawkoumoku(enterkoumoku))
gosub *load
}
}
redraw 1
await
title "上下キーで移動、Enterで決定"
loop
*load
dim drawkoumoku,draw_max
dim koumoku_type,64
sdim dirlists,256
sdim dirbuf
sdim filebuf
sdim listbuf
koumokumax=0
dirlist filebuf,"*.*",1 koumokumax += stat
filecount = stat
listbuf += filebuf
dirlist dirbuf,"*",5 koumokumax += stat
dircount += stat
listbuf += dirbuf
koumokumax++
listbuf += "../"
dim koumoku_type,koumokumax
repeat filecount
koumoku_type(cnt) = koumoku_file
loop
repeat dircount + 1 koumoku_type(cnt+filecount) = koumoku_dir
loop
split listbuf,"\n",dirlists
koumokumax= length(dirlists)
return
|
- とりあえず投稿しました。 -- kb10うy?
- 後から気付いたのですが、(strsize-strsize/1024)は、正しくは(strsize-strsize/1024*1024)です。 -- kb10うy?
- タイトルと小技の関係が見えてこない。 --
- 曲目を円状にループさせているのを再現すると言ってあるけど、このスクリプトのどこに円状なるものが? --
- 『この小技は、配列の「先頭」と「末尾」をくっつけて「環状配列」として用いている。このような配列を「リングバッファ」と呼ぶことがある。』? --
- 1.表示する配列変数を用意する。⇒「配列変数」は表示できない。表示するのは「配列変数」が保持している値。要するに「配列変数」を用意する。 --
- 2.1番目の表示を決める。⇒「1番目の表示」って?「表示」って動詞であって、「何」に相当する目的語が不足していて、日本語で書いてある説明文が理解できない。要するに1番目に表示する「何か」を決める。 --
- 3.そこからすべての項目を計算する⇒どんな計算なの?要するにすべての項目について以下を実行する。 --
- 環状配列を説明するのに、ファイラーのような実用的なサンプルを用いると、読者はファイル取得部分やディレクトリ操作部分に興味が向けられてしまい、環状配列の要、配列の使い方・添え字の決定ロジックのほうに注意が向かなくなる恐れがある。 --
- ベストサンプル イズ シンプル
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
| ary = 0,1,2,3,4,5,6,7,8,9
i = 0
ary_size = length(ary)
view_max = 5
repeat
redraw 0
color 255,255,255: boxf: color 0: pos 0,0
repeat view_max
mes ary((i+cnt)\ary_size)
loop
redraw 1
i = (i + 3)\ary_size
wait 100
loop
|
- ↑いわれてみればそのとおりですね。 日本語の部分を更新しました。わかりにくくてホントすいません。 -- kb10うy?