HSPに投稿されたコード一覧

HSP BlendModeのVividLight

	screen 1, 256, 256
	title "base color : bottom layer"
	repeat 256
		y = cnt
		repeat 256
			x = cnt
			i = x
			color i, i, i
			pset x, y
		loop
	loop

	screen 2, 256, 256
	title "blend color : top layer"
	repeat 256
		y = cnt
		repeat 256
			x = cnt
			i = 255 -y
			color i, i, i
			pset x, y
		loop
	loop

	screen 0, 256, 256
	title "final output"
	repeat 256
		y = cnt
		repeat 256
			x = cnt

			base_i = double(x) /255.0
			blend_i = double( 255 -y ) /255.0
		#if 0
				// まちがい
			if ( blend_i < 0.5 ) {
				final_i = base_i / ( 1.0 - 2.0*blend_i )
			} else {
				final_i = 1.0 - ( 1.0-base_i ) / ( 2.0 * ( blend_i - 0.5 ) )
			}
		#else
				// ただしくはこっち
					// 0除算扱いになってしまうのでガードを適当に
			if ( blend_i < 0.5 ) {
				div = ( 2.0 * blend_i )
				if ( div > 0.0 ) {
					final_i = 1.0 - ( 1.0-base_i ) / div
				} else {
					final_i = 0.0
				}
			} else {
				div = ( 1.0 - 2.0*(blend_i-0.5) )
				if ( div > 0.0 ) {
					final_i = base_i / div
				} else {
					final_i = 1.0
				}
			}
		#endif
				// clamp
			final_i = limitf( final_i, 0.0 , 1.0 )

			i = int( 255.0 * final_i )
			color i, i, i
			pset x, y
		loop
	loop

HSP 子孫ウィンドウを列挙する

#module ED
#uselib "User32.dll"
#cfunc ED_GetWindow "GetWindow" int, int

// EnumDescendants handle, result
// handleのウィンドウハンドルを持つウィンドウの子孫を列挙し、ウィンドウハンドルを配列でresultに代入します
// resultは予め0で初期化(dim result を実行)してください
#deffunc EnumDescendants int handle, array result, local child, local flag
	// 最初の子ウィンドウを取得
	child = ED_GetWindow(handle, 5/*GW_CHILD*/)
	// 子ウィンドウが存在する限りループ
	while child
		// 既にresultにあるものは除く(このような場合が存在するのか分からないが、念のため)
		// 万が一巡回参照があった場合、この作業を行わないと無限ループに陥る
		flag = 1
		foreach result
			if result(cnt) == child {
				// 初出ではないウィンドウの模様
				flag = 0
				break
			}
		loop
		if flag {
			// どうやら初出のウィンドウらしいので、resultに追加
			if result(0) {
				// 末尾に追加
				result(length(result)) = child
			} else {
				// 最初の代入なので、添字0に代入
				result(0) = child
			}
			// 再帰
			EnumDescendants child, result
		}
		// 次の子ウィンドウを取得
		child = ED_GetWindow(child, 2/*GW_HWNDNEXT*/)
	wend
	return
#global

HSP ifブロックのコンパイルエラー例2つ

// 例1
// '}'が内側のifに対応すると判断される。
// '}' の前に改行があると問題なし
if 1 { if 1 : mes "a" : else : mes "b" } mes "c"

// 例2
// else の検出に失敗する。
if 1 { mes "a" } : else

// ちなみにこういうのはok
if 1 : { mes "a" } else
if 1 : *label { mes "a" } else

HSP Start.AXのコードセグメントをテキストに書き出す

#cmpopt varinit 1

	dialog "ax", 16, "HSP Object File"
	if stat == 0 : end
	filename = refstr

	// 読み込み
	exist filename
	axsize = strsize
	if axsize < 0 : end

	sdim axdata, axsize
	bload filename, axdata

	// 形式チェック(簡易)
	if lpeek(axdata,0) != 0x33505348 {
		dialog "AXじゃない", 1
		end
	}

	// 使いやすいように別変数にとっとく
	dupptr hsphead, varptr(axdata), 96, 4
	dupptr codeseg, varptr(axdata)+hsphead(4), hsphead(5), 2

	// 出力用変数準備
	sdim res, hsphead(5) / 4 * 41 + 256
	sdim data

	res = "OFFSET 48bit Ex0 Ex1 Ex2 TYPE CODE (JUMP)\n\n"

	// CSをなめる
	dim csptr
	dim csptr_b
	dim resptr
	resptr = strlen(res)
	repeat
		if csptr >= hsphead(5) {
			// 探索終了
			break
		}

		csptr_b = csptr

		// ExやType等取得
		info = wpeek(codeseg, csptr)
		Is48 = info >> 15 & 1
		Ex2  = info >> 14 & 1
		Ex1  = info >> 13 & 1
		Ex0  = info >> 12 & 1
		Type = info & 0x0FFF
		csptr += 2

		// Code取得
		if Is48 {
			Code = lpeek(codeseg, csptr)
			csptr += 4
		} else {
			Code = wpeek(codeseg, csptr)
			csptr += 2
		}

		// TYPE_CMPCMDのときはジャンプ先が記録されている
		// それを取得する
		Jump = -1
		if Type == 11/*TYPE_CMPCMD*/ {
			Jump = wpeek(codeseg, csptr)
			csptr += 2
		}

		// 形式にそって書き出し
		if Jump >= 0 {
			data = strf("%08X %d %d %d %d %4d %08X %08X\n", csptr_b, Is48, Ex0, Ex1, Ex2, Type, Code, csptr+(Jump<<1))
		} else {
			data = strf("%08X %d %d %d %d %4d %08X\n", csptr_b, Is48, Ex0, Ex1, Ex2, Type, Code)
		}
		memcpy res, data, strlen(data), resptr
		resptr += strlen(data)
	loop

	// ファイルに保存
	notesel res
	notesave filename+".txt"
	noteunsel

	// 保存したファイルを開く
	exec filename+".txt", 16

	end
	

HSP HGIMG3でテクスチャのUV座標を変化させてスクロール

; HSP 3.4
#include "hgimg3.as"

	hgini

	setfont 16, 16, 12, 1
	texload dir_exe + "/sample/hgimg3/fontchr.bmp"

	texload dir_exe + "/hsptv/hsptv_img.bmp"
	addplate id, 0, 400, 300, 0, 0, 120, 90, stat
	regobj bg, id
	setpos bg, , , -300

	setcolor 250, 250, 100
	addbox id, 10, 10
	regobj box, id

	clscolor $000080

*mainLoop

	delevent ev
	newevent ev
	event_uv ev, sin(0.022 * frm) * 100, cos(0.033 * frm) * 100
	setevent bg, ev

	setang bg, sin(0.0045 * frm), cos(0.0067 * frm), sin(0.0089 * frm)
	addang box, 0.02, 0.03, 0.04

	hgdraw

	fprt "" + frm, 10, 10

	hgsync 16

	frm++

	goto *mainLoop

HSP Aeroの有無で描画見た目がどう変わるかのテスト

; HSP 3.4
#uselib "dwmapi"
#func DwmEnableComposition "DwmEnableComposition" int

	if (varptr(DwmEnableComposition) == 0) {
		dialog "Aero非対応です"
		end
	}
	c = "Aero OFF", "Aero ON"
	f = 1
	button gosub c, *btn
*mainLoop
	redraw 0
	color 255, 255, 255
	boxf
	color
	x = cos(0.04 * t) * 200 + 320
	y = sin(0.04 * t) * 200 + 240
	s = 10
	circle x - s, y - s, x + s, y + s
	if (t & 1) {
		x = 320
		y = 240
		s = 60
		circle  x - s, y - s, x + s, y + s
	}
	t++
	redraw
	await 20
	goto *mainLoop
*btn
	f ^= 1
	DwmEnableComposition f
	objprm 0, c
	return

HSP struct型変数への代入(HspVarStruct_Set)はメモリ解放のみ行いデストラクタを呼ばない

#module foo n_
#modinit int n
	n_ = n
	mes "init #" + n_
	return
#modterm
	mes "term #" + n_
	return
#global

newmod obj1, foo, 1
newmod obj2, foo, 2
obj1 = obj2 // obj1のインスタンスfoo{1}が破棄されるがmodtermが呼ばれない

// kill all
dim obj1
dim obj2

HSP 着弾点の予想と目標距離まで飛ばすための発射角の計算

;
;	着弾予測
;
;弾道、飛距離、の予想。弾丸の発射が行えます。
;

#include "hspmath.as"	; asinで使用

;	定数
#const BULLET_FRAME  50
groundTop = 400.0	; 地面の高さ
gravity = -1.0		; 重力
velocity = 20.0		; 初速

;	初期値
bulletPosX = 50.0	; 弾丸座標
bulletPosY = 0.0	; 弾丸座標
firingAngle = 45.0 * M_PI / 180.0	; 発射角度[rad]
setHikyori = 200.0	;設定飛距離(この飛距離を出すための発射角度を算出します。)

flgShot = 0			; ショットフラグ
vx = 0.0
vy = 0.0

ddim courseOfBullet, BULLET_FRAME, 2	; 弾道座標データ

;-----------------------------------------------------------
;
;	メインループ
;
*main
	redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color 0,0,0 : pos 0,0

	stick key, 1|2|4|8|128

	; --------------
	;	終了
	; --------------
	if key&128 : end

	; --------------
	;	発射角度
	; --------------
	if key&2 : firingAngle += 1.0 * M_PI / 180.0
	if key&8 : firingAngle -= 1.0 * M_PI / 180.0

	; --------------
	;	発射
	; --------------
	if key&16 : flgShot = 1

	; --------------
	;	物理計算
	; --------------

	;	重力
	if int(bulletPosY) > 0 {
		vy += gravity
	} else {
		vx = 0.0
		vy = 0.0
	}

	;	ショット
	if flgShot = 1 {
		;	初速
		vx = velocity * cos(firingAngle)
		vy = velocity * sin(firingAngle) + gravity / 2.0
			;微調整のため適当に1/2しています。最初だけ1/2倍しないと計算が大きくずれるようです。
			;射出時は地面に付いているのでってことで、詳細な考察は省略。
		flgShot = 0
	}

	;	予備計算
	px = bulletPosX
	py = bulletPosY
	px += vx
	py += vy

	;	地面
	if py < 0.0 {
		;予測地点が地面にめり込む場合
		bulletPosX += vx * bulletPosY/-vy
		bulletPosY = 0.0
	} else {
		bulletPosX += vx
		bulletPosY += vy
	}

	;	弾道計算
	gosub *CalcDandou

	;	飛距離予測計算
	gosub *CalcHikyori

	; --------------
	;	描画
	; --------------
	line 0, groundTop, ginfo_winx, groundTop
	gosub *PlotDandou
	gosub *PlotBullet
	pos 0, 0 : color 0,0,0
	mes "現在の座標:" + bulletPosX + ", " + bulletPosY
	mes "予想飛距離:" + yosouHikyoriX
	mes "予想座標  :" + (bulletPosX + yosouHikyoriX) + ", 0.0"
	mes "予想角度(距離 " + setHikyori + "):" + rad2deg(yosouKaku) + " [deg] or " + (90.0-rad2deg(yosouKaku)) + " [deg]"

	goto *main

;-----------------------------------------------------------
;
;	弾道軌道描画
;
*PlotDandou
	; --------------
	;	弾道軌道
	; --------------
	color 200, 200, 200
	x  = courseOfBullet(0, 0)
	y  = courseOfBullet(0, 1) * -1 + groundTop
	pos x, y
	repeat BULLET_FRAME-1, 1
		x = courseOfBullet(cnt, 0)
		y = courseOfBullet(cnt, 1) * -1 + groundTop
		line x, y
	loop
	return

;-----------------------------------------------------------
;
;	弾丸描画
;
*PlotBullet
	; --------------
	;	発射角度
	; --------------
	x = bulletPosX
	y = -bulletPosY + groundTop
	r = 30.0
	dx =  r * cos(firingAngle) + x
	dy = -r * sin(firingAngle) + y
	color 0,0,255
	line x, y, dx, dy
	mes strf("%.2f", (firingAngle*180.0/M_PI) ) + " [deg]"
	mes "Up:↑/Down:↓"

	; --------------
	;	弾丸
	; --------------
	x = bulletPosX
	y = -bulletPosY + groundTop
	r = 5
	color 0,0,0
	circle x-r, y-r,  x+r, y+r
	return

;-----------------------------------------------------------
;
;	弾道予想計算
;
*CalcDandou
	cvx = velocity * cos(firingAngle)
	cvy = velocity * sin(firingAngle) + gravity/2.0
	;0フレーム目
	courseOfBullet(0, 0) = bulletPosX
	courseOfBullet(0, 1) = bulletPosY
	;1フレーム目
	repeat BULLET_FRAME-1, 1
		courseOfBullet(cnt, 0) = courseOfBullet(cnt-1, 0) + cvx
		courseOfBullet(cnt, 1) = courseOfBullet(cnt-1, 1) + cvy + gravity * (cnt-1)
	loop
	return

;-----------------------------------------------------------
;
;	飛距離予想計算
;
*CalcHikyori
	;重力加速度:g
	;t秒後の移動距離:x,y
	;ただし上向きを正とする
	;したがって重力加速度gは g<0 である。
	;着弾点は射出点との高低差0とする。
	;
	;時刻tのときの距離座標x,yは次式のようになる。
	;
	;	x = vx0 * t
	;	y = 1/2*g*t^2 + vy0 * t
	;
	;着弾点と射出点は高低差0なので y = 0 のときの t を求める
	;(なお高低差0以外ならy=高低差として計算すれば良い。)
	;
	;	0 = 1/2*g*t^2 + vy0 * t
	;	  = t(1/2*g*t + vy0)
	;
	;	(1/2*g*t + vy0) = 0
	;	1/2*g*t = -vy0
	;	t = -vy0 * 2/g
	;
	;y = 0となるtは、
	;	t = 0
	;	t = -vy0 * 2/g
	;t = 0は射出時なので、t = -vy0 * 2/g となる。
	;このときxは
	;
	;	x = vx0 * t
	;	  = vx0 * -vy0 * 2/g
	;
	;射出角をrとしたとき
	;	vx0 = v0 * cos(r)
	;	vy0 = v0 * sin(r)
	;
	;したがってxは次のようになる。
	;
	;	x = -v0^2 * cos(r) * sin(r) * 2/g
	;
	;xがそのまま距離なので

	yosouHikyoriX = -1.0 * velocity * velocity * cos(firingAngle) * sin(firingAngle) * 2.0 / gravity

	;
	;xを任意の値に決めたい場合のrを求める。
	;	x = -v0^2 * cos(r) * sin(r) * 2/g
	;	cos(r) * sin(r) = x / (-v0^2) * g/2
	;
	;ここで加法定理
	;	sin(x+y) = sin(x) * cos(y) + cos(x) * sin(y)
	;	y=xの場合
	;	sin(2*x) = 2 * sin(x) * cos(x)
	;	1/2 * sin(2*x) = sin(x) * cos(x)
	;
	;したがって
	;	cos(r) * sin(r) = x / (-v0^2) * g/2
	;	1/2 * sin(2*r) = x / (-v0^2) * g/2
	;	sin(2*r) = x / (-v0^2) * g
	;	2 * r = asin( x / (-v0^2) * g )
	;	r = 1/2 * asin( x / (-v0^2) * g )
	;となり角度を求めることができる。rは複数でるがどれを用いても良い。
	;

	yosouKaku = asin( setHikyori / (-velocity * velocity) * gravity ) / 2.0

	return

HSP nazr.inのサービスを使ってアドレスを短縮するスクリプト

/*
	nazr.inのサービスを使ってアドレスを短縮するスクリプト
	と、それを関数一つを呼び出して取得できるようにするモジュール

	nazr.in/docs/devのテキストAPIを使用します。

*/

#if 1

; 普通に呼び出す
#include "hspinet.as"
	NetInit	; net系命令を初期化
	TargetURL  = "http://miyahiro-shiki.com/"	; 短縮するアドレス
	ServiceURL = "http://nazr.in/api/shorten?url="	; nazr.in APIのアドレス
	NetUrl GetPath(ServiceURL,32)	; APIのアドレスを指定して
	NetRequest_Get GetPath(ServiceURL,8)+TargetURL	; ダウンロード開始
	res = 0
	While(res==0)
		NetExec res	; 処理を続ける
	WEnd
	if(res){
		NetGetV ret	; 変数へ結果を移す
		mes ret	; 出力
	} else {
		mes "miss"
	}
	NetTerm	; net系命令の終了
	stop

#else

; モジュールでラッピングしたバージョン
; 前提MODとしてhspinet.asが必要
#include "hspinet.as"
#module NazrinAPI
; 短縮されたアドレス = GetNazrin(短縮するアドレス)
#defcfunc GetNazrin str p1
	if strlen(p1) == 0 :return "error"	; 空ならば処理しない
	NetInit@	; とりあえずの初期化
	TargetURL  = p1
	ServiceURL = "http://nazr.in/api/shorten?url="	; nazr.in APIのアドレス
	NetUrl@ GetPath(ServiceURL,32)	; APIのアドレスを指定して
	NetRequest_Get@ GetPath(ServiceURL,8)+TargetURL	; ダウンロード開始
	res = 0
	While(res==0)
		NetExec@ res	; 処理を続ける
	WEnd
	if(res){
		NetGetV@ ret	; 変数へ結果を移す
	} else {
		ret = "miss"
	}
;	NetTerm@	; 解放はしない
return ret
#global

	; 呼び出してみる
	mes GetNazrin("http://miyahiro-shiki.com/")
	stop

#endif

HSP タスクバーを考慮してウィンドウを中央寄せ

;
;	ウィンドウ中央表示(タスクバー考慮)
;
; タスクバーを考慮してウィンドウを中心寄せで配置します。
; ウィンドウが大きすぎてディスプレイサイズを超える場合は、左上が必ずディスプレイ内に入るよう調整。
;

;-----------------------------
;	タスクバー位置サイズを取得
;-----------------------------
#uselib "user32"
#func FindWindow "FindWindowA" str, int
#func GetWindowRect "GetWindowRect" int, int

dim RECT, 4
FindWindow "shell_traywnd"
GetWindowRect stat, varptr (RECT)

mes rect(0)	;L
mes rect(1)	;T
mes rect(2)	;R
mes rect(3)	;B

tw = rect(2) - rect(0)	;幅
th = rect(3) - rect(1)	;高さ

/*
	タスクバーの位置
	L!0 右
	T!0 下
	R!ginfo_dispx 左
	B!ginfo_dispy 上
*/

;-----------------------------
;	ウィンドウ作成
;-----------------------------
w = 1800+500	;横幅
h = 600	;高さ
screen 0, w, h

;-----------------------------
;	ウィンドウ位置を調整
;-----------------------------
w = ginfo_sizex
h = ginfo_sizey
l = 0
t = 0

;	右
if rect(0)!0 {
	l = (ginfo_dispx - tw - w) / 2
	t = (ginfo_dispy - h) / 2
}

;	下
if rect(1)!0 {
	l = (ginfo_dispx - w) / 2
	t = (ginfo_dispy - th - h) / 2
}

;	左
if rect(2)!ginfo_dispx {
	l = (ginfo_dispx - tw - w) / 2 + tw
	t = (ginfo_dispy - h) / 2 + th
}

;	上
if rect(3)!ginfo_dispy {
	l = (ginfo_dispx - w) / 2
	t = (ginfo_dispy - th - h) / 2 + th
}

if l<0 : l = 0
if t<0 : t = 0
width ,,l,t
Total Pages: 3 / 22123451020...最後 »

よく投稿されているコード

タグ

最近投稿されたコード