
HSPスクリプト・ミニミニサンプル
ここでは、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

[Back]