genki_hspさんが投稿したコード一覧

HSP みんな遅い遅いって言うから高速動作するstrmid作ったよ

//
// [ Infomation ]
//  Name      : 高速strmid
//  SubName   :
//  Version   : 1.00
//  copyright : GENKI
//
// [ Update history ]
// 2017/09/17 : 1.00 : 完成。
//
// [ Comment ]
//  遅いと指摘され続けてきたstrmid命令の高速動作する互換命令です。
// これまでstrmid命令の代わりにmemcpyを用いて高速化する手法が
// 広く利用されていましたが、当然ながら使いにくくなるという問
// 題を有していました。
//  本モジュールでは内部でmemcpyを用いて高速に動作させつつ、
// 必要な面倒な手続きを省略し、strmidと同じ要領で使用できるよ
// うにしています。
//  使い方は、strmid命令を使用しているスクリプトで本モジュー
// ルをincludeし、strmidをstrmid2に置換するだけで高速に動作す
// るstrmid互換命令を使用できるようになります。
//  なお文字列を右側から取り出す場合は、strmidと同等程度の速
// 度に低下します。
//

;#ifndef __MODULE_NAME__
;#define global __MODULE_NAME__
#module

// ------------------------------------------------------------ //
//
// 関  数  :strmid2
//
// 引  数  :var p1=変数名 : 取り出すもとの文字列が格納されている変数名
//           int p2=-1~   : 取り出し始めのインデックス
//           int p3=0~    : 取り出す文字数
//
// 返り値  :refstr
//           0 : hogehoge
//           1 : hogehoge
//
// 機能説明:
//  strmid命令よりも高速度さする互換命令です。
//  p2に-1を指定した場合は内部でstrmid命令を呼び出します。
//
//  p1で指定した文字列型変数の中から、 p2,p3で指定した条件で文字を取り出したものを返します。
//  p2で取り出し始めるインデックスを指定します。これは、文字列の始まり1文字目を0として、1,2,3...と順番に増えていくものです。1から始まりではないので注意してください。
//  p3で取り出す文字数を指定します。実際に格納されている文字数よりも多く指定した場合は、実際の文字数までが取り出されます。
//  また、p2に-1を指定すると文字列の右からp3で指定した文字数だけ取り出します。
//
//
// ------------------------------------------------------------ //
#defcfunc strmid2 var p_txt, int p_idxStart, int p_lenPickChar
	;--------------------
	;	右から取り出す
	;--------------------
	if p_idxStart<0 {
		;右から取り出す場合は、strlenが遅いのでstrmidを使ったほうが速くなる。
		return strmid(p_txt, p_idxStart, p_lenPickChar)
	}

	;--------------------
	;	引数チェック
	;--------------------
	if p_lenPickChar<=0 {
		return ""
	}

	;--------------------
	;	出力初期化
	;--------------------
	;	出力する文字列
	sdim res_text, p_lenPickChar

	;--------------------
	;	左から取り出す
	;--------------------

	;	取り出す文字数を決定
	;バッファオーバーフロー対策
	i = varsize(p_txt)
	if i - p_idxStart - p_lenPickChar < 0 {
		;	文字数オーバーする場合
		l = i - p_idxStart
	} else {
		l = p_lenPickChar
	}

	;	文字列取り出し
	memcpy res_text, p_txt, l, 0, p_idxStart

	return res_text

#global
;#endif	;__MODULE_NAME__

;-------------------------------------------------------------------------------
;
;	仮実行スクリプト(デバッグ作業用)
;

;#####################################################################
;ここにはデバッグ作業用のスクリプトを記述します。
;ここを有効にするとこのファイル単独での実行が可能になります。
;
;0	:リリースモード 本体側から#includeで連結して動作させる場合です。
;1	:デバッグモード このファイル単品で動作確認が出来ます。
#if 0
	b = "ABCDEF"
	mes b
	mes "- strmid"
	mes strmid(b,-1,3)   ; 右から3文字を取り出す
	mes strmid(b,1,3)    ; 左から2文字目から3文字を取り出す

	mes "- strmid2"
	mes strmid2(b,-1,3)   ; 右から3文字を取り出す
	mes strmid2(b,1,3)    ; 左から2文字目から3文字を取り出す

#endif
;#####################################################################

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 タスクバーを考慮してウィンドウを中央寄せ

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

;-----------------------------
;	タスクバー位置サイズを取得
;-----------------------------
#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

HSP OBAQで「ニュートンのゆりかご」

;
;	OBAQ 「ニュートンのゆりかご」
;
;	スペースキーで動かし始める。
;	調整がうまく行っていないのか途中でバラバラになってしまいます。
;
#include "obaq.as"

;内積
#define global ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))

#module
;	振り子	pendulum
;	num      : オブジェクトID
;	x,y      : アンカー座標
;	distance : 距離
;	const_k  : バネ定数
;	damping  : 減衰
#deffunc qAttach int p_num, double p_x, double p_y, double p_distance, double p_const_k, double p_damping
	qgetreq@ rpr, REQ_PHYSICS_RATE	; 1フレームあたりの物理計算回数

	;	オブジェクトの状態を取得
	qgetpos@    p_num, hx1, hy1, hr1
	qgetspeed@  p_num, vx, vy, vr
	qgetweight@ p_num, weiht, mt

	;	オブジェクトからアンカーまでの距離ベクトル
	dx = p_x - hx1
	dy = p_y - hy1
	;cos	-(dx,dy)と(vx,vy)とがなす角のcos値
	dd = sqrt(dx*dx + dy*dy)
	vv = sqrt(vx*vx + vy*vy)
	if (dd=0.0) | (vv=0.0) {
		c = 1.0
	} else {
		c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd
	}
	;梁正規化
	ix = dx / dd
	iy = dy / dd

	;	減衰
	v = vv * c
	bvx = ix * -v
	bvy = iy * -v
	cvx = 0.0
	cvy = 0.0
	if bvx>0 {
		cvx = -p_damping
		if (bvx - p_damping)<0 : cvx = -bvx
	} else {
		if bvx<0 {
			cvx = p_damping
			if (bvx + p_damping)>0 : cvx = -bvx
		}
	}
	if bvy>0 {
		cvy = -p_damping
		if (bvy - p_damping)<0 : cvy = -bvy
	} else {
		if bvy<0 {
			cvy = p_damping
			if (bvy + p_damping)>0 : cvy = -bvy
		}
	}

	;	バネ
	;バネの伸び
	dl = sqrt(dx*dx + dy*dy) - p_distance
	; a = x * k / m
	vx = ix * dl * p_const_k / weiht
	vy = iy * dl * p_const_k / weiht
	vx *= rpr	;加速度を速度に置き換え
	vy *= rpr
	qspeed@ p_num, vx + cvx, vy + cvy, 0.0

	return

#global

	qreset			; OBAQの初期化

	;	オブジェクト配置
	dim myball, 5
	repeat 5
		qaddpoly myball(cnt), 100, 60.0+10.0*cnt, 60.0, 0, 5.0,5.0, 0
		qweight  myball(cnt), 6.0
		qdamper  myball(cnt), 0.0, 0.0
		qinertia myball(cnt), 1.0
		qtype    myball(cnt), 0x100
	loop

	;----------
	;	梁
	;----------
	; 硬いバネと大きな減衰で梁を表現します。

	; 梁長さ
	lg = 30.0

	; バネ定数
	; 値が小さいほどバネが柔らかく、よく伸びるようになります。
	;k = 0.01
	k = 0.4

	; 減衰
	; 値が大きいほど振動が速く収まります。
	;cv = 0.0001
	cv = 0.2

	;----------
	;	環境
	;----------
	qgravity 0, 0.005

;	メインループ
qgetpos mybox, px,py,pr
*main
	redraw 0		; 画面の更新を開始
	color 0,0,0:boxf	; 画面をクリア
	qexec			; OBAQによるオブジェクトの更新

	;	最初に動かす
	stick key
	if key&16 : qspeed myball(0), -0.5
	color 255,255,255
	pos 50,50
	mes "スペースキーを押してください。"

	;----------
	;	振り子
	;----------
	repeat 5
		qAttach myball(cnt), 60.0+10.0*cnt, 30.0, lg, k, cv
	loop

	;	紐を描画
	color 255,255,255
	repeat 5
		qgetpos myball(cnt), px,py,pa
		qcnvaxis lpx, lpy, px, py, 0
		x = 60.0+10.0*cnt
		y = 30.0
		qcnvaxis lx, ly, x, y, 0
		line lx, ly, lpx, lpy
	loop

	qdraw			; オブジェクトの描画
	redraw 1		; 画面の更新を終了
	await 12		; 一定時間待つ
	goto *main

HSP OBAQで振り子

#include "obaq.as"

;内積
#define ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))

	qreset			; OBAQの初期化

	;	オブジェクト追加
	qaddpoly mybox,   4, 80,30,0, 3.0,3.0
	qaddpoly myball, 20, 80,60,0, 3.0,3.0

	;qgravity 0,0
	qtype mybox, type_bind
	qinertia myball, 1.0

	qgetpos mybox, px,py,pr

*main
	redraw 0		; 画面の更新を開始
	color 0,0,0:boxf	; 画面をクリア
	qexec			; OBAQによるオブジェクトの更新

	;	キー入力
	stick key,15		; キーの取得
	if key&128 : end	; [ESC]キーで終了
	if key&1 : px -= 0.5
	if key&4 : px += 0.5
	if key&2 : py -= 0.5
	if key&8 : py += 0.5

	;	操作用オブジェクトを移動
	qpos mybox, px,py,0

	;	振り子
	qgetpos mybox,  hx0, hy0, hr0
	qgetpos myball, hx1, hy1, hr1
	qgetspeed myball, vx,vy,vr
	;ballからbox
	dx = hx0 - hx1
	dy = hy0 - hy1
	;cos
	dd = sqrt(dx*dx + dy*dy)
	vv = sqrt(vx*vx + vy*vy)
	c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd
	;紐正規化
	ix = dx / dd
	iy = dy / dd

	;減衰
	v = vv * c
	bvx = ix * -v
	bvy = iy * -v
	cv = 0.1
	cvx = 0.0
	cvy = 0.0
	if bvx>0 {
		cvx = -cv
		bvx -= cv
		if bvx<0 : cvx = 0.0
	} else {
		if bvx<0 {
			cvx = cv
			bvx += cv
			if bvx>0 : cvx = 0.0
		}
	}
	if bvy>0 {
		cvy = -cv
		bvy -= cv
		if bvy<0 : cvy = 0.0
	} else {
		if bvy<0 {
			cvy = cv
			bvy += cv
			if bvy>0 : cvy = 0.0
		}
	}
	qspeed myball, cvx, cvy, 0.0

	;	バネ
	;バネの伸び
	dl = sqrt(dx*dx + dy*dy) - 10.0
	vx = ix * dl / 4
	vy = iy * dl / 4
	qspeed myball, vx, vy

/*
	pos 50,50
	color 255,255,255
	mes ""+dy
	mes ""+vy
	mes vv
	mes c
	mes "cvx = " + cvx
	mes "cvy = " + cvy
*/

	qdraw			; オブジェクトの描画
	redraw 1		; 画面の更新を終了
	await 12		; 一定時間待つ
	goto *main

HSP 数値を2進数(文字列)に変換するモジュール

#module
#defcfunc tobit int num
	s=""
	repeat 32
		s = str((num & 1<<cnt)!0) + s
	loop
	return s
#global

ss=""
mesbox ss, ginfo_winx, ginfo_winy
objid = stat

s=""
s += tobit( 2 ) + "\n"
s += tobit( 3 ) + "\n"
s += tobit( 5 ) + "\n"
s += tobit( 7 ) + "\n"
s += tobit( 11 ) + "\n"
s += tobit( 13 ) + "\n"
s += tobit( 17 ) + "\n"
s += tobit( 19 ) + "\n"
s += tobit( 23 ) + "\n"
s += tobit( 29 ) + "\n"
s += tobit( 31 ) + "\n"
s += tobit( 37 ) + "\n"
s += tobit( 41 ) + "\n"
s += tobit( 43 ) + "\n"
s += tobit( 47 ) + "\n"
s += tobit( 53 ) + "\n"
s += tobit( 59 ) + "\n"
s += tobit( 61 ) + "\n"

objprm objid, s

JavaScript HSP3コンパイラfor EmEditorマクロ

//
// HSP3 コンパイラ for EmEditor マクロ
//
// compilerName にHSP3スクリプトエディタのパスを指定して使用してください。
//
var compilerName = "C:\\hsp332\\hsed3.exe";

// フルパスファイル名
strName = document.FullName;
// 拡張子名
ExtName = document.Name.replace(/^.*\./ , "").toUpperCase();

// 拡張子がHSPのものである場合、コンパイル実行
if ((ExtName == "HSP") || (ExtName == "AS")) {

	// 編集中のファイルのパスを取得
	document.CopyFullName();

	// HSP3スクリプトエディタを起動
	WshShell = new ActiveXObject( "WScript.Shell" );
	WshShell.Run( compilerName );
	// 「外部ファイル実行」を使ってコンパイル
	Sleep( 1000 );
	WshShell.SendKeys( "{F10}" );
	Sleep( 10 );
	WshShell.SendKeys( "^V" );
	Sleep( 10 );
	WshShell.SendKeys( "{TAB}" );
	Sleep( 10 );
	WshShell.SendKeys( "{-}" );	// 「オブジェクトファイルのみ作成」をOFF
	Sleep( 10 );
	WshShell.SendKeys( "{ENTER}" );
}

HSP Artlet2Dの円弧のバグ

#include "a2d.hsp"

	; 仮想イメージ 0 を作成
	alCreateImage 0, 640, 480
	if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end

	d = 600.0	// 半径
				// s0=1.5にしても、200以下ぐらいにするとズレる
	f = d*0.9	// 太さ
	px = -d/2 + 20
	py = -d/2 + 20
	r0 =   0.0	// 開始角度
	r1 =  90.0	// 終了角度
	s0 = 0.0	// 描画角度を延長
				// s0 = 1.5 度にすると綺麗に水平垂直になる
	r0 -= s0
	r1 += s0*2

	// 目安線
	alColor 0, 0,0, 255
	alPenWidth 1
	alDrawLine px+d/2,py+d/2, px+d*2,py+d/2
	alDrawLine px+d/2,py+d/2, px+d/2,py+d*2

	// 円弧
	alColor 255, 0,0, 127
	alPenWidth f
	alDrawArc px,py, d,d, r0,r1

	alCopyImageToScreen 0, 0
	redraw

HSP 矢印を描画するモジュール

#module
;	矢印描画モジュール
;使い方:lineと同じです。
#deffunc arrow_ int x1, int y1, int x2, int y2
	t = sin(deg2rad(15))
	x = double(x2-x1) / 10.0
	y = double(y2-y1) / 10.0
	xx = x * cos(t) - y * sin(t)
	yy = y * cos(t) + x * sin(t)
	line x1, y1, x1+xx, y1+yy
	xx = x * cos(-t) - y * sin(-t)
	yy = y * cos(-t) + x * sin(-t)
	line x1, y1, x1+xx, y1+yy
	line x1, y1, x2, y2
	return

#define global arrow(%1,%2,%3=ginfo_cx,%4=ginfo_cy) arrow_ %1,%2,%3,%4
#global

;	矢印の描画
x = ginfo_winx
y = ginfo_winy
randomize
arrow rnd(x), rnd(y), rnd(x), rnd(y)
repeat 10
	color rnd(255),rnd(255),rnd(255)
	arrow rnd(x), rnd(y)
loop

HSP 角丸の矩形を描画するモジュール

// 角丸矩形描画モジュール

#include "a2d.hsp"

#module
// ------------------------------------------------------------ //
//
// 命  令  :角丸矩形の描画
//
// 引  数  :x, y	: 矩形の左上座標
//           w, h	: 矩形のサイズ
//           r      : 角丸半径
//
// 返り値  :なし
//
// 機能説明:
//           引数で指定した位置・サイズの角丸矩形を描画します。
//
//           この矩形は、塗りつぶしではなく線で枠を描画した図形です。
//
// ------------------------------------------------------------ //
// Rounded Rectangle
#deffunc DrawRoundRect int p_x, int p_y, int p_w, int p_h, int p_r
	r = limit( p_r, 0, p_w/2)

	alDrawLine p_x          , p_y + r      , p_x          , p_y + p_h - r
	alDrawLine p_x + r      , p_y + p_h    , p_x + p_w - r, p_y + p_h
	alDrawLine p_x + p_w    , p_y + p_h - r, p_x + p_w    , p_y + r
	alDrawLine p_x + p_w - r, p_y          , p_x + r      , p_y

	alDrawArc p_x            , p_y            , r*2, r*2, 180, 90
	alDrawArc p_x            , p_y + p_h - r*2, r*2, r*2,  90, 90
	alDrawArc p_x + p_w - r*2, p_y + p_h - r*2, r*2, r*2,   0, 90
	alDrawArc p_x + p_w - r*2, p_y            , r*2, r*2, 270, 90
	return

// ------------------------------------------------------------ //
//
// 命  令  :塗りつぶし角丸矩形の描画
//
// 引  数  :x, y	: 矩形の左上座標
//           w, h	: 矩形のサイズ
//           r      : 角丸半径
//
// 返り値  :なし
//
// 機能説明:
//           引数で指定した位置・サイズの角丸矩形を描画します。
//
// ------------------------------------------------------------ //
// Rounded Rectangle
#deffunc FillRoundRect int p_x, int p_y, int p_w, int p_h, int p_r
	r = limit( p_r, 0, p_w/2)

	alFillRect  p_x           , p_y + r        , r, p_h - p_r*2
	alFillRect  p_x + r       , p_y + p_h - p_r, p_w - r*2, r
	alFillRect  p_x + p_w - r , p_y + r              , r, p_h - p_r*2
	alFillRect  p_x + r       , p_y , p_w - r*2, r

	alFillRect  p_x + r       , p_y + r , p_w - r*2, p_h - p_r*2

	alFillPie p_x            , p_y            , r*2, r*2, 180, 90
	alFillPie p_x            , p_y + p_h - r*2, r*2, r*2,  90, 90
	alFillPie p_x + p_w - r*2, p_y + p_h - r*2, r*2, r*2,   0, 90
	alFillPie p_x + p_w - r*2, p_y            , r*2, r*2, 270, 90
	return

#global

	; 仮想イメージ 0 を作成
	alCreateImage 0, 640, 480
	if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end

	alPenWidth 3

	// 背景
	alColor 255, 200,200
	r = 10
	repeat ginfo_winx*2 /r
		alDrawLine cnt * r, 0, 0, cnt * r
	loop

	// 半透明フィルタ
	alColor 0, 0, 255, 127
	// 角丸
	DrawRoundRect 0,   0, 120, 120, 20
	// 角丸塗りつぶし
	FillRoundRect 0, 150, 120, 120, 20

	// グラデーションブラシ
	alGradientColor 150, 0, 150+120, 120, RGBA(255, 0, 0), RGBA(0, 0, 255)
	DrawRoundRect 150,   0, 120, 120, 30
	alGradientColor 150, 150, 150+120, 150+120, RGBA(255, 0, 0), RGBA(0, 0, 255)
	FillRoundRect 150, 150, 120, 120, 30

	// 半透明グラデーションブラシ
	alGradientColor 300, 0, 300+120, 120, RGBA(0, 255, 0, 255), RGBA(0, 255, 0, 0)
	DrawRoundRect 300,   0, 120, 120, 40
	alGradientColor 300, 150, 300+120, 150+120, RGBA(0, 255, 0, 255), RGBA(0, 255, 0, 0)
	FillRoundRect 300, 150, 120, 120, 40

	; 仮想イメージ 0 から HSP スクリーンにコピー
	alCopyImageToScreen 0, 0
	redraw
Total Pages: 1 / 212

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

タグ

最近投稿されたコード