その他の画像等描画
第20章の画像を使用していますのでお持ちでない方はダウンロードしてください。
バッファ等に読み込んだ画像をコピーするgcopy命令はしましたが、倍率は1倍(読み込んだ大きさ)でした。
細かい画像は問題ないがもう少し荒くてもいいので、拡大して表示したい場合はgzoom命令を使いましょう。
書式は「gzoom 描画xサイズ,yサイズ,ウィンドウID,コピー元x座標,y座標,コピーxサイズ,yサイズ」です。
p1に変倍後のxサイズを指定、p2に変倍後のyサイズをそれぞれ指定します。
p3にコピーしたいウィンドウのID(0〜31)を指定します。
p4には指定したウィンドウIDのコピー元の左上のx座標、p5に左上のy座標を指定します。
p6にコピーするxサイズを、p7にコピーするyサイズを指定します。
例として20章で使用したキャラクタ画像を2倍にして表示してみましょう。
buffer 2
picload "char.bmp"
gsel 0
pos 100, 100
gzoom 64, 64, 2, 32, 0, 32, 32
stop
gcopy命令と同じく描画先ウィンドウのカレントポジションに表示されましたね。
当然ですがgzoom命令で1倍表示もできます。
gcopy命令ではいらない部分を透過することができましたが、gzoom命令ではできません。
どうしても変倍+透過したい時は、変倍したものをバッファに描画し、その画像を画面にgcopyしましょう。
buffer 2
picload "char.bmp"
wx = winx / 3 : wy = winy
buffer 3, wx * 6, wy * 2
gzoom wx * 6, wy * 2, 2, 0, 0, wx * 3, wy
gsel 0
gmode 2
pos 100, 100 : gcopy 3, 32 * 2, 0, 32 * 2, 32 * 2
stop
画像描画命令はここら辺で置いておきまして、線を引くline命令を紹介いたしましょう。
ヘルプに「line 点1x座標,y座標,点2x座標,y座標」と記述されているため、
点1から点2まで引かれると勘違いされる方が多いようですが
正確には点2の(p3,p4)座標を始点として、点1の(p1,p2)座標まで引かれます。
p3、p4を省略するとカレントポジションから(p1,p2)座標まで引かれます。
線の色はcolor命令で指定されている色となります。
color 255
line 400, 300, 200, 100 ; (200,100)から(400,300)まで赤い線で引かれる
stop
注意していただく点が一点あります。
それは終点の(p1,p2)座標の1ドットは引かれない、ということです。
環境によっては引かれることもあるそうですが、ほとんどは引かれないそうです。
私のものも引かれませんでした。
boxf ; 初期色(黒)でウィンドウを塗りつぶす
color 255, 255
line 0, 0, 640, 0
line -1, 1, 640, 1
stop
上記のサンプルを試していただくと、大半が(0,0)座標が最初の黒色で塗りつぶされたままでしょう。
線でなく点を描画したいという場合はpset命令を使用します。
書式は「pset x座標,y座標」とシンプルです。
color命令またはpalcolor命令で指定した色で(p1,p2)座標に点を描画します。
color ,255
pset 100, 100 ; 座標(100,100)に緑色で点を描画
stop
この命令はさほど速い命令ではないので、描画面積が大きい場合はboxf命令等で一気に塗り潰しましょう。
数個程度なら気になるほど低速には感じませんが、多くなるとかなり目立ってしまいます。
点を描画する命令に対し、ウィンドウ内の1点を読み取るpget命令もございます。
pset命令と同じパラメータで書式は「pget x座標,y座標」です。
pset命令と同じく速いと言える命令ではないです。
HSPウィンドウ内の左上を(0,0)としての座標の色を取得し、システム変数rval、gval、bvalに
それぞれの輝度(赤輝度(Red),緑輝度(Green),青輝度(Blue))が自動で入ります。
buffer 2
picload"bomb.bmp"
gsel 0
*main
gcopy 2, 0, 0, 288, 32
repeat
stick click
if click = 256 : break ;クリックしたらループを抜ける
wait 1
loop
pget mousex,mousey ; マウスの座標の色を取得
color rval,gval,bval ; 描画色をpgetで取得した色に変更
boxf
goto *main
サンプルを実行するとウィンドウ内のクリックした座標の色で塗りつぶします(bomb.bmpは再表示)。
mousexとmouseyは18章で説明したシステム変数です。
点の描画・点の色の取得もこの辺にしておきましてginfo命令に入ります。
この命令を使用すればウィンドウ・マウスに関する情報を知ることができます。
書式は「ginfo 情報のタイプ」です。
p1に0を入れると、ディスプレイの左上を基点としたマウスカーソルの座標を知ることができます。
実行後システム変数prmxにカーソルのx座標、prmyにy座標がそれぞれ入ります。
p1に1を指定すると、アクティブになっているHSPウィンドウのウィンドウIDがprmxに入ります。
HSP以外のウィンドウがアクティブならprmxに-1が入ります。
prmyにはgsel命令で指定している画面制御命令(文字や画像の表示先ウィンドウ)の描画先が入ります。
p1が2でディスプレイ左上を基点としてアクティブなHSPウィンドウの左上座標がprmx,prmyに入ります。
これによりユーザーがウィンドウを移動させてもどの位置にあるのかがすぐにわかりますね。
p1が3だと、p1に2を指定した時と似ていますが、HSPウィンドウの右下の座標がprmx,prmyに入ります。
p1に4を指定すると、スクロールバーを動かしウィンドウのどの位置を表示しているかがわかります。
スクロールさせる前の位置を(0,0)として何ドットずれている位置かをprmx,prmyに入れられます。
p1が5だと、操作先ウィンドウのウィンドウサイズが入りますがシステム変数winx,winyとは少し異なり、
ウィンドウ内だけでなく枠(タイトルバーも含む)サイズがprmx,prmyにそれぞれ入ります。
p1に6を入れると、操作先のウィンドウの初期サイズがprmx,prmyに入ります。
変更後のサイズはwinx,winyで取得はできるのですが初期サイズはこの命令を使用しないと無理ですね。
screen 2
screen 0, 200, 50
mes"アクティブになると\n終了します"
repeat
ginfo 1
if prmx = 0 : end ; ウィンドウID0がアクティブになると終了
wait 1
loop
HSPウィンドウ内で表示された画像をそのままBMPファイルとして保存してみましょう。
「bmpsave "セーブ名"」という書式で保存可能となっております。
セーブ名には拡張子まで入れた名前を指定してください。
ファイル名だけを指定しておくと、カレントディレクトリ(curdir)に保存されます。
フルパスで指定すると指定したフォルダの指定した名前で保存されます。
HSPの描画先ウィンドウがウィンドウがフルカラーモードの場合は24bitカラーで、
ウィンドウがパレットモードなら256色で保存されます。
これ以外の16色だとか32bitといった指定はすることができません。
buffer 2
picload "bomb.bmp"
wx = winx
wy = winy
screen 0, wx, wy * 2
gcopy 2, , , wx, wy
pos 0, wy : gcopy 2, , , wx, wy
dialog "bmp", 17," 爆発画像サンプル"
if stat= = 0 : end ; キャンセル・エラーが出ると保存せずに終了する
name = refstr
strmid check, name, -1, 4 ; 拡張子が付けられているかチェック
if check != ".bmp" : name+ = ".bmp"
bmpsave name
stop