Hot Soup Processor(HSP)って何? 実際に使ってみる

#はじめに

こんにちは、フリーソフトなどを個人で開発しているオニオンソフトウェアの代表「おにたま」です。
ゲーム系のソフト開発会社に勤めるかたわら、趣味で作り始めたHot Soup Processor(ＨＳＰ)は、国産の手軽なプログラミングツールとして、1994年から開発が開始され、1996年以降フリーウェアとして公開されています。
主として個人用、ゲームやツール開発などのホビー向けに利用されており、アマチュア向け初心者向けのツールとしては、国内で幅広いユーザー層と歴史があります。関連書籍として、「無料ツールでゲームプログラミングＨＳＰ編」(エンターブレイン刊)、「はじめてのプログラミングHSP3.4+Dish超入門」(秀和システム刊)など２０数冊が発売されています。

HSPには、次のような特長があります。

- 簡単に覚えられる強力な命令セットと付属エディタにより初心者でもすぐに使い始めることができます
- 作ったプログラムは実行ファイルに変換して自由に再配布が可能、ライセンス料も不要です
- WEBブラウザ(html5)、android,iOS(OpenGL)上で動作するサブセット環境が用意されています
- 拡張プラグイン・モジュールにより3D表示や通信など数多くの機能を追加可能です
- USBIO、arduinoなど外部ハードウェア制御のためのライブラリを同梱しています
- 20年以上に渡る多くのユーザー資産と使用実績があります
- 詳細なマニュアルとリファレンスヘルプシステムを装備しています
- 純国産のツールとして書籍資料なども豊富です
- 仕様及び処理内容はオープンソースとして公開されています

まだまだ足りない部分もありますが、HSPを通してプログラミングの楽しさを発見してもらえたら嬉しいです。

ホームページ http://hsp.tv/

#開発環境のインストール

HSPは、インストーラーを使って簡単に環境を導入することができます。すべての機能は無償(修正BSDライセンス)で提供されています。
フルセット版のインストーラーを実行してインストールを行なうことで、HSP本体、HSPスクリプトエディタ、マニュアルドキュメント、サンプルスクリプトなどすべてが設定され使い始めることができます。

HSPダウンロードページ http://hsp.tv/make/downlist.html
HSPオンラインマニュアル http://www.onionsoft.net/hsp/v35/

#HSPの文法について

公式ページに初心者向けの入門講座が用意されています。
http://hsp.tv/make/enroll.html

ここでは、ある程度プログラミングをかじった人に向けて具体的な作成例などを紹介していきたいと思います。

HSPはインタプリタ言語です。スクリプトと呼ばれる、テキストで書かれたソースリストを中間言語に変換してから実行を開始します。
HSPフルセットに付属するHSPスクリプトエディタを起動すれば、スクリプトを入力して[F5]キーですぐに実行させることができます。

![hsed3.jpg](https://qiita-image-store.s3.amazonaws.com/0/149767/bcb3b177-aec3-ecea-8d24-82922d8142cc.jpeg)

HSPは、オーソドックスなBASIC言語をベースに、記述方法などが単純化されています。「命令+パラメータ」という形式が１つの実行単位になり、上の行から順番に実行されます。たとえば、「mes "test"」という実行文は「test」という文字列を表示するという意味になります。BASIC言語のprintステートメント、C言語のprintf関数に近いものです。記述のルールとして、１行に複数の命令を記述する場合は、「:(コロン)」で区切る必要があるほか、「;(セミコロン)」以降はコメントとして扱われるという仕様になっています。それでは、実際に簡単なスクリプトを作成してみたいと思います。
この記事で使用しているサンプルスクリプトは以下のURLからダウンロードすることができます。
http://www.onionsoft.net/hsp/file/hspsamp.zip

#サンプルスクリプトの作成(1)

簡単な画像や文字の表示例をsample1.hspに示します。このサンプルでは、「title.bmp」というファイル名の画像を画面に表示した後、大きなフォントで「HSPサンプルアプリケーション」という文字列を表示します。そして、プログラムを終了するための「押してください」と書かれたボタンが表示されます。

![samp1.jpg](https://qiita-image-store.s3.amazonaws.com/0/149767/54d774fb-7385-0512-e114-149c9fc281f4.jpeg)

```sample1.hsp
	title "画像とボタンのテスト"
	picload "title.bmp"
	font msgothic,40,1
	pos 50,180
	mes "HSPサンプルアプリケーション"
	pos 220,260
	objsize 200,30
	button "押してください",*jump1
	stop
*jump1
	end
```

プログラムを上から見ていくと、「title命令」でウインドゥのタイトルバーに表示される文字列を指定した後、「font命令」によりフォントの大きさを指定、「pos命令」で表示X,Y位置を指定してから「mes命令」で文字列の表示を行なう…といった流れになっています。
HSPでは、このような単機能の命令を組み合わせることで目的の処理を記述していきます。命令の意味や記述方法がわからない場合は、キャレットを命令に合わせて「F1」キーを押すことで内蔵のヘルプが表示されます。
注意しなければならない点として、picload命令のようにファイル名を指定する場合は、スクリプトと同じ保存場所(フォルダ)に画像ファイルを置いておかないと検索されません。スクリプト1が、「c:\hsp\sample1.as」というフォルダに保存されているとすれば、「c:\hsp\title.bmp」という名前が検索されます。picload命令では、他にもJPEG形式や、PNG形式の画像を読み込むことが可能です。
button命令は、ボタンを配置するとともに、押された場合に実行されるスクリプトの位置を登録します。「button "ボタン名",\*jump1」は、「ボタン名」という文字の書かれたボタンを配置し、押された場合には「\*jump1」というラベルにジャンプすることを意味してます。ラベルは、スクリプト内で「\*jump1」のように「\*」を頭につけた文字列で表されます。

#サンプルスクリプトの作成(2)

変数を使ったもう少し複雑な例を示します。HSPでは変数を使用する場合、宣言をする必要なく、いつでも「変数名=値(または式)」という記述で代入を行なうことができます。
変数名に代入する値が整数値の場合は整数型、文字列ならば文字列型。小数点を含む実数の場合は、実数型として保持されます。

![samp2.jpg](https://qiita-image-store.s3.amazonaws.com/0/149767/0d572ce3-9cf0-c5f1-5d46-efa8066ced47.jpeg)

```sample2.hsp
	title "キャラクタを動かす"

	celload "myship.bmp",3
	screen 0,640,480

	gosub *my_init
*main
	redraw 0
	color 0,0,64
	boxf 0,0,640,480	; 背景を消す

	gosub *my_move

	await 16		; 全体のスピード調節
	redraw 1
	goto *main

*my_init			; 自機の初期化
	mx=280:my=200
	return

*my_move			; 自機の移動と表示
	stick a,15,1
	if a&2 : my=my-6
	if a&8 : my=my+6
	if a&1 : mx=mx-6
	if a&4 : mx=mx+6
	if mx<0 : mx=0
	if mx>512 : mx=512
	if my<0 : my=0
	if my>416 : my=416
	pos mx,my
	gmode 2:celput 3
	return
```

sample2.hspを実行すると、画面中央にカーソルキーで操作することのできる戦闘機のキャラクターが表示されます。
HSPでは、画像ファイルの扱いや、画像の切り出し、コピー、透明色を含む画像転送、αチャンネル合成など基本的な画像処理機能のための命令が用意されています。これらは、ゲームなど画像による演出を行なうアプリケーションで使用することができます。
goto、gosub命令はプログラムの流れを制御するための基本となる命令です。goto命令は、単純に指定されたラベルへのジャンプを行ない、gosub命令は指定されたラベルからreturn命令までをサブルーチンとして呼び出します。また、条件判断をするためのif命令が用意されています。これは、「if 条件 : 実行内容」のようにifに続く条件が成立していれば、その行に含まれる以降の命令を実行するというものです。条件が成立しなかった場合には、次の行が実行されることになります。条件成立時の実行部分を「{」～「}」で囲んで表現することも可能です。
プログラム制御のための命令は、ここまでに出てきたものが基本になります。特に入門者や初心者に向けては、最低限の命令を組み合わせるだけでも、プログラミングの基礎を学習することができ、ある程度のソフトまでは作成することができるようになります。さらに習熟した人に向けては、サブルーチンを別な名前空間で管理するモジュール機能を始め、構造化されたプログラム記述をするための機能が用意されています。

#サンプルスクリプトの作成(3)

次に、複数のキャラクターを同時に動かす処理を記述してみます。基本的には、配列変数を使って複数の内容が保持されたものを操作することになります。HSPで配列変数を扱う場合は、最初にdim命令で配列の範囲を指定した後、「変数名(配列要素)」という記述で表現します。また、多次元配列の場合は「変数名(配列要素1,配列要素2…)」のようにカンマで要素を区切ります。

![samp3.jpg](https://qiita-image-store.s3.amazonaws.com/0/149767/121ebead-6d1d-6dd9-4081-a27b3056757b.jpeg)

```sample3.hsp
	randomize
	title "複数キャラクタを動かす"

	celload "eye.bmp",4
	screen 0,640,480

	gosub *eye_init
*main
	redraw 0
	color 0,0,64
	boxf 0,0,640,480	; 背景を消す

	gosub *eye_move
	gosub *eye_put

	await 16		; 全体のスピード調節
	redraw 1
	goto *main

*eye_init			; 目玉の初期化
	emax=8:etime=0
	dim eflag,emax
	dim ex,emax : dim ey,emax
	dim epx,emax : dim epy,emax
	return

*eye_move			; 目玉の移動
	etime=etime+1
	if etime<15 : return
	etime=0

	;	目玉を発生させる
	x=640
	y=rnd(360)+40
	px=rnd(3)-5
	py=rnd(5)-2
	repeat emax
	if eflag(cnt)=0 {
		eflag(cnt)=1
		ex(cnt)=x : ey(cnt)=y
		epx(cnt)=px : epy(cnt)=py
		break
	}
	loop
	return

*eye_put			; 目玉の表示
	;
	gmode 2
	repeat emax
	if eflag(cnt)=0 : continue
	x=ex(cnt):y=ey(cnt)
	x=x+epx(cnt):y=y+epy(cnt)
	pos x,y : celput 4
	if x<-64 : eflag(cnt)=0
	if x>640 : eflag(cnt)=0
	if y<-64 : eflag(cnt)=0
	if y>480 : eflag(cnt)=0
	ex(cnt)=x:ey(cnt)=y
	loop
	return
```

sample3.hspでは、目玉の形をした複数のキャラクターを画面右から左にランダムに動かしています。
配列変数などの繰り返し構造でよく使われるのが、repeat命令です。repeat命令は、loop命令までの間を指定回数繰り返すためのもので、他の言語におけるfor文や、while、do等といった制御構造に近い記述が可能です。repeat～loop間は、cntという名称のシステム変数(システムが予約済みの変数)をループカウンタとして使用します。これにより、繰り返しを簡潔な形で記述することができます。

#HSPの方向性

HSPは、決して高度で大規模なシステムを支えることを目指しているのではなく、またソフトウェア工学上の革新的な発明をしているわけでもありません。
当初から目指していたことは、すべての人にわかりやすいプログラミングの機会を与えること、そして、プログラミングを通してコンピューターに向き合うという視点を身に付けることです。
プログラミングという手段を、一人でも多くの人が学ぶことで、ソフトウェアを使うだけという受け身の考えから、いままで無かったものは自分で新しく創造するという発想につながることを願っています。
これから、ソフトウェア技術者という観点だけでなく、広い意味での情報テクノロジーを生かした新しい世代が育つものと信じています。HSPが、そういった時代の裾野を広げるために役立つことができるなら、これほど嬉しいことはありません。