2015年10月15日

AltHSPをMeryのマクロ内で動かす

(2016/04/23 追記)

 AltHSPの公開サイトがGitHubに変更されたのに合わせて記事を修正。

AltHSPとは

 AltHSPは、HSPよりも簡潔な独自の構文で書かれたスクリプトをHSPスクリプトに変換するコンバーターです。AltHSPの構文は、主にHSPのモジュール機能がらみのコードを簡潔に書くために作られていますが、その他にループを簡潔に書ける構文なども用意されています。独自の構文が用意されていない部分については、HSPの構文でそのまま書くことができます。

 AltHSP自体はJavaScriptで書かれていて、簡単にウェブページに組み込んで利用できる形で公開されており、動作確認のためのサンプルのhtmlファイルも本体と共にダウンロードできます。

AltHSPはデフォルトの利用方法ではMeryマクロ内で動かせない

 私が普段使っているMeryというテキストエディタが、JavaScript(JScript)でマクロを書いて機能を拡張できるようになっているので、このAltHSPを組み込んで、AltHSPスクリプトを一発で「コンバート→コンパイル→デバッグ実行」できるマクロを作りたいと思ったのですが、デフォルトで想定されているjQueryをインクルードする形では、(JavaScriptをよく知っている人からすれば当然のことなのだろうとは思いますが)Meryのマクロ内では動かすことができません。

AltHSPをMeryマクロに組み込む方法

 そこで、幸いAltHSPで使われているjQueryの機能が$.trim、$.grep、$.mapの3つのメソッドだけだったので、jQueryをインクルードする代わりに、これらのメソッドを自分で書いて、それをくっつける形でマクロに組み込むことにしました。以下がそのコードです(jQueryのマニュアルを参考にして書きましたが、完璧ではないかも)。

var $ = 
{
trim: function( t )
{
var newt = t.replace( /^(\s+|\s+|\u3000+)/g, '' );
return newt.replace( /(\s+|\s+|\u3000+)$/g, '' );
},
map: function( a, f )
{
var newa = [];
for( var i in a )
newa.push( f( a[i] ) );
return newa;
},
grep: function( a, f )
{
var newa = [];
for( var i in a )
{
if ( f( a[i] ) )
newa.push( a[i] );
}
return newa;
}
};


このコードを例えば、AltHSPのコードの前にくっつけて、さらにそれを自作のマクロのコードにコピペするなりインクルードするなりして使います。

AltHSPを組み込んで作った、AltHSPスクリプトを一発でデバッグ実行するMeryマクロのサンプル

#include "myalthsp-0.0.1.js" // 上に載せた独自コードをくっつけたAltHSP

var fs = new ActiveXObject('Scripting.FileSystemObject');
var shell = new ActiveXObject('WScript.Shell');
var doc = Document;

//althspスクリプト保存
doc.Save();

//hspスクリプト保存
var hspScr = convertAltHSP( doc.text );
var hspScrPath = doc.FullName + ".hsp";
var ts = fs.CreateTextFile( hspScrPath, true, false );
ts.Write( hspScr );
ts.Close();

//保存したhspスクリプトを実行
var cmd = "C:\\Users\\hoge\\hsp34\\chspcomp.exe /id"; // 自分の環境に合わせて書き換える
shell.Run( cmd + ' "' + hspScrPath + '"' );


 サンプルなので、単一ファイルのコンバートしかできません。マクロ自体と処理対象のAltHSPスクリプトをUTF-8の文字コードで書いたものを使って、Windows7で最低限の動作確認をしました。

 HSPスクリプトをコンパイル・実行するために使っているプログラムは、こちらで公開している自作のプログラムです。似たような別のプログラムでもいけるはずです。
posted by chrono at 13:45| Comment(0) | TrackBack(0) | HSP

2015年05月25日

HSPでGTK+のシグナルハンドラの呼び出し時に引数が正常に使えるようになった

 今まではHSPからGTK+を使う時に既存のコールバック実装プラグインを利用していて、シグナルハンドラの引数を参照しようとすると、システムエラーが出てスクリプトが落ちてしまうことが多く困っていたが、tds12さん作のモジュール(公開場所:http://hsp.tv/play/pforum.php?mode=all&num=62130)を利用することでシグナルハンドラの引数が自由に使えるようになった。

 モジュールのnewclbk3命令を呼び出す時に、p4に1(CLBKMODE_CDECL)を指定する。

※ https://github.com/kitachro/hsp-gtk/tree/master/tutorialでHSPからWindows用のGTK+を使うプログラムのサンプルを公開しています。
posted by chrono at 06:46| Comment(0) | TrackBack(0) | HSP

2015年02月10日

[HSP] 適当に作ったヘクスマップ描画ルーチン(改良版)

horizontal_hex_map_20150210.png vertical_hex_map_20150210.png

 正六角形を描けるかどうかはわからないけど、とりあえず数学の知識が要らない方法ということで。

#module
/* 横xi番目、縦yi番目のヘクスを横向きに描画 */
#deffunc draw_horizontal_hex int hex_width, int hex_height, int xi, int yi

if (xi \ 2) { ; 横奇数番目
yoffset = hex_height / 2 ; 縦方向の描画位置を半分ずらす
}
else {
yoffset = 0
}

xstart = ( hex_width / 4 * 3 ) * xi ; ヘクスをぴったり囲む四角形の左上X座標
ystart = hex_height * yi + yoffset ; ヘクスをぴったり囲む四角形の左上Y座標

; 左上の頂点から左回りで線を引いていく
line xstart + ( hex_width / 4 ), ystart, xstart, ystart + ( hex_height / 2 )
line xstart, ystart + ( hex_height / 2 ), xstart + ( hex_width / 4 ), ystart + hex_height
line xstart + ( hex_width / 4 ), ystart + hex_height, xstart + ( hex_width / 4 * 3 ), ystart + hex_height
line xstart + ( hex_width / 4 * 3 ), ystart + hex_height, xstart + hex_width, ystart + ( hex_height / 2 )
line xstart + hex_width, ystart + ( hex_height / 2 ), xstart + ( hex_width / 4 * 3 ), ystart
line xstart + ( hex_width / 4 * 3 ), ystart, xstart + ( hex_width / 4 ), ystart
return

/* 指定されたマス数・倍率のマップを横向きヘクスで描画 */
#deffunc draw_horizontal_hex_map int def_hex_width, int def_hex_height, int xnum, int ynum, int scale_map, int winid

; 描画に必要なサイズでウィンドウを初期化
map_width = ( ( def_hex_width / 4 * 3 * xnum ) + ( def_hex_width / 4 ) ) * scale_map + 1
map_height = ( def_hex_height * ynum ) * scale_map + 1
screen winid, map_width, map_height
title "ID " + winid

repeat xnum
xcnt = cnt
if ( xcnt \ 2 ) { ; 横奇数番目
ynum_cur = ynum - 1 ; 1個少なくてよい
}
else {
ynum_cur = ynum
}
repeat ynum_cur
draw_horizontal_hex ( def_hex_width * scale_map ), ( def_hex_height * scale_map ), xcnt, cnt
loop
loop
return "" + map_width + "," + map_height ; 描画サイズを返す
#global

#module
/* 横xi番目、縦yi番目のヘクスを縦向きに描画 */
#deffunc draw_vertical_hex int hex_width, int hex_height, int xi, int yi

if (yi \ 2) { ; 縦奇数番目
xoffset = hex_width / 2 ; 横方向の描画位置を半分ずらす
}
else {
xoffset = 0
}

xstart = hex_width * xi + xoffset ; ヘクスをぴったり囲む四角形の左上X座標
ystart = ( hex_height / 4 * 3 ) * yi ; ヘクスをぴったり囲む四角形の左上Y座標

; 上側の頂点から左回りで線を引いていく
line xstart + ( hex_width / 2 ), ystart, xstart, ystart + ( hex_height / 4 )
line xstart, ystart + ( hex_height / 4 ), xstart, ystart + ( hex_height / 4 * 3 )
line xstart, ystart + ( hex_height / 4 * 3 ), xstart + ( hex_width / 2 ), ystart + hex_height
line xstart + ( hex_width / 2 ), ystart + hex_height, xstart + hex_width, ystart + ( hex_height / 4 * 3 )
line xstart + hex_width, ystart + ( hex_height / 4 * 3 ), xstart + hex_width, ystart + ( hex_height / 4 )
line xstart + hex_width, ystart + ( hex_height / 4 ), xstart + ( hex_width / 2 ), ystart
return

/* 指定されたマス数・倍率のマップを縦向きヘクスで描画 */
#deffunc draw_vertical_hex_map int def_hex_width, int def_hex_height, int xnum, int ynum, int scale_map, int winid

; 描画に必要なサイズでウィンドウを初期化
map_width = def_hex_width * xnum * scale_map + 1
map_height = ( ( def_hex_height / 4 * 3 * ynum ) + ( def_hex_height / 4 ) ) * scale_map + 1

screen winid, map_width, map_height
title "ID " + winid

repeat ynum
ycnt = cnt
if ( ycnt \ 2 ) { ; 縦奇数番目
xnum_cur = xnum - 1 ; 1個少なくてよい
}
else {
xnum_cur = xnum
}
repeat xnum_cur
draw_vertical_hex ( def_hex_width * scale_map ), ( def_hex_height * scale_map ), cnt, ycnt
loop
loop
return "" + map_width + "," + map_height ; 描画サイズを返す
#global

; マス数・倍率・ウィンドウIDを指定してマップ描画
def_hex_width = 32 ; ヘクスのデフォルトの幅(横向き時。4で割れる数が良い)
def_hex_height = 28 ; ヘクスのデフォルトの高さ(横向き時。2で割れる数が良い)
xnum = 7 ; 横マス数
ynum = 8 ; 縦マス数
scale = 1 ; 描画倍率(正整数)
draw_horizontal_hex_map def_hex_width, def_hex_height, xnum, ynum, scale, 0
draw_vertical_hex_map def_hex_height, def_hex_width, ynum, xnum, scale, 1
stop

posted by chrono at 17:43| Comment(0) | TrackBack(0) | HSP

2015年02月04日

[HSP] 適当に作ったヘクスマップ描画ルーチン

hex_map_id0.png hex_map_id1.png

 ゲーム制作経験ない人が勢いで作ったので細かいところが少しおかしいかも。

#module
#const HEX_WIDTH_DEF 36 ; ヘクス横幅デフォルト(4の倍数)
#const HEX_HEIGHT_DEF 32 ; ヘクス縦幅デフォルト(2の倍数)

/* 横xi番目、縦yi番目のヘクスを横向きに描画 */
#deffunc draw_hex int xi, int yi, int scale_hex

HEX_WIDTH = HEX_WIDTH_DEF * scale_hex ; 描画するヘクス横幅
HEX_HEIGHT = HEX_HEIGHT_DEF * scale_hex ; 描画するヘクス縦幅

if (xi \ 2) { ; 横奇数番目
yoffset = HEX_HEIGHT / 2 ; 縦方向の描画位置を半分ずらす
}
else {
yoffset = 0
}

xstart = ( HEX_WIDTH / 4 * 3 ) * xi ; ヘクスをぴったり囲む四角形の左上X座標
ystart = HEX_HEIGHT * yi + yoffset ; ヘクスをぴったり囲む四角形の左上Y座標

; 左上の頂点から左回りで線を引いていく
line xstart + ( HEX_WIDTH / 4 ), ystart, xstart, ystart + ( HEX_HEIGHT / 2 )
line xstart, ystart + ( HEX_HEIGHT / 2 ), xstart + ( HEX_WIDTH / 4 ), ystart + HEX_HEIGHT
line xstart + ( HEX_WIDTH / 4 ), ystart + HEX_HEIGHT, xstart + ( HEX_WIDTH / 4 * 3 ), ystart + HEX_HEIGHT
line xstart + ( HEX_WIDTH / 4 * 3 ), ystart + HEX_HEIGHT, xstart + HEX_WIDTH, ystart + ( HEX_HEIGHT / 2 )
line xstart + HEX_WIDTH, ystart + ( HEX_HEIGHT / 2 ), xstart + ( HEX_WIDTH / 4 * 3 ), ystart
line xstart + ( HEX_WIDTH / 4 * 3 ), ystart, xstart + ( HEX_WIDTH / 4 ), ystart
return

/* 指定されたマス数・倍率のマップを横向きヘクスで描画 */
#deffunc draw_hex_map int xnum, int ynum, int scale_map, int winid

; 描画に必要なサイズでウィンドウを初期化
map_width = ( ( HEX_WIDTH_DEF / 4 * 3 * xnum ) + ( HEX_WIDTH_DEF / 4 ) ) * scale_map
map_height = ( HEX_HEIGHT_DEF * ynum ) * scale_map
screen winid, map_width, map_height
title "ID " + winid

repeat xnum
xcnt = cnt
if ( xcnt \ 2 ) { ; 横奇数番目
ynum_cur = ynum - 1 ; 1個少なくてよい
}
else {
ynum_cur = ynum
}
repeat ynum_cur
draw_hex xcnt, cnt, scale_map
loop
loop
return "" + map_width + "," + map_height ; 描画サイズを返す
#global

; マス数・倍率・ウィンドウIDを指定してマップ描画
xnum = 7 ; 横マス数
ynum = 5 ; 縦マス数
scale = 1 ; 描画倍率(正整数)
id = 0 ; 描画するウィンドウID
draw_hex_map xnum, ynum, scale, id

; 描画サイズ取得
sizestr = refstr
split sizestr, ",", wid, hei
wid = int( wid )
hei = int( hei )

; 90度回転して別ウィンドウにコピー
screen 1, hei, wid
title "ID 1"
gmode 0, wid, hei
pos ( hei / 2 ), ( wid / 2 )
grotate id, 0, 0, 1.57, wid, hei
stop
posted by chrono at 19:40| Comment(0) | TrackBack(0) | HSP