HSP Dishのウインドウへの拡大表示やフルスクリーンについて考える


2026年 8月 19日
 
 
 HSP Dishでのウインドウに合わせた拡大表示やフルスクリーンについて考えてみる(HSP Ver3.7)

 方法としては現時点では viewcalc命令を使う方法、SCREEN 0,x,y,256のように 3番目に 256を指定する方法、celbitmap命令を使う方法とあるが。

 viewcalcは可能性がある、
 SCREEN 0,x,y,256の方法は挙動が安定しない、
 celbitmapは色々いじってみたが現時点では使い物にならないと思う。
 
 

 拡大表示について考えてみる。

 最近は 4kモニターみたいのもあるし、制作予定ゲームの等倍想定の 960 × 540ドットだと表示が小さい可能性がある、そのため 2倍表示や 3倍表示をできる機能が欲しい。


 
 
 HSPだと簡単な話で、仮想画面に等倍で全部描いたものをメインスクリーンに一度だけ拡大表示すれば済む。

 ところが HSP Dishだと仮想画面が作れない、全てメインである 0スクリーンに描き込む仕様なので、スクリーンの大きさに合わせて「座標と表示を拡大指定する」方法しかない。

 なんと、これを簡単に実現する方法があった viewcalc命令を使う方法である。

viewcalc vptype_2d,n,n

 nに倍率を書く、これを一回書くだけで以降座標と拡大の修正を全部自動でしてくれる。

#include "hsp3dish.as"

	bai=2 ; 倍率

	screen 0,240*bai,180*bai

	viewcalc vptype_2d,bai,bai ; 表示倍率設定

	repeat
	 redraw 0
	  color 1,1,1 : boxf
	  color 255,255,255
	   pos 110,80 : mes "〇"
	 redraw 1
	 await 100
	loop

 
 おそらくこの場合、スクリーンのドット数と同じ描画処理を行うと思うので、スクリーンが大きくなればなるほど表示速度が遅くなる可能性はある。

 Linuxでも veiwcalc命令を試してみたが機能した。
 
 
 
 次にフルスクリーンについて考えてみる。

 フルスクリーンなら拡大表示の最終手段としても考えられる。

 HSPDishにもフルスクリーンモードがあって SCREEN 0,x,y,256、3番目に 256を指定する、これでフルスクリーンにはなるけど、ウインドウズでは OSで指定できる画面の大きさで無いとエラーになるし、そのように指定してもエラーになる場合がある、いまいち挙動が安定しない。

 忘れてたけど HSP3.7(HSP3.6β2から)では hsp3dish.iniファイルを用意してスクリーンサイズを設定する必要が無くなったみたい screenと bgscrで設定できるようになったそうな。
 
 
 Linuxの HSP Dishの SCREEN 0,x,y,256を試してみた。

 OSの解像度は 1280 × 720 青い部分がそうで、screenには 640 × 360と書いて実行してる、黒い boxfの部分は 640 × 640。

 つまり screenの設定は反映されない、合わせて拡大表示も別にしない、OSの画像解像度いっぱいに一応フルスクリーンにはなる。

 よって結論的に言うと HSP Dishで SCREEN 0,x,y,256によるフルスクリーンには期待できない。

 余談で Linuxでの HSPも Alt + F4キーによる強制終了ができた。
 
 
 以上考えて、拡大表示と同じように ginfoでモニターの解像度を調べてその大きさに合わせてスクリーンを作り、表示物個別に座標と倍率を拡大指定して表示する、という面倒な方法しか思い浮かばない。
 
 
 
 celbitmap命令を試してみる。

 この命令は画像の内容を読みだして変数に変換したり、その変数を元に描画する方法。

 次のような方法で表示はできる。

#include "hsp3dish.as"

	cox=64 : coy=64 ; キャラの大きさ
	 dim cd,cox*coy ; グラフィックデータ

	screen 0,360,240

	buffer 2,cox,coy,screen_offscreen ; 読み出し用スクリーン

	celload "pggo.png",3 ; 画像
	 celdiv 3,cox,coy

	gsel 0
	 pos 0,0 : celput 3,0 ; メイン画面へ画像を描く

	celbitmap 2,cd,16 ; 変数へ読み出し

	celbitmap 2,cd ; 変数からバッファへ書き込み

//表示
	redraw 0
	 repeat 10
	  pos 10,cnt*20
	  mes strf("[%x]",cd(cnt+2000)) ; 変数サンプル
	 loop

	 pos 140,10
	  celput 2,0,2.0,2.0
	redraw 1

 

 この場合 2倍表示をしてる、しかしこれだけだと別に buffer3の画像を普通に拡大表示するのと変わらない。
 
 
 そこで screen 0に等倍で書いたものを変数にして、もう一度 screen 0に拡大表示できないかやってみる。

 理論的にはこれで良いはずなんだけど

#include "hsp3dish.as"

	bai=2 ; 倍率

	cox=64 : coy=64 ; キャラの大きさ
	 dim cd,cox*coy ; グラフィックデータ

	scx=180 : scy=120 ; スクリーンの大きさ
	 dim scd,scx*scy ; スクリーンのデータ

	screen 0,scx*bai,scy*bai ; メインスクリーン

	buffer 2,scx,scy,screen_offscreen ; バッファスクリーン

	buffer 3,cox,coy,screen_offscreen ; キャラ読み出し用

	celload "pggo.png",4 ; キャラ
	 celdiv 4,cox,coy

	gsel 0
	 pos 0,0 : celput 4,0

	celbitmap 3,cd,16 ; 変数へ読み出し

	celbitmap 3,cd ; 変数からバッファへ書き込み


//表示
	gsel 0
	redraw 0

	 pos 0,0
	  celput 3,,2.0,2.0 ; キャラ表示

	 celbitmap 2,scd,16 ; 変数へ読み出し

	 celbitmap 2,scd ; 変数からバッファへ書き込み

	 pos 0,0
	  celput 2,,bai,bai

	redraw 1

 
 読み込みがうまく行ってない感じ、redraw 0の書き込み以降はダメとか?

追記 : なぜかスクリーン Xの幅が 256ドット固定になるみたいです、それから最下段の書き込みができてない不具合もあるみたいです。

元の表示はこんな感じ、これをデータにして 2倍表示してる

 と言う訳で scx=256と書いて定義すれば想定通り機能しました、しかしこれだと screenの元の大きさは幅 256ドット固定と言う事になります。

 マニュアルにも buffer 2,256,256,screen_offscreenのように書いてあるので、今の所 256,256で固定なのかもしれません。

 そんな訳で celbitmap命令で、一度 screen 0に描いた物をデータに読み込んで、拡大最表示する方法は、現時点では幅 256ドットのスクリーンのみでできる、と言う事になる。
 
 
 次はデータの配列変数を直接書き換えて、それをスクリーンに拡大表示する方法。

 メインスクリーンのデータにキャラのデータを部分的に上書きする。

 これまた理論的にはこれでできるはずなんだけど

#include "hsp3dish.as"

	bai=2 ; 倍率

	cox=64 : coy=64 ; キャラの大きさ
	 dim cd,cox*coy ; グラフィックデータ

	scx=180 : scy=120 ; スクリーンの大きさ
	 dim scd,scx*scy ; スクリーンのデータ

	screen 0,scx*bai,scy*bai ; メインスクリーン

	buffer 2,scx,scy,screen_offscreen ; バッファスクリーン

	buffer 3,cox,coy,screen_offscreen ; キャラ読み出し用

	celload "pggo.png",4 ; キャラ
	 celdiv 4,cox,coy

	gsel 0
	 pos 0,0 : celput 4,0

	celbitmap 3,cd,16 ; 変数へ読み出し

	x=100 : y=100
	repeat coy : cnt2=cnt
	 repeat cox
	  scd(x+cnt+((y+cnt2)*scx))=cd(cnt+cnt2*cox)
	 loop
	loop

	celbitmap 2,scd ; 変数からバッファへ書き込み

//表示
	gsel 0
	redraw 0

	 pos 0,0
	  celput 2,,bai,bai

	redraw 1

 
 やっぱりずれた表示になる、原因は不明。

追記 : なぜかスクリーン Xの幅が 256ドット固定になるみたいです、それから最下段の書き込みができてない不具合もあるみたいです、いずれにしても使い物にはならないかと。
 
 
 
 と言う訳で最後に、256 × 256の背景を用意して、背景とキャラをデータにして、データを加工してからそれを表示する、というのをやってみます。

#include "hsp3dish.as"

	bai=2 ; 倍率

	cox=64 : coy=64 ; キャラの大きさ
	 dim cd,cox*coy ; グラフィックデータ

	scx=256 : scy=256 ; スクリーンの大きさ
	 dim scd,scx*scy ; スクリーンのデータ
	 dim hid,scx*scy ; 背景のデータ

	screen 0,scx*bai,scy*bai ; メインスクリーン

	buffer 2,scx,scy,screen_offscreen ; バッファスクリーン


	buffer 3,cox,coy,screen_offscreen ; キャラ読み出し用

	celload "pggo.png",4 ; キャラ
	 celdiv 4,cox,coy

	gsel 0
	 pos 0,0 : celput 4,0

	celbitmap 3,cd,16 ; 変数へ読み出し


	buffer 5,scx,scy,screen_offscreen ; 背景読み出し用

	celload "haikei.png",6 ; 背景

	gsel 0
	 pos 0,0 : celput 6,0

	celbitmap 5,hid,16 ; 変数へ読み出し


//メイン

	x=scx/2-cox/2 ; キャラ座標
	y=scy/2-coy/2

	repeat

	 stick s,15
	 if s=2 and y>0 : y- ; 上
	 if s=8 and y<scy-coy : y+ ; 下
	 if s=1 : x- : if x<0 : x=scx ; 左
	 if s=4 : x+ : if x>scx-1 : x=0 ; 右

; 背景
	 n=0
	 repeat scx*scy
	  scd(n)=hid(n)
	  n+
	 loop

; キャラ
	 repeat coy : cnt2=cnt
	  repeat cox
	   scd(x+cnt+((y+cnt2)*scx))=cd(cnt+cnt2*cox)
	  loop
	 loop

	 celbitmap 2,scd ; 変数からバッファへ書き込み

//表示
	 gsel 0
	 redraw 0

	  pos 0,0
	   celput 2,,bai,bai

	 redraw 1

	 await 1000/20
	loop

 
 当然だけど黒を透過しない、この画像だと分からないけど、なぜか背景の最右と最下の 1ドットラインが黒線になってる。

 倍率表示は問題ない、baiの値を変えてやればウインドウごと拡大表示になる。

 変数の都合上、左右はまたぐ、当然だけど透過処理も加算処理も素ではできない。

 真ん中の -16777216の数字はキャラの黒の部分の値。

 これを使って黒の部分は変数を上書きしないようにする。

	 repeat coy : cnt2=cnt
	  repeat cox
	   if cd(cnt+cnt2*cox)=-16777216 : continue
	   scd(x+cnt+((y+cnt2)*scx))=cd(cnt+cnt2*cox)
	  loop
	 loop

 

 さて、これらの方法は実用的なんだろうか。
 
 
 scxの値(スクリーンの横幅)を 256から 257にしてみる。

 ズレてる、やっぱり 256固定みたい。
 
 
 Linuxでもやってみたけど、こちらは真っ黒表示で celbitmap命令は何も機能してない感じだった。
 
 
 以上、と言う訳で celbitmap命令にも現時点では期待できそうにない。
 
 
 他に Artlet2Dと言うモジュールが仮想画面を作れると書いてあったので試してみたけど Dishでは表示されなかった。
 
 
 
 と言う訳で今回は拡大表示はあきらめます。

 等倍の仕様でそのまま進め、完成したら倍率表示に改造する、と言う事にします。
 
 
 HSP Dishでの buffer画面や、そのメインスクリーンへの拡大転写の機能が、そのうち実装か改善されると良いですね。
 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です