「Hot Soup Processor」はフリーソフト! Yahoo!ブックマーク に追加 はてなブックマーク に追加

ツール&ゲームの作成に「HSP」(Hot Soup Processor)はフリーウェア!ONION software のおにたまさんが製作されてるスクリプト言語システム『HSP』(Hot Soup Processor)の開発環境は、完全にフリーウェア(無料・無償)です。HSPは明日になったら突如としてフリーウェアでなくなっちゃうようなシロモノでもありません。

すでにHSP3は「OpenHSP」としてコア部分にあたるソースコード(C++言語)自体もオープンになってます。タダでWindowsプログラミングができ、最終的にはプログラムを実行ファイル(EXEファイル)として出力できます。
 著作権は作成者にあるので、HSPで作成したゲームやらツールを自分のホームページで配布したり、営利的な販売(たとえばシェアウェア、同人ソフト)なんかも自由にできますー。(^^)/

詳しくはHSPに付属する『HSPシステムドキュメント・インストールガイド (hsp3.htm) 』の「HSPによって作られたソフトウェアの ライセンスについて」の項目を参照のこと。

努力次第で実用ツールやスクリーンセーバーの製作、ゲームプログラミング(パズルゲーム、シューティングゲーム、アドベンチャーゲーム、シミュレーションゲーム、ノベルゲーム、アクションゲーム、RPG、3Dゲームなど・・・)なんかがHSPで実現可能です。拡張プラグインを別途利用することになりますが、DirectXも呼び出せます。
 HSPを使ってどんなプログラムを生み出せるかは、2003年から毎年開催されてるプログラムコンテスト(開発元であるONION software主催)の出品作をチェックすればいいカモ。

HSPの公式サイトにフリーであることは一応書かれているにもかかわらず、HSP公式掲示板でコレについて質問してくる人がたまーに・・・。もし、仮にシェアウェア(有料・有償)であったとすれば、値段なり支払い方法なり、そのことを公式サイトにある程度目立つように書いとかないと、いろいろと問題になっちゃうでしょう。(^ー^;

☆ 関連サイト

HSP(HSP3)ってどんなコードを書いてくの?

たとえばこんな感じ。

これを実行すると「Hello World! こんにちは〜」という文字が表示されたウィンドウが開きます。 文字色を赤色にしたい!、大きめの文字サイズ(フォント)で表示したい!、 なんてな感じで続けていくと、下のようにコードになっていく感じ。

;	普通に文字表示
	mes "Hello World! こんにちは〜"
	stop
;	文字色の指定 (RGB値)
	color 255, 0, 0	// 赤色

	mes "Hello World! こんにちは〜"
	stop
;	文字のフォントと表示サイズの指定
	font "MS UI Gothic", 40

	mes "Hello World! こんにちは〜"
	stop

この中で登場する「mes」とか「color」というのがHSPの命令です。命令はアルファベット(英数字)を 使った文字で指令します。別に英語が分からなくても大丈夫。英語の文章を書いたり、英会話をするわけではないので、最低限 アルファベットを認識できてキーボードで文字を打てればOK。

「mes」という文字の直後には半角スペースを入れて、表示文字の前後には「"」(ダブルクォーテション)で くくる必要があります。「mes」という命令は「"」の中の文字を表示せよ、という処理です。この命令名の由来は 英単語の「messsage」(メッセージ)から来たものです。
 「color」は表示色を指令する命令です。英単語の「色」という意味ですな。この命令はRGB値の形式で指定します。 半角の「,」(コンマ)で区切って、それぞれR(赤)、G(緑)、B(青)の数値を指定してます。

「hsed3.exe」がコードを編集するスクリプトエディタです。エディタ上で命令文字の部分にカーソルを置いて「F1キー」を押すと、HSPヘルプブラウザ(HSP Document Library)が起動して、該当する命令の説明が表示されるので読んでみましょう。別に説明を暗記する必要はありません。

ちなみに、半角のセミコロン(;)やスラッシュ2つ(//)は「コメント」と呼ばれるもので、プログラムの処理にはいっさい影響しない注釈(ちゅうしゃく)です。何をしている部分か説明したり、コードをスキップする場合に利用します。

次に、四角形、1本ライン、円のような図形を描画するスクリプトコード。(ちなみに、ここでは書きませんが、BMPファイル/GIFファイル/JPEGファイルのような画像ファイルを読み込んで表示することもデキル)

	color 0, 255, 0
;	四角形を表示
	boxf 50, 50, 100, 100

	color 0, 255, 255
;	1本線を表示
	line 0, 0, 150, 160

	color 0, 0, 255
;	円を表示
	circle 150, 150, 300, 350

Windowsのアプリケーションでよくお目にかかるオブジェクト(コントロール)も用意できます。
 ボタンオブジェクトを設置して、そのボタンを押したらダイアログがポンッと表示されるコード。アスタリスクの「ラベル」という処理が登場します。

	button "押して!", *push
	stop

*push
	dialog "ボタンを押しましたね(^^)"
	stop

その他の雑多なサンプルコードいろいろと。へっぽこペイントサンプルビューアーカラーコードチェッカーシステムアイコンの描画パスワードジェネレータアプリケーションランチャーRSSフィードの表示。筆者はHSPでゲームの類をまったく製作しないので、 楽しめる要素はないです。→擬似3Dワイヤーフレームレンダリングモジュールd3moduleはクール!
 最初は理解不能かもしれませんが、実際にHSPを入手してマニュアル を読んでくだされ。レッツ HSPプログラミングゥ〜

ものすごくベーシックなもので、数値の10をループ内で減らしていき表示させてます。ほとんど同じようなことを 繰り返す処理用にrepeat-loop命令を用意してます。

//	10からカウントダウン表示 (by Kpan)

	value = 10
	repeat 10
;		文字列の描画
		mes value

;		1減らす
		value--

;		1秒ウェイト
		wait 100
	loop

	mes "発射!!!(って何が?"

小学校で習う九九の表(っぽいの)を表示するコード。わざと1段づつ出現させてます。文字の追加結合にpoke命令、 数値の桁ぞろえ変換にstrf関数を利用してます。

//	九九の表示 (by Kpan)

	font "MS ゴシック", 40, 2 | 16
	color 255

	sdim data

	repeat 9
		value++

		i = 0
		repeat 9, 1
			poke data, i, strf("%2d ", cnt * value)
			i += strsize
		loop

		mes data

;		0.5秒の処理待ち
		wait 50
	loop

流れる文字。文字を表示してクリアして、位置を変えて再び同じ文字を表示して・・・、をひたすら繰り返してます。 目の錯覚で動いているように見えてしまうアニメーションの原型ですな。(このコードはパフォーマンスを考えると、 あんまりいい組み方をしてないです。バッファ画面にあらかじめ文字を描画させおいて切り取りコピーしてくるのが王道?)

//	へっぽこ流れるテキスト (by Kpan)

	font "MS UI Gothic", 50, 1 | 16

	repeat
;		描画の一時停止
		redraw 0

;		塗りつぶしクリア
		color
		boxf

		color 0, $FF, 0
		pos 0, posy * 10
		mes "こんにちは、HSP"

		posy++
		if posy > ginfo(13) / 10 : posy = 0

		color 0, 0, $FF
		pos posx * 5, 100
		mes "Hello World!"

		posx++
		if posx > ginfo(12) / 5 : posx = -40

;		描画の再開
		redraw 1

		await 50
	loop

へっぽこペイント

ペイントとは名ばかりですが、マウスでお絵かき。rnd関数で乱数(バラバラ数値)を発生させてテキトーな装飾。

//	へっぽこペイント (by Kpan)

	repeat
		redraw 0

;		左クリックのチェック
		getkey check, 1
		if check {
			color rnd(255), rnd(255), rnd(255)
			line mousex, mousey
circle mousex-rnd(10),mousey-rnd(10),mousex+rnd(10),mousey+rnd(10)
		}

		pos mousex, mousey

		redraw 1

		await 16
	loop

HSPサンプルビューアー

HSPの開発環境にはサンプルファイル(「hsp31\sample」フォルダ)がいくつか用意されてるんですが、その中の 「basic」フォルダにあるサンプルスクリプトを閲覧するビューアー。左側のファイルリストから選択してボタンを押すと、 右側のボックスに読み込んだファイルの中身を表示させる仕組み。(ユーザビリティを考えてちゃんと作成したものはコチラ

//	HSP付属サンプルファイルの閲覧ツール (by Kpan)
//	スクリプトエディタの設定で[全般]-[ディレクトリ]→[起動時のカレント
//	ディレクトリ]を「指定なし」に設定しておく必要あり

	title "簡易サンプル閲覧ツール by Kpan"

	sdim filelist, 1024
	sdim filename
	sdim buf, 4096

;	サンプルファイル(Basic)をリストアップ
	dirlist filelist, "sample\\basic\\*.hsp", 3

	objsize 110, 30

	index = -1
	listbox index, 400, filelist

	pos , 419
	button "表示", *load
	button "編集", *edit

	objmode 2
	font "MS ゴシック", 14

	pos 110, 0
	mesbox buf, 530, 480, 5

	stop

*load
	gosub *getname

;	HSPスクリプトの読み込み
	notesel filebuf
	noteload "sample\\basic\\"+filename+""

;	HSPスクリプトをメッセージボックスに表示
	objprm 3, filebuf

	stop

*edit
	gosub *getname

;	HSPスクリプトエディタの起動
	exec "sample\\basic\\"+filename+"", 16

	stop

*getname
	if index = -1 : stop

;	リストボックスのインデックス番号からファイル名取得
	notesel filelist
	noteget filename, index

	return

カラーコードチェッカー

RGB(光の三原色)カラーを表示するツール。トラックバーコントロールでRGB値をいじれるようにしてあります。 はっきり言って、ここから下のスクリプトはHSPプログラミングの基礎知識ではとてもカバーできない処理がポツポツでてきます。(^^;

//	簡易カラーコードチェッカー (by Kpan)

#define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16)

	screen 0, 230, 80
	title "Color Code Checker by Kpan"

;	WM_HSCROLL
	oncmd gosub *hscroll, $114

	dim value_color, 3

;	トラックバー
	pos 65, 10
	repeat 3
		winobj "msctls_trackbar32", "", , $50000000 | $100, 150, 20
		hTrackbar.cnt = objinfo(stat, 2)

;		TBM_SETRANGEMAX (0〜255)
		sendmsg hTrackbar.cnt, $408, , 255
	loop

	gosub *draw_circle

	stop

*hscroll
	if lparam = hTrackbar.0 {
;		TBM_GETPOS
		sendmsg lparam, $400
		value_color.0 = stat

		gosub *draw_circle

		return
	}

	if lparam = hTrackbar.1 {
		sendmsg lparam, $400
		value_color.1 = stat

		gosub *draw_circle

		return
	}

	if lparam = hTrackbar.2 {
		sendmsg lparam, $400
		value_color.2 = stat

		gosub *draw_circle

		return
	}

	return

*draw_circle
;	円形で塗りつぶし
	color value_color.0, value_color.1, value_color.2
	circle 10, 20, 55, 65

;	タイトルバーに「#RRGGBB」表示
	value_rgb = RGB(value_color.2, value_color.1, value_color.0)
	title "Color Code - "+strf("#%06X", value_rgb)

	return

システムアイコンの描画表示

Windowsのシステム(shell32.dll)に含まれてるアイコンイメージの画像をズラズラっと描画表示するコードです。 Win32 API関数を使って、アイコンの取得と描画を行わせてます。

//	システムアイコンの描画表示 (by Kpan)

#include "shell32.as"
#include "user32.as"

	filepath = dirinfo(3) + "\\shell32.dll"

;	アイコン数の取得
	ExtractIconEx filepath, -1, 0, 0, 0
	if stat = 0 : stop

	title "システムアイコン描画 by Kpan ["+stat+"コ]"

;	アイコンハンドルの取得
	dim phIconLarge, stat
	ExtractIconEx filepath, 0, varptr(phIconLarge), 0, stat

;	アイコンイメージの描画
	repeat stat
		DrawIcon hdc, cnt \ 20 * 32, cnt / 20 * 32, phIconLarge.cnt
		DestroyIcon phIconLarge.cnt
	loop

	redraw

パスワード文字列ジェネレータ

乱数を使ってまったくデタラメなパスワード文字列を生成するツール。「数字」+「アルファベット小文字」の 組み合わせだけ生み出せるようになってます。Win32 API関数を呼んだり、 桁指定できるようアップダウンコントロールを用意してます。まだまだ機能を用意できますが、それでも実用的な シロモノです。

//	簡易パスワードジェネレータ (by Kpan)

#include "user32.as"

#define ctype MAKELONG(%1,%2) (%1) & $FFFF | (%2) << 16

	screen , 350, 90
	title "簡易パスワードジェネレータ by Kpan"

	randomize

	sdim pass
	dim kouho, 10

	objmode 2
	font "MS ゴシック", 30, 16 | 1

;	生成したパスワードが表示されるボックス
	pos 10, 10
	input pass, 330, 38
	SetWindowLong objinfo(stat, 2), -16, $50010080 | $2

	objmode 1

;	桁数を指定するボックス (8〜20ケタ)
	pos 220, 61
	input keta, 40, 22, 2

;	アップダウンコントロール
	winobj "msctls_updown32", "", , $50000012 | $4
	sendmsg objinfo(stat, 2), $465, , MAKELONG(20, 8)
	objprm 1, 8

	objsize 70, 22

	pos 270, 60
	button "生成", *create

	stop

*create
	if keta < 8 : stop

;	パスワード文字列生成
	repeat keta
		repeat 10
			if rnd(2) {
;				数字
				kouho.cnt = $30 + rnd(10)
			} else {
;				アルファベット小文字
				kouho.cnt = $61 + rnd(26)
			}
		loop

		poke pass, cnt, strf("%c", kouho.rnd(10))
	loop

	objprm 0, pass

アプリケーション起動ランチャー

へっぽこなアプリケーション起動ランチャー。設定を保存しとく処理は用意してません。ボタンのシフトキー押しで 実行ファイルの登録、ついでにボタン上に実行ファイルのアイコンを表示。(Windows XP以降のビジュアルスタイル時に ボタンのデザインがクラシックスタイルに変身してしまう仕様がありますが、対処は処理が増えるのでパス)

//	へっぽこランチャー(by Kpan)

#include "user32.as"
#include "shell32.as"

#define BS_ICON $40
#define BM_SETIMAGE $F7
#define SHGFI_ICON $100

	screen , 120, 120, 2
	title "へっぽこランチャー by Kpan"

	onexit *exit

	sdim filepath, 256, 4
	dim SHFILEINFO
	dim hIcon, 4

	syscolor 15
	boxf

	objsize 50, 50

	pos 10, 10
	button "", *execute
	hButton.0 = objinfo(stat, 2)
	SetWindowLong hButton.0, -16, $50000000 | BS_ICON

	pos 60, 10
	button "", *execute
	hButton.1 = objinfo(stat, 2)
	SetWindowLong hButton.1, -16, $50000000 | BS_ICON

	pos 10, 60
	button "", *execute
	hButton.2 = objinfo(stat, 2)
	SetWindowLong hButton.2, -16, $50000000 | BS_ICON

	pos 60, 60
	button "", *execute
	hButton.3 = objinfo(stat, 2)
	SetWindowLong hButton.3, -16, $50000000 | BS_ICON

	gsel , 2

	stop

*execute
	id_obj = stat

;	シフトキー押しで実行ファイル登録
	getkey key, 16
	if key {
		dialog "exe", 16, "実行ファイル"
		if stat = 0 : stop
		filepath.id_obj = refstr

;		実行ファイルのアイコンハンドル取得
	SHGetFileInfo filepath.id_obj, 0, varptr(SHFILEINFO), 4, SHGFI_ICON
		if stat = 0 : stop

		if hIcon.id_obj {
			DestroyIcon hIcon.id_obj
		}
		hIcon.id_obj = SHFILEINFO.0

;		ボタンにアイコンイメージを反映
		sendmsg hButton.id_obj, BM_SETIMAGE, 1, hIcon.id_obj

		stop
	}

;	実行ファイルの有無確認
	exist filepath.id_obj
	if strsize = -1 : stop

;	実行ファイルの起動
	exec filepath.id_obj, 16

	stop

*exit
;	アイコンハンドルの解放
	foreach hIcon
		DestroyIcon hIcon.cnt
	loop

	end

RSSフィードの表示 (Yahoo!トップニュース)

HSP(HSP3)はCOMにも対応してるので、「XML DOM」という機能を使ってXMLファイルを処理してるコード。Yahoo!の トップニュースのRSSフィードデータを取得してきて、意味もなくメニューバーに表示させて ます。項目をクリックすると、ブラウザが起動して記事ページへジャンプ。

//	RSSフィードをメニューに表示 (by Kpan)

#include "mod_menu.as"

#define ctype LOWORD(%1) (%1 & $FFFF)

;	Yahoo!ニュースRSS
#define URL "http://dailynews.yahoo.co.jp/fc/rss.xml"

	title "Yahoo!トップニュース フィード by Kpan"

	oncmd gosub *command, WM_COMMAND

;	XML DOM
	newcom oDom, "Microsoft.XMLDOM"
	oDom("async") = "false"
	oDom->"load" URL

	elm_title = oDom("getElementsByTagName", "title")

	count = elm_title("length")
	if count = 0 : dialog "error" : stop

	elm_link = oDom("getElementsByTagName", "link")

;	文字列型配列変数
	sdim data_title, 128, count
	sdim data_link, 256, count

	repeat count
		node = elm_title("item", cnt)
		data_title.cnt = node("text")

		node = elm_link("item", cnt)
		data_link.cnt = node("text")
	loop

	delcom node
	delcom elm_title
	delcom elm_link
	delcom oDom

;	メニュー表示
	newmenu hMenu.1, 1
	repeat count - 1, 1
		addmenu hMenu.1, data_title.cnt, cnt
	loop

	newmenu hMenu.0
		addmenu hMenu.0, data_title.0, hMenu.1, $10

	applymenu hMenu.0
	
	stop

;	WM_COMMAND
*command
	if lparam = 0 {
;		ブラウザでURLアドレスを開く
		exec data_link.LOWORD(wparam), 16

		return
	}

	return

HSPユーザーによるHSP講座サイトのリンク集。

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク