hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
配列変数をループさせる - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

配列変数をループして表示させる

よく音ゲーなどで曲目を円状にループさせているのを見かけますが、
アレをHSPで実現させます。 一部説明がアレな部分がありますので、 そこはどうにかしてください。すいません。

PCソフトとかゲームで、

    *****
  ?????
 +++++
 \\\\\
  /////

(記号は何か単語) こういう表示を見たことはありませんか? きっとあると思います。 (例えがわかり難いと言う(爆

こういうの、結構見栄えがいい上に 直感的でわかりやすいと思うんですが。

何かを選択させるとき。 ファイルロードの画面とかで使える可能性がある。

コーディング

というわけで、やっていきます。

考え方

まあ色々あるんですが、今回は比較的ラク(と思われる)方法を。

  1. 表示する配列変数のデータを用意する。
  2. 1番目に表示する要素の番号を決める。ここでは、キー入力によって決めている。
  3. そこからすべての項目を足し算と、剰余演算で計算する。
    1. 表示する番号が要素数を超えていなければ、普通に1ずつ足してずらす。。
    2. 表示する番号が要素数からはみ出ていれば、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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
!
 
-
|
!
 
 
 
 
-
|
|
|
!
-
|
|
|
!
-
|
|
!
-
|
-
|
!
|
|
|
|
-
|
|
|
!
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/*
配列の中身をループして表示させる
曲目の選択などに使えるのではないでしょうか。
ここでは簡易ファイラーにしています。
by kb10うy
*/
//ウィンドウ
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            //ファイル・フォルダの文字列を入れる配列
//↓3つバッファ
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))
                //おまけに書いてみる
                //ファイルならサイズ、ディレクトリなら"<DIR>
                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))
                    //((strsize/1000)+((strsize-sirsize/1000)!=0))
                    //というのは、1024byteで割って端数があったら
                    //1足すというもの
                    //Windowsの表示に似せている
                    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++
                //項目数-1 以上になったら項目数を引いてループ
                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
    //もう1度初期化
    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? 2011-07-26 (火) 21:29:28
  • 後から気付いたのですが、(strsize-strsize/1024)は、正しくは(strsize-strsize/1024*1024)です。 -- kb10うy? 2011-07-26 (火) 23:36:51
  • タイトルと小技の関係が見えてこない。 -- 2011-07-29 (金) 08:05:21
  • 曲目を円状にループさせているのを再現すると言ってあるけど、このスクリプトのどこに円状なるものが? -- 2011-07-29 (金) 08:06:33
  • 『この小技は、配列の「先頭」と「末尾」をくっつけて「環状配列」として用いている。このような配列を「リングバッファ」と呼ぶことがある。』? -- 2011-07-29 (金) 08:11:34
  • 1.表示する配列変数を用意する。⇒「配列変数」は表示できない。表示するのは「配列変数」が保持している値。要するに「配列変数」を用意する。 -- 2011-07-29 (金) 08:12:54
  • 2.1番目の表示を決める。⇒「1番目の表示」って?「表示」って動詞であって、「何」に相当する目的語が不足していて、日本語で書いてある説明文が理解できない。要するに1番目に表示する「何か」を決める。 -- 2011-07-29 (金) 08:15:58
  • 3.そこからすべての項目を計算する⇒どんな計算なの?要するにすべての項目について以下を実行する。 -- 2011-07-29 (金) 08:16:45
  • 環状配列を説明するのに、ファイラーのような実用的なサンプルを用いると、読者はファイル取得部分やディレクトリ操作部分に興味が向けられてしまい、環状配列の要、配列の使い方・添え字の決定ロジックのほうに注意が向かなくなる恐れがある。 -- 2011-07-29 (金) 08:23:46
  • ベストサンプル イズ シンプル
      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
  • ↑いわれてみればそのとおりですね。 [a] 日本語の部分を更新しました。わかりにくくてホントすいません。 [ojigi] -- kb10うy? 2011-07-29 (金) 08:38:21

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2011-10-01 (土) 14:44:16 (799d)