HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0804
GENKI作ってしまった使い道のないスクリプトを投稿するスレ14解決


GENKI

リンク

2024/8/4(Sun) 20:58:31|NO.102007

作ってみたものの使い道なかったわ…なスクリプトを投稿するためのスレッドです。
作品として公開するほどじゃないけど、せっかく作ったからどこかに投稿したい。そんな行き場のないスクリプトの公開場所にご利用ください。
後々誰かの開発の役に立てればよし。他の方の投稿を改良するもよし。いっそ誰の役に立たなくてもよし。そんな気持ちで書き込んでいただければと思います。

ルール無用だとあれそうなので約束事を書いておきますね。

約束事
・けんかしない
・何百行もあるような大きいスクリプトは投稿しない。
・できればコピペで動くといいな。(素材はHSPTVフォルダが便利です。)
・ライセンスはNYSL


補足:コードッターが投稿できなくなってしまっていたので立てました。



この記事に返信する


GENKI

リンク

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



Yta

リンク

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>



kinokawa

リンク

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



GENKI

リンク

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
𥝱は杼に置き変えてます。
ゲームの得点表示にと思ったものの、杼以上だと実数の誤差が出始めるので実用的じゃない問題。



MIZUSHIKI

リンク

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



kinokawa

リンク

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ゲームもいけそう。



kinokawa

リンク

2026/3/1(Sun) 02:21:54|NO.104774

>2Dゲームもいけそう。
レトロゲームにおける BG面的な処理をできないか模索して作った記憶があります



0x0-nyan

リンク

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判定できないかな。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.102007への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.