スクリーンセイバー

いつものEXEではなく「たまにはスクリーンセイバー(以下SCR)を作ろうよ」と言うことでSCR作成をしましょう。

サンプルは「HSPインストールフォルダ\sample\ssaver」内にありますが、

サンプルを見たがわからないとかここで教わりたい(いないって)と言う方の為にこの章をご用意しました。

付属のサンプルのものと説明がほとんど変わりませんので結局わからないまま終わるかもしれません(^^;

スクリーンショットは次の通り。

お判りのことと思いますがコードに入る前に作り方がEXEとどう違うのかを書いておきますね。

 1.コード(スクリプト)を完全に仕上げる
 2.start.axを作成する
 3.PACKFILEにstart.axとSCRに必要な音楽・画像を入れる
 4.ツールメニューの「スクリーンセイバー作成」を押す

上を見て判るかと思いますが通常のEXEと違うのは4番のスクリーンセイバー作成を押すところだけですね。

スクリプトの書き方が微妙に変わるだけでほぼ同じと言うことで安心してください。

 

それではスクリプトに最低限記述すべきことから入って行きたいと思います。

以前から何度か出てきていますが、外部からHSPに渡すことのできるメッセージのひとつに

システム変数cmdlineというものが存在しまして、SCRはこのcmdlineを使用して何をするのかを決定します。

SCRにはセーバーを実際に実行すると言うこと以外にプレビュー画面やSCRの設定をする画面がございます。

これらの処理もHSP側でしてしまわないとWINDOWSは理解できません。

cmdlineの話に戻しまして、送られてきたコマンドラインの2文字目がキーポイントとなっており、

この2文字目に何が来たかで処理を変更させなければなりません。

2文字目に「pのアスキーコード(112)」が来たらプレビュー部分に表示させる処理を記述します。

2文字目に「cのアスキーコード(99)」が来たら設定画面部分の処理を記述します。

2文字目に「sのアスキーコード(115)」が来たら実際に実行された場合の処理を記述します。

アスキーコードが何も来なかった場合にも設定画面処理のところにジャンプさせましょう。

それ以外のコードが来たら「そのコードはありません」と言ったようなことを表示してあげましょう。

	tmp=cmdline ; 直接peekに送るとエラーになるため一旦変数に代入
	peek code,tmp,1 ; 0から始まるので2文字目は1になる
	if code=='p' : goto *プレビューの処理
	if code=='c' | (code==0) : goto *設定画面処理
	if code=='s' : goto *実行画面処理
	dialog "コードが不正です"
	end

上記のように書いていけばよいと思います。

 

ではプレビュー部分の処理から説明していきましょうか。

プレビュー部分とは「画面のプロパティ - スクリーンセーバータグ」内の

ディスプレイ画像部分に表示される画像のところのことです。

表示する大きさは152*112くらいでしょうか。

私のところでは

内容は静止画にするか動画にするかは皆さんにお任せいたします。

どういう流れかを示すのでしたら動画にするとインパクトが出るのではないでしょうか。

*p
	boxf ,,152,112 : color 255,255
	font "MS 明朝",15
	pos 48,50 : mes "PREVIEW"
	stop

 

コマンド「c」又はコマンドなしでは「設定」ボタンを押したときに表示するウィンドウを作成します。

実際ココで設定した設定によりSCRに変化をつけなければなりません。

*c
	width 320,240
	title "設定ウィンドウ"

; ココに設定するものを書く

	stop

設定ファイルの読み込み・保存の仕方は何度もやってきましたのでもうご存知ですね?

まだ少し不安な方は6章をご参照ください。

 

で、最後にSCR実行画面の処理を記述しましょう。

まずbgscrでディスプレイ全体のサイズを作成します。

そしてその後実行中の処理を書いていけばSCRの完成です。

マウス・キーボードのチェックをして動かされたら終了するといった処理は必要ありません。

SCRですので自動的に終了してくれます。

FAQにも書きましたがwaitが20回ないとうまく終了できないようです。

ループさせずstopするSCRでも初めに20回空回りでもさせておきましょう。

*s
	repeat 20
		wait 1
	loop
	bgscr 2,dispx,dispy
	stop ; 通常は停止せずループさせる(止まる様ではセーバーの意味がなくなってしまう)

空回しをしているのだがスクリーンセイバーの画面IDが2未満である場合もうまく行かなかったりします。

1でうまく行ったりしても使ってはいけませんよ。

これでSCR作成手順説明を終了します。

この章でダウンロードできるスクリプトはSCRの原型だけです。どうぞコチラから。

 

最後にサンプルSCRを書いておきます。

	dim code,4
	dim index,1
	dim col,3
	dim count,3
	dim ichi,2
	exist "samplesaver.ini"
	if strsize!=-1 : bload "samplesaver.ini",index : int index
	dx=dispx/16 : dy=dispy/16
	buffer 2,dx*2,dy,0
	tmp=index+1
	repeat 16
		if tmp & 1 : col.0=cnt*16 : else : col.0=0
		if tmp & 2 : col.1=cnt*16 : else : col.1=0
		if tmp & 4 : col.2=cnt*16 : else : col.2=0
		color col.0,col.1,col.2
		boxf cnt*5/4,cnt*5/4,dx-(cnt*5/4)-1,dy-(cnt*5/4)-1
	loop
	tmp=cmdline ; 直接peekに送るとエラーになるため一旦変数に代入
	peek code,tmp,1 ; 0から始まるので2文字目は1になる
	if code=='p' : goto *p
	if code=='c' | (code==0) : goto *c
	if code=='s' : goto *s
	dialog "コードが不正です"
	end

*p
	gsel 0
	repeat
		if count=0 : count=16 : count.1=0 : count.2+ : ichi.0=0 : ichi.1=0
		if cnt\2 : count-
		repeat count
			pos 160/16*ichi.0,112/16*ichi.1 : gzoom 160/16,112/16,2,1-(count.2\2)*dx,0,dx,dy
			wait 3
			if count-1=cnt : count.1+
			if count.1\4=0 : ichi.0+
			if count.1\4=1 : ichi.1+
			if count.1\4=2 : ichi.0-
			if count.1\4=3 : ichi.1-
		loop
	loop

*c
	screen 0,230,100
	title "サンプルセーバーの設定"
	int index
	color 192,192,192 : boxf : color
	objsize 100,25
	pos  10,18 : mes "箱の色の設定"
	pos 120,15 : combox index,100,"赤色\n緑色\n黄色\n青色\n紫色\n水色\n灰色"
	pos  10,65 : button "キャンセル",ok
	pos 120,65 : button "OK",ok
	stop

*ok
	if stat==2 : bsave "samplesaver.ini",index,1
	end

*s
	repeat 20
		wait 1
	loop
	bgscr 3,dx*16,dy*16
	repeat
		if count=0 : count=16 : count.1=0 : count.2+ : ichi.0=0 : ichi.1=0
		if cnt\2 : count-
		repeat count
			redraw 0
			pos dx*ichi.0,dy*ichi.1 : gcopy 2,1-(count.2\2)*dx,0,dx,dy
			redraw
			await
			if count-1=cnt : count.1+
			if count.1\4=0 : ichi.0+
			if count.1\4=1 : ichi.1+
			if count.1\4=2 : ichi.0-
			if count.1\4=3 : ichi.1-
		loop
	loop

指定色のボックスを埋めていくSCRです。

埋めていく方法はTIPSに出て来た螺旋状に描画していく方法を改良したものです。

152×112の横幅152が160となって計算しているのは152÷16をすると9(9.5)になってしまい

9×16でプレビューウィンドウには幅144ドット分(約1ボックス)空いてしまうんです。

ですので仕方なしに横10ボックスにするため160としたわけです。