;------------------------------------------------------------ ; HSPスクリプト・ミニミニサンプル ; onion software/onitama 1998/1 ;------------------------------------------------------------ ; このサンプルは、HSP ver2.2以降で使うことのできる簡単な例を ; 集めたものです。それぞれのサンプルを切り出してスクリプト ; の一部として使用することができます。HSPの機能を活用する ; ための参考にしてみてください。 ;------------------------------------------------------------ ; 文字列の先頭文字をasciiコードで取り出す ; a="test" ; もとの文字列 peek code,a,0 ; インデックス0が最初の文字 mes "TEXT=["+a+"] CODE=["+code+"]" stop ; 文字列の取り出し1 (右からn文字を取り出す) ; a="ABCDEFG" ; もとの文字列 n=3 ; 右から3文字を取り出す strlen al,a str a1:peek a1,a,al-n mes "RIGHT$=["+a1+"]" stop ; 文字列の取り出し2 (左からn文字を取り出す) ; a="ABCDEFG" ; もとの文字列 n=5 ; 左から5文字を取り出す str a1:a1=a:poke a1,n,0 mes "LEFT$=["+a1+"]" stop ; 文字列の取り出し3 (n1文字目からn2文字を取り出す) ; a="ABCDEFG" ; もとの文字列 n1=2:n2=3 ; 2文字目から3文字分を取り出す str a1 peek a1,a,n1-1:poke a1,n2,0 mes "MID$=["+a1+"]" stop ; 「,」で区切られた文字列を1つ1つ取り出す ; a="10,20,45,80,100,230,1000,-1" ; もとの文字列 i=0 ; 調べる文字列のインデックス str a1 *chkmoji getstr a1,a,i,',' ; 文字列を取り出してa1に代入 if strsize=0 : goto *chkend ; 取り出したsizeが0なら終了 mes a1 ; 取り出した文字列を表示 i=i+strsize ; 次のインデックスに移動 goto *chkmoji *chkend stop ; テキストファイルの内容をそのまま表示1 ; "hsp2.txt"というテキストファイルを読み込みmes命令で表示します。 ; alloc buf,32000 ; テキストのバッファを確保 str buf bload "hsp2.txt",buf ; テキストファイル読み込み mes buf stop ; mesbox命令による簡易テキストエディタ ; "hsp2.txt"というファイル名を読み込みウインドゥ内で ; 編集できるようにします。[SAVE]ボタンを押すと、編集 ; した内容を"test.txt"というファイルにセーブします。 ; 読み込み可能なテキストファイルは32000バイトまでです。 ; alloc buf,32000 ; テキストのバッファを確保 str buf bload "hsp2.txt",buf ; テキストファイル読み込み flg=1 ; 0=編集不可/1=編集可能 mesbox buf,636,426,flg pos 480,428:button "SAVE",*file_save pos 548,428:button "END",*endbtn stop *file_save strlen a,buf ; テキストの長さを調べる bsave "test.txt",buf,a ; テキストファイルをセーブ stop *endbtn end ; テキストファイルの内容をそのまま表示2 ; "hsp2.txt"というテキストファイルを読み込みmes命令で表示します。 ; テキストに行番号をつけて、最初の20行までを表示します。 ; alloc buf,32000 ; テキストのバッファを確保 str buf bload "hsp2.txt",buf ; テキストファイル読み込み lines=0 ; 行数カウンタ i=0 ; 文字列のインデックス str a1 *txtprt getstr a1,buf,i ; 文字列を取り出してa1に代入 lines+ ; 変数linesに1を加算 mes "L"+lines+":"+a1 ; 取り出した文字列を表示 i=i+strsize ; 次のインデックスに移動 if lines<20 : goto *txtprt ; 20行以下ならば繰り返す stop ; テキストファイルの内容チェック ; "test.txt"というテキストファイルの中にある、 ; 先頭の文字が'#'の行だけを表示する。 ; alloc buf,32000 ; テキストのバッファを確保 str buf bload "test.txt",buf ; テキストファイル読み込み str a1 i=0 ; 文字列のインデックス *ckloop getstr a1,buf,i ; 文字列を取り出してa1に代入 if strsize=0 : goto *ckend peek code,a1,0 ; 先頭のasciiコードを得る if code='#' : mes a1 ; '#'ならば表示 i=i+strsize ; 次のインデックスに移動 goto *ckloop *ckend stop ; テキストファイルを自動生成 ; 1から10までの数字が各行に書かれたテキストを作成。 ; "test.txt"というテキストファイルにセーブします。 ; alloc buf,32000 ; テキストのバッファを確保 str buf i=0 ; 文字列のインデックス n=1 *mtloop a1=""+n ; 変数nを文字列にして変数a1に代入 a1+="\n" ; 変数a1に改行コードを付け足す poke buf,i,a1 ; テキストバッファに変数a1を書き込み i=i+strsize ; 次のインデックスに移動 n+:if n<11 : goto *mtloop ; 10までの数字なら繰り返す strlen i,buf ; テキストの長さを調べる bsave "test.txt",buf,i ; テキストファイル書き込み mes buf ; 画面にも表示 stop ; 現在の日付と時刻を表示 ; 現在日付は変数dateに、現在時刻は変数timeに代入、 ; それを画面に表示します。 gettime d1,0 ; 年を取得 gettime d2,1 ; 月を取得 gettime d3,2 ; 曜日を取得(使用せず) gettime d4,3 ; 日を取得 gettime t1,4 ; 時を取得 gettime t2,5 ; 分を取得 gettime t3,6 ; 秒を取得 date=""+d1+"/"+d2+"/"+d4 ; 文字列変数dateを設定 time=""+t1+":"+t2+":"+t3 ; 文字列変数timeを設定 mes "DATE=["+date+"]" ; dateを表示 mes "TIME=["+time+"]" ; timeを表示 stop ; 現在時刻をエディットボックスに表示 ; 1秒ごとに内容を更新しながら表示します。 ; a="" ; 変数aを文字列型で初期化 mesbox a,160,32 ; メッセージボックスを表示 ; (オブジェクトID0になります) *tmprt gettime t1,4 ; 時を取得 gettime t2,5 ; 分を取得 gettime t3,6 ; 秒を取得 time=""+t1+":"+t2+":"+t3 ; 文字列変数timeを設定 title time,0 ; メッセージボックスの内容を更新 wait 100 ; 1秒ウエイトする goto *tmprt ; 無限ループ ; 今日の曜日を表示 ; gettime命令で曜日を取得し表示する。 ; day="日月火水木金土" ; 一週間の文字データ gettime d3,2 ; 曜日(0〜6)を取得 a="??曜日" ; 文字列型変数aを初期化 wpeek b,day,d3*2 ; day文字を取得 wpoke a,0,b ; それを変数aにセット(2byte) mes "今日は、"+a+"です。" ; 曜日を表示 stop ; 複数行メッセージを影文字で表示 ; 改行を含む文字列を影付きで表示します。 cls 1 ; グレイで画面をクリア tmes="Copyright 1997\nby onion software\nHSP test script." x=10:y=10 ; 文字列を表示するX,Y座標 pos x+1,y+1:color 0,0,0 ; 黒い色で文字を描画 mes tmes pos x,y:color 255,255,255 ; 白い色で文字を描画 mes tmes stop ; 複数行メッセージをゆっくりと表示 ; 複数行に渡る文字列を「{"」〜「"}」で記述しています。 ; その内容をtext命令を使ってゆっくりと表示します。 tmes={" ・変数の値が32bitになり、文字列、配列、構造体も扱うことができます ・複数のウインドゥをシングルタスクで同時に扱うことができます ・高速な描画を実現しました。JPEG画像の読み込みも以前の5倍以上高速です ・画像解像度の切り替え、BMPファイルセーブなどの新機能を追加 ・オブジェクトサイズ、ソーススクリプトサイズに制限がなくなりました "} text 50 ; 文字の表示速度を遅く mes tmes ; 文字列を表示 stop ; 入力ボックスの内容を後から変更する ; 入力ボックスの数値を「+」「−」ボタンで増減させることができます。 ; もちろん直接入力をすることも可能です。OKを押すと、入力ボックスの ; 内容を表示します。 ; a=0 input a ; 入力ボックス(オブジェクトID0) button "+",*a_plus ; +ボタン(オブジェクトID1) button "−",*a_minus ; −ボタン(オブジェクトID2) button "OK",*inp_ok ; OKボタン(オブジェクトID3) stop *a_plus a+ ; 変数aに1を加算 goto *a_change *a_minus a- ; 変数aから1を減算 goto *a_change *a_change b=""+a ; 数値型変数aを文字列型変数bに変換 title b,0 ; オブジェクトID0を書き換える stop *inp_ok mes "INPUT = "+a ; OKを押すと内容を表示 stop ; 乱数でキャラクタを大量に描画 ; 乱数を発生させ、画面上にキャラクタを様々な色で描画します。 ; クローズボックスを押すか[ALT]+[F4]を押さない限り止まりません。 ; randomize ; 乱数を不定にして初期化 screen 0,640,480,1 ; メインウインドゥをパレットモード ; で初期化する sx=winx:sy=winy ; ウインドゥのサイズを取得 *boxloop rnd x1,sx:rnd y1,sy ; 乱数で座標を生成 rnd c,256 ; 乱数でパレットコードを生成 palcolor c:pos x1,y1 ; パレットと座標を設定 mes "●" ; キャラクタを表示 await 1 ; 表示ウエイト(これがないとダメ) goto *boxloop ; 無限ループさせる ; 画像のフェードイン・アウト ; 指定した画像をフェードインしながら表示し、やがて ; フェードアウトして消去します。一度、仮想画面に画像を読み込んで ; それをメイン画面にコピーしてからフェードを開始します。 ; screen 0,640,480,1 ; メインウインドゥをパレットモード ; で初期化する cls 4 buffer 3,,,1 ; ウインドゥID3を仮想画面として初期化 picload "yj_pnn.mag" ; 仮想画面に画像をロードする sx=winx:sy=winy ; 画像サイズを取得する gsel 0 ; メイン画面を描画対象にする gmode 1 ; 高速転送モードを選択 palfade -255 ; パレットの輝度を-256(黒にする) gcopy 3,0,0,sx,sy ; 仮想画面の画像をメイン画面にコピー ; フェードイン ; pf=-256 ; フェード初期値(まっ黒) repeat 16 ; 16回ループして、フェード値を0にする pf=pf+16:palfade pf:redraw await 10:loop ; ウエイトをしてからループ button "OK",*fade_out stop *fade_out ; フェードアウト ; pf=0 ; フェード初期値(通常値) repeat 16 ; 16回ループして、フェード値を-256にする pf=pf-16:palfade pf:redraw await 10:loop ; ウエイトをしてからループ stop ; 画像のパレット表示 ; 画像を読み込み256色のパレット一覧を表示します。 ; また、読み込んだ画像を1/4に縮小して画面に表示します。 ; screen 0,640,480,1 ; メインウインドゥをパレットモード ; で初期化する cls 4 buffer 3,,,1 ; ウインドゥID3を仮想画面として初期化 picload "yj_pnn.mag" ; 仮想画面に画像をロードする sx=winx:sy=winy ; 画像サイズを取得する gsel 0 ; メイン画面を描画対象にする x=sx/2:y=sy/2 ; X,Yサイズの半分を求める pos 640-x,480-y ; 縮小画像の表示位置を調整する gzoom x,y,3,0,0,sx,sy ; 仮想画面の画像をメイン画面に縮小して ; コピーする i=0 ; カラーパレットのインデックス repeat 8 y=cnt*16 ; Y方向の座標を設定 repeat 32 x=cnt*16 ; X方向の座標を設定 palcolor i ; パレットコードを指定 i+ ; インデックスを1つ加算する boxf x,y,x+14,y+14 ; 矩形を描画 loop loop stop ; 指定した画像ファイルをメインウインドゥの壁紙に ; "onibtn.mag"という256色パレットモードの画像ファイルを仮想画面に ; ロードして、それをメイン画面に全部埋まるようにコピーする。 ; fname="onibtn.mag" ; ロードされる画像ファイル名 buffer 3,,,1 ; ID3に仮想画面を作成する picload fname ; 画像をロードする sx=winx:sy=winy ; ロードした画像のX,Yサイズを保存 screen 0,640,480,1 ; メイン画面をパレットモードで ; 再初期化する cls 4 ; 黒で画面クリア palcopy 3 ; 仮想画面のパレットをコピーして ; 同じものを使えるようにする title "["+fname+"] size=("+sx+","+sy+")" tx=640+sx-1/sx ; X方向に入る画像の数を求める if tx=0 : tx=1 ty=480+sy-1/sy ; Y方向に入る画像の数を求める if ty=0 : ty=1 redraw 2 ; 描画をオフにして高速化 y=0 repeat ty x=0:repeat tx pos x,y:gcopy 3,0,0,sx,sy ; 仮想画面からコピー x+=sx loop y+=sy loop redraw 1 ; 全画面を再描画 stop ; 押したボタンに応じた画像を表示 ; 押したボタンに応じた画像を別ウインドゥに表示する ; screen 3 ; ID3のウインドゥを作成 gsel 0,1 ; ID0(メイン画面)を操作 width 120,120 sdim picname,32,10 ; 32文字x10の配列を定義 picname.0="hsp2ttl.jpg" ; 0番目の画像ファイル名 picname.1="oniinfo.jpg" ; 1番目の画像ファイル名 picname.2="yj_pnn.mag" ; 2番目の画像ファイル名 picname.3="onibtn.mag" ; 3番目の画像ファイル名 button "0",*seepic button "1",*seepic button "2",*seepic button "3",*seepic stop *seepic fname=picname.stat ; 押したボタンのファイル名 gsel 3,1 ; ID3を操作 & アクティブに title fname ; ウインドゥキャプション設定 picload fname ; 画像をロード stop ;------------------------------------------------------------ ; HSP ver2.3以降用ミニミニサンプル ;------------------------------------------------------------ ; 乱数で大量の線を描画 ; ランダムな色で、ランダムな座標に線を引きます。 ; line命令はredrawのモードにより速度が大幅に変わるので、 ; その違いを見ることもできます。redraw 0の行を削除すれば、 ; 通常のモードで線を描画します。 ; randomize ; 乱数を不定に pos 320,240 ; 最初の座標は画面の中心 redraw 0 ; redrawモードを0に repeat 400 ; 400回繰り返す rnd c,256:palcolor c ; 色を乱数で選ぶ rnd x,640:rnd y,480 ; 座標を乱数で選ぶ line x,y ; 線を引く loop ; 繰り返し redraw 1 ; 画面に一気に表示する stop ; チェックボックスを表示 ; 2つのチェックボックスを表示するサンプルです。 ; [OK]を押すと、その内容を表示します。 ; cls 1 mes "Check box test" a1=1:a2=0 ; 変数a1,a2を対象にする objsize 80,24 chkbox "変数a1",a1 chkbox "変数a2",a2 button "OK",*chkok stop *chkok m="現在の状態\na1="+a1+"/a2="+a2 dialog m stop ; カーソルキーによるメニュー選択 ; stick命令を使ったメニュー選択のサンプルです。 ; カーソルキーの上下で選んで、スペースまたはEnter ; で選択します。 ; cls 4 color 255,255,255 pos 300,180:mes "SELECTION-1" pos 300,200:mes "SELECTION-2" pos 300,220:mes "SELECTION-3" pos 300,240:mes "PROGRAM END" a=0 x=280:y=180:sel=0:maxsel=3 *selmain color 0,0,0:boxf x,y,x+20,y+20 y=sel*20+180 color 255,255,255 pos x,y:mes "*" *selloop stick a if a&2 : a=-1:goto *selchg if a&8 : a=1:goto *selchg if a&$30 : goto *selok await 10:goto *selloop *selchg a=a+sel if (a<0)or(a>maxsel) : a=sel sel=a:goto *selmain *selok if sel=3 : end a=sel+1 dialog "SELECTION-"+a goto *selloop ; メッセージボックスに後から文字列を追加 ; mesbox命令で作ったメッセージボックスに、スクリプト ; 側で文字列を追加します。サンプルでは、最初は何も ; メッセージがありませんが、[ADD1]および[ADD2]を押す ; ことでメッセージが追加されます。 ; alloc buf,32000 ; テキストのバッファを確保 buf="" flg=0 ; 0=編集不可/1=編集可能 mesbox buf,636,426,flg pos 412,428:button "ADD1",*mojiadd1 pos 480,428:button "ADD2",*mojiadd2 pos 548,428:button "END",*endbtn stop *mojiadd1 buf+="文字列を追加しました。\n" goto *mojichg *mojiadd2 buf+="これも追加文字列\n" goto *mojichg *mojichg title buf,0 ; メッセージボックスの内容を更新 stop *endbtn end ; onexit命令を使った終了時チェック ; ウインドゥ右上のクローズボックスを押した時に、終了確認の ; ウインドゥが開きます。[END]のボタンでは普通に終了します。 ; onexit *exit mes "スクリプト終了テスト(クローズボックスを押してみてください)" button "END",*owari stop *exit dialog "終了していいですか?",2,"On exit prompt" if stat=7 : stop *owari end ; 簡易CD playerサンプル ; mci命令のみで作ったCDプレイヤーです。 ; mciコマンドの使い方の参考にもなると思います。 ; mci "capability cdaudio can play" if stat!0 : dialog "デバイスは使用中です",1:end mci "status cdaudio number of tracks" if stat<0 : dialog "CDがセットされていません",1:end maxtrack=stat onexit *owari ; 終了した時のジャンプ先 mci "open cdaudio alias myid" ; CDにmyidというエイリアスをつける mci "set myid time format tmsf" ; トラック単位でアクセス tr=1 button "PLAY",*cdplay button "STOP",*cdstop button "<-",*cdback button "->",*cdnext *cdplay mci "play myid from "+tr ; CDプレイ *plloop title "CD player (track"+tr+")" stop *cdstop mci "stop myid" ; 演奏ストップ stop *cdback if tr=1 : goto *plloop tr=tr-1 ; 1つ前のトラックへ goto *cdplay *cdnext if tr=maxtrack : goto *plloop tr=tr+1 ; 1つ後のトラックへ goto *cdplay *owari mci "stop myid" mci "close myid" ; 最後に必ずcloseする end