|
|
|
2024/8/4(Sun) 20:58:31|NO.102007
作ってみたものの使い道なかったわ…なスクリプトを投稿するためのスレッドです。
作品として公開するほどじゃないけど、せっかく作ったからどこかに投稿したい。そんな行き場のないスクリプトの公開場所にご利用ください。
後々誰かの開発の役に立てればよし。他の方の投稿を改良するもよし。いっそ誰の役に立たなくてもよし。そんな気持ちで書き込んでいただければと思います。
ルール無用だとあれそうなので約束事を書いておきますね。
約束事
・けんかしない
・何百行もあるような大きいスクリプトは投稿しない。
・できればコピペで動くといいな。(素材はHSPTVフォルダが便利です。)
・ライセンスはNYSL
補足:コードッターが投稿できなくなってしまっていたので立てました。
|
|
|
2024/8/4(Sun) 21:01:00|NO.102008
ということで1個目を。
フルスクリーンやるべきか?とか思って作ってみたもののフルスクリーンにするようなゲームができていないことを思い出したので使わなくなりました。
その内使うことに…なるといいな。
;
; HSP3 でフルスクリーンモードを使用するサンプル
;
; 縦横比が合わない部分は黒帯で埋めます。
;
#include "hsp3dish.as"
; ------------------------------
; フルスクリーン ウィンドウ
; ------------------------------
; まずフルスクリーンにした際に、画面の大きさを合わせるための情報を取得します。
; screenでフルスクリーンにします。
; 最後に viewcalc で表示スケールを合わせて完了です。
;
; zoomView スケール
; viwOffsetX/Y 移動量
; 描画解像度
; 任意に指定する。
viewWinx = 800
viewWiny = 600
; スケールと移動量を計算
; 描画解像度がディルプレイより横長なら、上下を黒帯にします。
; 描画解像度がディルプレイより縦長なら、左右を黒帯にします。
x = double(ginfo_dispx) / viewWinx
y = double(ginfo_dispy) / viewWiny
zoomView = x
viwOffsetX = 0.0
viwOffsetY = ( double(ginfo_dispy) / zoomView - viewWiny) / 2.0
if y < x {
zoomView = y
viwOffsetX = ( double(ginfo_dispx) / zoomView - viewWinx) / 2.0
viwOffsetY = 0.0
}
; フルスクリーン ウィンドウを作成
screen 0, ginfo_dispx, ginfo_dispy, 256
; 描画スケールを調整
gfilter 1
viewcalc vptype_translate, viwOffsetX, viwOffsetY
viewcalc vptype_2d, zoomView, zoomView
; ------------------------------
; 描画開始
; ------------------------------
; 背景を塗りつぶし
color 255, 200, 200
boxf 0,0, viewWinx, viewWiny
COLOR 255
boxf -100,-100,100,100
; 通常通り描画
color
mes "フルスクリーン表示"
button "終了",*owari
; 余白を塗りつぶし
color
if viwOffsetY = 0.0 {
boxf -viwOffsetX - 1, 0, -1, viewWiny
boxf viewWinx + 1, 0, ginfo_winx, viewWiny
} else {
boxf 0, -viwOffsetY - 1, viewWinx, -1
boxf 0, viewWiny + 1, viewWinx, ginfo_winy
}
redraw 1
stop
*owari
end

| |
|
|
2024/8/5(Mon) 07:12:25|NO.102009
『シェルピンスキーのギャレット』を描写するプログラム
w=0f+ginfo(12)
h=0f+ginfo(13)
wh=w/2
x=0.0
y=0.0
repeat
x*=0.5
y*=0.5
r=rnd(3)
if r=0{
x+wh
}else:if r=1{
x+=wh/2
y-=h/2
}
pset x,y+h
await
loop
|
|
|
2024/8/6(Tue) 17:28:06|NO.102013
プログラ
// useless_script.hsp
// Display a window with the title "Useless HSP Script"
dialog "This is a useless HSP script", "Useless HSP Script"
// Define variables
x = 100
y = 200
z = x + y
// Display variable values in a message box
mes "x = " + x
mes "y = " + y
mes "z = " + z
// Create a loop that does nothing useful
repeat 10
mes "This is loop iteration " + cnt
loop
// Define a function that does nothing useful
#deffunc uselessFunction int a, int b
return a * b
// Call the useless function and display the result
result = uselessFunction(3, 4)
mes "Result of uselessFunction(3, 4) = " + result
// Wait for the user to close the window
stop
</ore>
|
|
|
2024/9/7(Sat) 19:25:39|NO.102175
バイオハザードっぽい走り方の動きのみ2Dで再現
カーソルキーの上下左右で動きます
dim map,20,20
map(0, 0)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
map(0, 1)=1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1
map(0, 2)=1,2,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,2,1
map(0, 3)=1,2,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,1
map(0, 4)=1,2,0,2,1,2,0,0,2,2,2,2,0,0,0,0,0,0,2,1
map(0, 5)=1,2,0,2,2,2,0,2,2,1,1,2,0,0,0,0,0,0,2,1
map(0, 6)=1,2,0,0,0,0,0,2,1,1,1,2,0,0,0,0,0,0,2,1
map(0, 7)=1,2,0,0,0,2,2,2,1,1,1,2,0,0,0,0,0,0,2,1
map(0, 8)=1,2,0,2,2,2,1,1,1,1,1,2,0,0,0,0,2,2,2,1
map(0, 9)=1,2,0,2,1,1,1,1,1,1,1,2,2,2,0,0,2,1,1,1
map(0,10)=1,2,0,2,1,1,1,1,1,1,1,1,1,2,0,0,2,1,1,1
map(0,11)=1,2,0,2,2,2,2,2,2,1,1,2,2,2,0,0,2,2,2,1
map(0,12)=1,2,0,0,0,0,0,0,2,1,1,2,0,0,0,0,0,0,2,1
map(0,13)=1,2,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,2,1
map(0,14)=1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1
map(0,15)=1,2,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,1
map(0,16)=1,2,0,0,0,0,2,2,1,1,1,2,0,0,0,0,0,0,2,1
map(0,17)=1,2,0,0,0,2,2,1,1,1,1,2,0,0,0,0,0,0,2,1
map(0,18)=1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,1
map(0,19)=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
dim sin_tbl,256
repeat 256 : sin_tbl(cnt)=int(sin(3.14159/128*cnt)*256) : loop
dim cos_tbl,256
repeat 256 : cos_tbl(cnt)=int(cos(3.14159/128*cnt)*256) : loop
color 0,0,0
boxf
x=50*256:y=100*256:size=1
repeat
ar=0
stick sk,15
if sk&1 : r+=4 : if r>=256 : r=0
if sk&4 : r-=4 : if r<0 : r=255
if sk&2 : ar=-4
if sk&8 : ar=4
ay=cos_tbl(r)*ar
y+=ay
sy=y/256
a=sx/20:c=(sx+size)/20
b=sy/20:d=(sy+size)/20
z=map(a,b)+map(c,b)+map(a,d)+map(c,d)
if z>0 {
if ay>0 { sy=d*20-size-1:y=sy*256}
else {sy=(b+1)*20: y=sy*256}
}
ax=sin_tbl(r)*ar
x+=ax
sx=x/256
a=sx/20:c=(sx+size)/20
b=sy/20:d=(sy+size)/20
z=map(a,b)+map(c,b)+map(a,d)+map(c,d)
if z>0 {
if ax>0 { sx=c*20-size-1:x=sx*256}
else {sx=(a+1)*20:x=sx*256}
}
redraw 0
color 0,0,0
boxf
repeat 20
yy=cnt
repeat 20
xx=cnt
if map(xx,yy)=1 :color 255,255,255:boxf xx*20,yy*20,xx*20+18,yy*20+18
if map(xx,yy)=2 :color 10,10,50:boxf xx*20,yy*20,xx*20+18,yy*20+18
loop
loop
color 255,0,0
grect x/256,y/256,double(-r)/40.0,30,15
grect (x-(sin_tbl(r)*13))/256,(y-(cos_tbl(r)*13))/256,double(-r)/40.0,15,15
redraw 1
await 17
loop

| |
|
|
2025/11/9(Sun) 23:59:53|NO.104249
久しぶりに作ってしまった。
公開する場所もないのでここに投下。
数字を億とか兆で表示する方法に変換する関数。
誰かが作っていそうな気がしないでもない。(´・ω・`)
;
; numberString
; p_numStr : 数値の文字列
;
; 数の位を命数法(万、億、兆、…などの漢字)に変換します。
; 数値は半角英数の文字列で指定してください。
; 指数は使用できません。小数点以下は除去されます。
;
; 例
; mes numberString("-123456789.123") ; -1億2345万6789
;
#module
#defcfunc numberString str p_numStr
suuji = "万", "億", "兆", "京", "垓", "杼", "穣", "溝", "澗", "正", "載", "極", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大数"
; 数字以外除去
numStr = p_numStr
; 前後のスペースを除去
numStr = strtrim(numStr, 0, ' ')
; 小数点以下を除去
if instr(numStr, 0, ".") > 0 {
numStr = strmid(numStr, 0, instr(numStr, 0, "."))
}
; 負に対応
fugou = strmid(numStr, 0, 1)
if (fugou="+") | (fugou="-") {
numStr = strmid(numStr, 1, strlen(numStr))
} else {
fugou = ""
}
; 桁数確認
len = strlen(numStr)
if len <= 4 : return numStr
; 右から4桁ずつ書き出していく
nsNum = ""
repeat
if len <= 0 : break
lwKeta = 4
upKeta = len - 4
part = strmid(numStr, -1, 4)
; suujiの数上限
if cnt-1>=16 {
part = numStr
upKeta = 0
}
if int(part) ! 0 {
part = strtrim(part, 1, '0')
if cnt = 0 {
nsNum = part
} else {
nsNum = part + suuji(cnt-1) + nsNum
}
}
numStr = strmid(numStr, 0, upKeta)
len = upKeta
loop
nsNum = fugou + nsNum
return nsNum
#global
; サンプル
#if 10
mes numberString("0")
s = "1"
repeat 20
mes numberString(s)
s += "0000"
loop
mes numberString("123456789.123")
mes numberString("100450089")
mes numberString("12345")
mes numberString("1234500000000000067890")
mes numberString("1000000000000000000000000000000000000000000000000000000000000")
#endif
𥝱は杼に置き変えてます。
ゲームの得点表示にと思ったものの、杼以上だと実数の誤差が出始めるので実用的じゃない問題。

| |
|
|
2025/11/10(Mon) 21:46:13|NO.104255
半透明対応の角丸矩形描画モジュール(オフセット付き+オマケ)です。
gsquare で分割三角形を並べることで角丸を表現できるかもと思って試したものです。
どうせ変に重なって濃い部分ができると思ったのですが、なんか上手くいってしまいました。
// 描画モジュール
#module
; 配列に格納された座標点を順に結んで線を描画 / p1:点の数(配列長/2)
#deffunc lineArray array arr, int p1, int ox, int oy
pos ox+arr(0),oy+arr(1)
repeat limit(p1-1,0,length(arr)/2-1),1
line ox+arr(cnt*2),oy+arr(cnt*2+1)
loop
return
; オフセット付きで塗りつぶし矩形(boxf)を描画 [半透明可]
#deffunc boxfao int ax, int ay, int bx, int by, int ox, int oy
pdx=ax+ox,bx+ox,bx+ox,ax+ox
pdy=ay+oy,ay+oy,by+oy,by+oy
gsquare -1,pdx,pdy
return
; オフセット付きで塗りつぶし三角形を描画 [半透明可]
#deffunc trianglefao int ax, int ay, int bx, int by, int cx, int cy, int ox, int oy
pdx=ax+ox,bx+ox,cx+ox,ax+ox
pdy=ay+oy,by+oy,cy+oy,ay+oy
gsquare -1,pdx,pdy
return
; オフセット付きで塗りつぶし四角形(任意の4点)を描画 [半透明可]
#deffunc quadfao int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy, int ox, int oy
pdx=ax+ox,bx+ox,cx+ox,dx+ox
pdy=ay+oy,by+oy,cy+oy,dy+oy
gsquare -1,pdx,pdy
return
; オフセット付きで円またはドーナツ状円(太さ指定)を描画 [半透明可] / thick:太さ(1=塗りつぶし), div:分割数 ... ちょっと円が「いびつ」になります
#deffunc circlefao int x1, int y1, int x2, int y2, int thick, int div, int ox, int oy
dcx = double(x1 + x2) / 2.0 + ox
dcy = double(y1 + y2) / 2.0 + oy
rx = absf(x2 - x1) / 2.0
ry = absf(y2 - y1) / 2.0
if rx < 1 || ry < 1 : return
div_ = div : if div_ <= 0 : div_ = limit((rx+ry)/4, 12, 128)
if thick == 1 {
repeat div_
ang1 = 2.0 * M_PI * cnt / div_
ang2 = 2.0 * M_PI * (cnt+1) / div_
x3 = dcx + cos(ang1) * rx
y3 = dcy + sin(ang1) * ry
x4 = dcx + cos(ang2) * rx
y4 = dcy + sin(ang2) * ry
trianglefao dcx, dcy, x3, y3, x4, y4
loop
return
}
thick_ = double(thick)
if thick_ < 1 : thick_ = 1.0
rx1 = rx - thick_/2.0
ry1 = ry - thick_/2.0
rx2 = rx + thick_/2.0
ry2 = ry + thick_/2.0
if rx1 < 0 : rx1 = 0
if ry1 < 0 : ry1 = 0
repeat div_
ang1 = 2.0 * M_PI * cnt / div_
ang2 = 2.0 * M_PI * (cnt+1) / div_
ox1 = dcx + cos(ang1) * rx2
oy1 = dcy + sin(ang1) * ry2
ox2 = dcx + cos(ang2) * rx2
oy2 = dcy + sin(ang2) * ry2
ix2 = dcx + cos(ang2) * rx1
iy2 = dcy + sin(ang2) * ry1
ix1 = dcx + cos(ang1) * rx1
iy1 = dcy + sin(ang1) * ry1
quadfao ox1,oy1, ox2,oy2, ix2,iy2, ix1,iy1
loop
return
; オフセット付きで角丸矩形を描画(角の半径と分割数を指定) [半透明可] / r:角丸半径, div:分割数
#deffunc rboxfao int x1, int y1, int x2, int y2, int r, int div, int ox, int oy
div_ = div : if div_ <= 0 : div_ = limit(6+(r-5)*(12-6)/(25-5), 6,12)
boxfao x1+r, y1, x2-r, y2, ox,oy
boxfao x1, y1+r, x1+r, y2-r, ox,oy
boxfao x2-r, y1+r, x2, y2-r, ox,oy
repeat 4
if cnt=0 : cx=x1+r : cy=y1+r : ang0=180.0
if cnt=1 : cx=x2-r : cy=y1+r : ang0=270.0
if cnt=2 : cx=x2-r : cy=y2-r : ang0=0.0
if cnt=3 : cx=x1+r : cy=y2-r : ang0=90.0
repeat div_
ang1 = ang0 + 90.0 * cnt/div_
ang2 = ang0 + 90.0 * (cnt+1)/div_
x3 = cx + cos(ang1/180.0*M_PI)*r
y3 = cy + sin(ang1/180.0*M_PI)*r
x4 = cx + cos(ang2/180.0*M_PI)*r
y4 = cy + sin(ang2/180.0*M_PI)*r
trianglefao cx,cy, x3,y3, x4,y4, ox,oy
loop
loop
return
; 自動的に角丸半径を算出して角丸矩形を描画 [半透明可]
#deffunc rboxfao_auto int x1, int y1, int x2, int y2, int ox, int oy
w = abs(x2 - x1)
h = abs(y2 - y1)
r = (w+h)/40
if r > w/2 : r = w/2
if r > h/2 : r = h/2
if r < 1 : r = 1
rboxfao x1,y1,x2,y2, r,0, ox,oy
return
#global
//============================================================
// サンプル(半透明重なりデモ)
//============================================================
gmode 3,,,80 ; 半透明モード
// 線の配列描画 [オフセット利用]
arr = 0,0, 120,50, 50,100, 0,0
color 0,0,255
lineArray arr, 4, 60,60
// 矩形
color 255,0,0
boxfao 150,60,250,160
// 三角形
color 0,255,0
trianglefao 260,70, 340,170, 200,170
// 四角形(任意の4点)
color 0,128,255
quadfao 310,80, 420,90, 400,180, 300,160
// 円(塗りつぶし)... ちょっと「いびつ」になります
color 255,128,0
circlefao 90,220,190,320, 1
// ドーナツ状円(太さ12)... 同上
color 255,0,128
circlefao 150,240,250,340, 12
// 角丸矩形(半径・分割数指定)
color 0,200,200
rboxfao 240,230,390,330, 25, 12
// 自動角丸矩形 [オフセット利用]
color 150,0,200
rboxfao_auto 240,230,390,330, 100,20
コンテストに投稿している mod_layerbuttonモジュール の中で使っています。
が、基本ゲームを作らない自分ではこれ以上利用しないかも。ということで「使い道のない」レギュレーションは満たしているかと。。。

| |
|
|
2025/11/29(Sat) 10:03:24|NO.104352
みんなの役に立ち HSP3の勉強になる 良いスレッドだと思いました。
掲示板に自作HSPスクリプトを貼り付けて書き込むのがたいへんだったら、
ご自身のブログ記事やSNS投稿でもよいので、そのHSPスクリプトが書いてあるページのURLを書き込んでくれたら、
それでもよいかなと思いました。(現在のHSP3.7で動きそうなものならなんでも。昔のモノでも。)
|
|
|
2025/11/29(Sat) 17:56:47|NO.104353
使い道があるから貼れないじゃないか(
a=0.0: x=200.0: y=200.0
*main
a+=0.01
xp=cos(a) // x
yp=sin(a) // y
x+=xp: y+=yp
color: boxf: color 255,255,255
pset x,y
pos 10,10: mes "cos="+xp+"\nsin="+yp
await 16
goto *main
|
|
|
2025/12/23(Tue) 02:17:35|NO.104547
某プログラミングゲームに触発されて作った「ライフゲーム」のプログラムです。
安定した集落がよそ者の侵入を受けて乱されたりとか、安定した集落でも
ジッと動かないのもあればくるくる回ってるのもあったりして、なかなか見てて面白いですね。
//ライフゲーム
//https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
//ルール:
//・今生きているマスは、隣接している生きているマスの数が1以下か4以上だと死ぬ
//・今死んでいるマスは、隣接している生きているマスの数が3なら生き返る
//・「隣接している」マスは縦横斜めの8方向のマス。盤面の外壁は「死んでいるマス」とみなす。
#const wid 40 //横方向のマスの数
#const hei 25 //縦方向のマスの数
#const lives 200 //初期状態で生きているマスの数
#define swap(%1,%2) _swp_=%1 : %1=%2 : %2=_swp_
buffer 1,32,16 : gsel 1
color 0,128,0 : boxf
color 0,0,0 : boxf 1,1,14,14
color 255,255,255 : boxf 17,1,30,14
gsel 0
celdiv 1,16,16
screen 0,wid*16,hei*16
total=wid*hei
dim tmp,total
repeat lives : tmp(cnt)=1 : loop
randomize
repeat total
x=rnd(total-cnt)+cnt
swap tmp(cnt),tmp(x)
loop
dim status,wid,hei //0:死亡 1:生存 2:今は生きているがターン終了時に死ぬ予定 -1:今は死んでいるがターン終了時に生き返る予定
memcpy status,tmp,total*4,0,0
repeat
redraw 0
repeat hei
y=cnt
repeat wid
x=cnt
pos 16*x,16*y
now=status(x,y)
celput 1,now
//周りの生きているマスをカウント
num=0
if y>0 {
if x>0 : num+=status(x-1,y-1)>0 //左上
num+=status(x,y-1)>0 //真上
if x<wid-1 : num+=status(x+1,y-1)>0 //右上
}
if x>0 : num+=status(x-1,y)>0 //真左
if x<wid-1 : num+=status(x+1,y)>0 //真右
if y<hei-1 {
if x>0 : num+=status(x-1,y+1)>0 //左下
num+=status(x,y+1)>0 //真下
if x<wid-1 : num+=status(x+1,y+1)>0 //右下
}
if now {
//生存→死亡
if num<2 | num>3 : status(x,y)=2
} else {
//死亡→生存
if num=3 : status(x,y)=-1
}
loop
loop
//生死変化処理
repeat hei
y=cnt
repeat wid
status(cnt,y)&=1
loop
loop
redraw 1
await 1000
loop

| |
|
|
2026/2/28(Sat) 02:12:06|NO.104768
HDDの中で肥やしになってるスプリクトがあり
AIに解説とコメントを追加してもらったら見やすくなりました
; ==============================================================
; hgimg3_xfile_mesh.hsp
; 概要: hgimg3を使用した3Dメッシュ(タイルパターン)表示サンプル
; X形式の3Dデータをプログラムで動的生成し、メモリ上に展開して
; 複数の矩形ポリゴン(メッシュ)をテクスチャ付きで描画する。
; フルスクリーン対応・キー操作による視点移動あり。
; ==============================================================
; --- ライブラリのインクルード ---
#include "hgimg3.as" ; hgimg3 3Dグラフィックスライブラリ
#include "user32.as" ; Windows API(ウィンドウスタイル変更に使用)
; hgsetreq SYSREQ_NOMIPMAP,1 ; ミップマップ無効化(必要な場合はコメント解除)
hgsetreq SYSREQ_3DFILTER,1 ; 3Dテクスチャフィルタリングを有効化
; --- 変数の初期化 ---
sdim str_buf,256 ; xfile_put 用の文字列バッファ(256バイト)
mesh_size_x=30 ; X方向のメッシュ(タイル)数
mesh_size_y=16 ; Y方向のメッシュ(タイル)数
; --- ウィンドウの設定(フルスクリーン対応) ---
screen 0, ginfo(20), ginfo(21) ; デスクトップの解像度でウィンドウ作成
GetWindowLong hwnd, -16 ; 現在のウィンドウスタイルを取得
SetWindowLong hwnd, -16, stat | $10000 | $40000 ; WS_MAXIMIZE | WS_POPUP を追加(枠なし最大化)
width 1920/2, 1080/2 ; 描画領域を 960x540 に設定
; --- hgimg3 の初期化 ---
hgini
; --- テクスチャファイルのパス設定 ---
texfile=dir_exe+"/hsptv/hsptv_img.bmp" ; メインテクスチャ(1ブロック=64ドット)
texfile2=dir_exe+"/sample/hgimg3/fontchr.bmp" ; フォントテクスチャ(文字描画用)
; ダライアス解像度は 864×224(参考情報)
; --- X形式メッシュデータをメモリ上で生成し読み込む ---
gosub *xfile_work ; Xファイル文字列データを savedata に構築するサブルーチンへ
memfile savedata ; savedata の内容をメモリファイルとして設定
addxfile mdla, "MEM:x.x" ; メモリ上の "x.x" をXファイルとして読み込み、モデルID(mdla)取得
regobj my_chr,mdla ; モデルをオブジェクトとして登録し、オブジェクトID(my_chr)を取得
; --- テクスチャをメッシュの各ポリゴンに割り当てる ---
texload texfile ; メインテクスチャをロード
repeat mesh_size_x*mesh_size_y
setxinfo my_chr, 0, $2000+cnt, stat ; 各ポリゴン(cnt番)にテクスチャを設定
loop
; ==============================================================
; *camerainit : カメラ・ライト・メッシュ初期設定
; ==============================================================
*camerainit
cammode CAM_MODE_NORMAL ; カメラモードを通常モードに設定
setang HGOBJ_LIGHT,-0.8,3 ; ライトの向きを設定(仰角-0.8、方位角3)
setscale HGOBJ_LIGHT,255,255,255 ; ライトの強度(R,G,B)を最大値に設定
setdir HGOBJ_LIGHT,255,255,255 ; ライトの方向ベクトルを設定
selcpos ; カメラ位置を選択状態にする
objset3 14.5, -7.5, 13.0 ; カメラ位置を (14.5, -7.5, 13.0) に設定
; --- 各メッシュのUV座標(テクスチャ座標)を設定 ---
; テクスチャを 16等分(0.0625 = 1/16)した座標で各頂点にUVを割り当てる
; 各矩形ポリゴンの4頂点(左上・右上・左下・右下)にUVを指定
mesh_num=0
repeat mesh_size_y
repeat mesh_size_x
; 頂点0(左上) UV: (0/16, 8/16)
setxinfo my_chr, 0, $20000+00+mesh_num*16, 0.0625*0,0.0625*8
; 頂点1(右上) UV: (2/16, 8/16)
setxinfo my_chr, 0, $20000+04+mesh_num*16, 0.0625*2,0.0625*8
; 頂点2(左下) UV: (0/16, 6/16)
setxinfo my_chr, 0, $20000+08+mesh_num*16, 0.0625*0,0.0625*6
; 頂点3(右下) UV: (2/16, 6/16)
setxinfo my_chr, 0, $20000+12+mesh_num*16, 0.0625*2,0.0625*6
mesh_num++
loop
loop
; --- 各メッシュの3D座標(頂点位置)を設定 ---
; mesh_size_x × mesh_size_y 枚の矩形を格子状に並べる
; 各矩形の中心が (x_axis, y_axis) になるよう ±0.5 でオフセット
z_axis=400 ; Z方向のオフセット(/100.0 して実際の座標値にする = 4.0)
mesh_num=0
repeat mesh_size_y
y_axis=cnt ; 現在の行番号をY座標の基準値にする
repeat mesh_size_x
x_axis=cnt ; 現在の列番号をX座標の基準値にする
; 頂点0(左下)の座標: (x-0.5, y-0.5, z)
setxinfo my_chr, 0, $10000+00+mesh_num*16,-0.5+double(x_axis),-0.5+double(y_axis),0.0+double(z_axis)/100.0
; 頂点1(右下)の座標: (x+0.5, y-0.5, z)
setxinfo my_chr, 0, $10000+04+mesh_num*16, 0.5+double(x_axis),-0.5+double(y_axis),0.0+double(z_axis)/100.0
; 頂点2(左上)の座標: (x-0.5, y+0.5, z)
setxinfo my_chr, 0, $10000+08+mesh_num*16,-0.5+double(x_axis), 0.5+double(y_axis),0.0+double(z_axis)/100.0
; 頂点3(右上)の座標: (x+0.5, y+0.5, z)
setxinfo my_chr, 0, $10000+12+mesh_num*16, 0.5+double(x_axis), 0.5+double(y_axis),0.0+double(z_axis)/100.0
mesh_num++
loop
loop
; --- フォント表示の設定 ---
setfont 16,16,16,0 ; フォントテクスチャの設定(セルサイズ16x16、ピクセルサイズ16、モード0)
; texload "fontchr.bmp" ; フォントテクスチャ(ローカルパス版、コメントアウト)
texload texfile2 ; フォントテクスチャをロード(dir_exe相対パス版)
; ==============================================================
; *main : メインループ(毎フレーム実行される描画・入力処理)
; ==============================================================
*main
hgdraw ; 3Dシーンを描画
; --- 情報テキストの表示 ---
hgrect 150,50,0,300,100 ; 半透明の背景矩形を描画(位置150,50 / サイズ300x100)
fprt"hgimg3_xfile_meshtest",0,0 ; タイトル表示
fprt"full_screen_support",0,20 ; フルスクリーン対応の表示
fprt"key up down left right",0,40 ; 操作キーの説明
fprt"key + space pos move",0,60 ; Spaceキー押しながらで位置移動の説明
fprt"xfiledata "+buf_cnt,0,80 ; Xファイルデータのバイト数を表示
fprt"savefile_buf "+(mesh_size_x*mesh_size_y*180+1000),0,100 ; バッファサイズを表示
hgsync 17 ; 約17msの同期待ち(約60FPS)
; --- キー入力処理 ---
stick k,127 ; キー入力を取得(127=全方向キー+スペース+ESC)
if k&128 : goto *owari ; [ESC] キーで終了
if k&16 {
; スペースキーが押されている場合 → オブジェクトの「位置」を移動
selpos my_chr
if k&2 : objadd3 0.0, -0.05, 0.0 ; ↓キー : Y軸マイナス方向へ移動
if k&8 : objadd3 0.0, 0.05, 0.0 ; ↑キー : Y軸プラス方向へ移動
if k&4 : objadd3 0.05, 0.0, 0.0 ; →キー : X軸プラス方向へ移動
if k&1 : objadd3 -0.05, 0.0, 0.0 ; ←キー : X軸マイナス方向へ移動
} else {
; スペースキーなし → オブジェクトの「向き(回転)」を変更
selang my_chr
if k&1 : objadd3 0.0, -0.05, 0.0 ; ←キー : Y軸マイナス回転
if k&4 : objadd3 0.0, 0.05, 0.0 ; →キー : Y軸プラス回転
if k&2 : objadd3 0.05, 0.0, 0.0 ; ↓キー : X軸プラス回転
if k&8 : objadd3 -0.05, 0.0, 0.0 ; ↑キー : X軸マイナス回転
}
goto *main ; メインループの先頭へ戻る
; --- 終了処理 ---
*owari
end
; ==============================================================
; *xfile_work : X形式(DirectX Mesh)データをメモリ上で生成するサブルーチン
; タイルパターンのみ作成。全頂点座標は初期値として 0.0;0.0;0.0 で初期化し、
; *camerainit 内の setxinfo で後から実座標を設定する。
; ==============================================================
*xfile_work
; savedata バッファを確保(各メッシュ約180バイト × 枚数 + 予備1000バイト)
sdim savedata,mesh_size_x*mesh_size_y*180+1000
buf_cnt=0 ; バッファ書き込み位置の初期化
mesh_size=mesh_size_x*mesh_size_y ; 総メッシュ数(ポリゴン枚数)
; --- Xファイルヘッダ ---
xfile_put "xof 0303txt 0064" ; X形式ファイルのマジックナンバーとバージョン
; --- マテリアル定義(各ポリゴンに1つ、白色) ---
repeat mesh_size
xfile_put "Material mat"+strf("%04d",cnt)+" {1.0;1.0;1.0;;}" ; 白色マテリアルを枚数分定義
loop
; --- メッシュ定義開始(頂点数 = ポリゴン数 × 4頂点) ---
xfile_put "Mesh {"+str(mesh_size*4)+";"
; --- 全頂点を (0,0,0) で初期化(後で setxinfo により上書きされる) ---
repeat mesh_size*4
xfile_put "0.0;0.0;0.0;,"
loop
buf_cnt=buf_cnt-3 ; 最後のカンマを上書きするため書き込み位置を3バイト戻す
; --- ポリゴン数の宣言 ---
xfile_put ";"+str(mesh_size)+";"
; --- 各ポリゴンの頂点インデックス定義(4頂点/ポリゴン、反時計回り) ---
; 頂点順: 0(左下), 1(右下), 3(右上), 2(左上) → 表面が正面を向く
repeat mesh_size
xfile_put "4;"+str(cnt*4)+","+str(cnt*4+1)+","+str(cnt*4+3)+","+str(cnt*4+2)+";"
loop
; --- マテリアルリストの定義 ---
; 引数: 使用するマテリアルの数, ポリゴン総数
xfile_put "; MeshMaterialList {"+str(mesh_size)+";"+str(mesh_size)+";"
; --- 各ポリゴンに使用するマテリアルのインデックスを指定 ---
repeat mesh_size
xfile_put str(cnt)+";" ; cnt番ポリゴン → cnt番マテリアルを使用
loop
; --- マテリアル参照(外部定義済みのマテリアル名を指定) ---
repeat mesh_size
xfile_put "{mat"+strf("%04d",cnt)+"}"
loop
; --- テクスチャUV座標リストの定義 ---
xfile_put "} MeshTextureCoords {"+str(mesh_size*4)+";"
; --- 各ポリゴンの4頂点にUV座標を設定(仮置き値。後で setxinfo で上書きされる) ---
; 頂点0: (0.0, 1.0) 頂点1: (1.0, 1.0) 頂点2: (0.0, 0.0) 頂点3: (1.0, 0.0)
repeat mesh_size
xfile_put "0.0;1.0;1.0;1.0;0.0;0.0;1.0;0.0;"
loop
; --- Xファイルのブロック終了 ---
xfile_put "; } }"
return
; ==============================================================
; #deffunc xfile_put : 文字列を savedata バッファに1行書き込む関数
; 引数 a : 書き込む文字列
; 末尾に CR(0x0D) + LF(0x0A) の改行コードを付加する
; ==============================================================
#deffunc xfile_put str a
str_buf=a ; 引数の文字列をバッファにコピー
tl=strlen(str_buf) ; 文字列長を取得(未使用だが参考用)
repeat strlen(str_buf)
poke savedata,buf_cnt,peek(str_buf,cnt) ; 1バイトずつ savedata に書き込む
buf_cnt++
loop
poke savedata,buf_cnt,$0d ; 改行コード CR を書き込む
buf_cnt++
poke savedata,buf_cnt,$0a ; 改行コード LF を書き込む
buf_cnt++
return

| |
|
|
2026/2/28(Sat) 16:25:47|NO.104769
>hgimg3_xfile_mesh.hsp
2Dマップタイルスクロールの
camera module表示方法を考えてたんだけど。
(一般的?な、スクロール分を各パラメータから引くやり方とは違うもの。)
ポリゴンのタイルになってるんだね。
hgimg3ならcameraが使えるのか。
2Dゲームもいけそう。
|
|
|
2026/3/1(Sun) 02:21:54|NO.104774
>2Dゲームもいけそう。
レトロゲームにおける BG面的な処理をできないか模索して作った記憶があります
|
|
|
2026/3/1(Sun) 05:33:08|NO.104775
MessageBoxA関数やdialog命令を使わずにダイアログを表示させるスクリプトです
元々はサービス用に開発したものですが結局意味なかったのでここに上げちゃいます
あの有名なntdll.dllのNtRaiseHardError関数を使っています
ネイティブコードでない限り最も使い道がないスクリプトでしょう
#module
#uselib "ntdll.dll"
#func NtRaiseHardError "NtRaiseHardError" sptr, sptr, sptr, sptr, sptr, sptr
//#func RtlAdjustPrivilege "RtlAdjustPrivilege" sptr, sptr, sptr, sptr
#func RtlFreeUnicodeString "RtlFreeUnicodeString" sptr
#func RtlInitUnicodeString "RtlInitUnicodeString" sptr, wptr
// NtRaiseHardError関数の第5引数
#define OPTION_ABORTRETRYIGNORE 0
#define OPTION_OK 1
#define OPTION_OKCANCEL 2
#define OPTION_RETRYCANCEL 3
#define OPTION_YESNO 4
#define OPTION_YESNOCANCEL 5
#define OPTION_SHUTDOWN_SYSTEM 6 // バグチェック(BSOD)を発生させる (NTSTATUS値 0xC0000000以上で動作)
#define OPTION_OK_NOWAIT 7
#define OPTION_CANCELTRYCONTINUE 8
// RtlAdjustPrivilege関数の第1引数 (バグチェック用)
#define SE_SHUTDOWN_PRIVILEGE 19
// メッセージボックス スタイル
#define global MB_OK 0x00000000
#define global MB_OKCANCEL 0x00000001
#define global MB_ABORTRETRYIGNORE 0x00000002
#define global MB_YESNOCANCEL 0x00000003
#define global MB_YESNO 0x00000004
#define global MB_RETRYCANCEL 0x00000005
#define global MB_CANCELTRYCONTINUE 0x00000006
#define global MB_ICONERROR 0x00000010
#define global MB_ICONEXCLAMATION 0x00000030
#define global MB_ICONINFORMATION 0x00000040
#deffunc NtMessageBox str szText, int dwStyle, str szCaption, local usText, local usCaption, local pParams, local dwResponse, local uSourceText, local uSourceCaption
dim usText, 2
dim usCaption, 2
dim pParams, 3
dim dwResponse, 1
sdim uSourceText, strlen(szText) * 2 + 2, 1
sdim uSourceCaption, strlen(szCaption) * 2 + 2, 1
cnvstow uSourceText, szText
cnvstow uSourceCaption, szCaption
RtlInitUnicodeString varptr(usText), varptr(uSourceText)
RtlInitUnicodeString varptr(usCaption), varptr(uSourceCaption)
pParams.0 = varptr(usText)
pParams.1 = varptr(usCaption)
pParams.2 = dwStyle
NtRaiseHardError 0x40000018, 3, 3, varptr(pParams), 0, varptr(dwResponse)
RtlFreeUnicodeString varptr(usText)
RtlFreeUnicodeString varptr(usCaption)
return dwResponse
#global
*Main
objsize 128, 24
button "エラーメッセージ表示", *ShowError
stop
*ShowError
NtMessageBox "user32.dllのMessageBoxA または MessageBoxWを使わずに表示しています", MB_ICONERROR | MB_ABORTRETRYIGNORE, "エラー"
switch stat
case 2
mes "Abort"
swbreak
case 7
mes "Retry"
goto *ShowError
swbreak
case 4
mes "Ignore"
swbreak
swend
stop

| |
|
|
2026/3/1(Sun) 21:01:35|NO.104776
>レトロゲームにおける BG面的な処理をできないか模索して作った記憶があります
これを使えば、「DARIUS」のHSP完全移植も可能かも。
バッファにMapDrawしてsaveしてるね。
MainLoopにMapDrawし続けないと、
Map判定できないかな。
|
|