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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0716
MIZUSHIKI#netinclude が出来ました(?)【GitHubに置いたモジュールを自動include】2解決


MIZUSHIKI

リンク

2020/7/16(Thu) 18:43:50|NO.91004

GitHub に置いたモジュールを自動で読み込んでくれるモジュール出来ないかなぁ・・・と常々思ってました。
なんか無理やりだけど、とりあえず出来た! ・・・のは出来たのですが、

#ifdef _debug //デバッグ時のみ #netinclude 処理を実行 #include "hspinet.as" ;デバッグ時の2つのincludeは我慢してもらう。しか・・・ #include "mod_regexp.as" #define ctype netinclude(%1) addition %1 exist "hsptmp" //addition の右側は「%c exist %1」とか繋げても一切反応しないから hsptmp を読みに行く if strsize>=0 { sdim tmp@_nichk:sdim res@_nichk:dim flg@_nichk ;初期化 notesel tmp@_nichk:noteload "hsptmp":noteunsel ;hsptmp読み込み matches tmp@_nichk, tmp@_nichk, "#netinclude\\s*\\(\\s*\"(.+?)\"\\s*\\)" ;#netinclude部分を読み取り repeat stat exist tmp@_nichk(cnt,1) ;ファイルがダウンロード済みなら何もしない if strsize=-1{ if flg@_nichk=0:netinit ;hspinetの初期化 flg@_nichk=1 ;1つでも未ダウンロードがないかのフラグ cdir=dir_cur ;カレントディレクトリ保存 split tmp@_nichk(cnt,1),"/",res@_nichk ;URL(ディレクトリ)構造分解 if stat>0 { repeat stat-1 ;深い階層を作っていく dirlist a,res@_nichk(cnt),5 ;フォルダ存在確認 if stat=0 :mkdir res@_nichk(cnt) ;フォルダが存在しないなら作る chdir res@_nichk(cnt) ;カレントディレクトリを1階層深くに移動 loop } neturl "https://raw.githubusercontent.com/"+getpath(tmp@_nichk(cnt,1),32) ;GitHubから netload getpath(tmp@_nichk(cnt,1),8) ;HSPモジュールをダウンロード chdir cdir ;元のカレントディレクトリに戻す } loop if flg@_nichk { ;1つでもダウンロードしてたらもう一度実行してもらう dialog "もう一度、実行してください" :end } sdim res@_nichk,0:sdim tmp@_nichk,0 ;大きめ(?)の変数を初期化 } #else //実行ファイル作成時はただの #include になる #define ctype netinclude(%1) include %1 #endif ;メインスクリプト内の #netinclude しか認識しません。 // 以下、サンプル // #netinclude("MIZUSHIKI/HSP-Module/master/a2d-AlphaLayer.hsp")/* ←最初はコレを消さないで実行してください。* / // 背景 picload dir_exe+"\\hsptv\\sozai5.jpg" ; 画像から仮想イメージを作成(イメージID 0) // キャラ素材ロード alCreateImageByFile 0, dir_exe+"\\hsptv\\tamadot.png" // キャラ alCreateImage 1, 64,64 ; 仮想イメージ(イメージID 1)を作って alalSetParent 1,,, 100,350 ; イメージID 1を貼り付け。 // キャラクターアニメーション:alCopyImageToImage と alalRedraw を繰り返す repeat alErase alCopyImageToImage 0,1, 0,0,64,64, 64*(4+cnt\4),64*3 ; イメージID 0 から 1 へ 歩きモーション(1〜4)をコピー alalRedraw 1 ; イメージID 1 のアルファレイヤーを更新。 alalWidth 1, ,, 100+cnt*10 ; アルファレイヤー(イメージID 1)の位置を移動 await 500 loop
・・・コピペして「んっ?スクリプトの色が?」と思ったでしょうが、実はこの#netincludeには作る途中には想像していなかった落とし穴が、、、

>サンプルスクリプト:
>『error 2 : 文法が間違っています』

サンプルの例で言うと #includeした後に使える「alalSetParent」等の新規命令が認識されないため
エラーで最初の#netinclude デバッグ実行すら起動してくれなかったのです。。。(ソリャソウダ
なので、

#netinclude("〜〜〜")/* ←コレがとりあえず必要になる。し、途中で複数行コメントアウトが出来ない。。。
ということに。┓(´〜`;)┏ ダメダコリャ

まぁ、致し方無しとしてとりあえずこのまま行きます。
圧縮版も作ってみました。

#ifdef _debug #include "hspinet.as" #include "mod_regexp.as" #define ctype netinclude(%1) addition %1 exist "hsptmp":if strsize>=0{sdim tmp@_nichk:sdim res@_nichk:dim flg@_nichk:notesel tmp@_nichk:noteload "hsptmp":noteunsel:matches tmp@_nichk,tmp@_nichk,"#netinclude\\s*\\(\\s*\"(.+?)\"\\s*\\)":repeat stat:exist tmp@_nichk(cnt,1):if strsize=-1{if flg@_nichk=0{netinit}:flg@_nichk=1:cdir=dir_cur:split tmp@_nichk(cnt,1),"/",res@_nichk:if stat>0{repeat stat-1:dirlist a,res@_nichk(cnt),5:if stat=0{mkdir res@_nichk(cnt)}:chdir res@_nichk(cnt):loop}:neturl "https://raw.githubusercontent.com/"+getpath(tmp@_nichk(cnt,1),32):netload getpath(tmp@_nichk(cnt,1),8):chdir cdir}:loop:if flg@_nichk{dialog "もう一度、実行してください":end}:sdim res@_nichk,0:sdim tmp@_nichk,0} #else #define ctype netinclude(%1) include %1 #endif #netinclude("MIZUSHIKI/HSP-Module/master/a2d-AlphaLayer.hsp")/* ←最初はコレを消さないで実行してください。* / // 背景 alCreateImageByFile 0, dir_exe+"\\hsptv\\sozai5.jpg" ; 画像から仮想イメージを作成(イメージID 0) alFont msgothic, 20,1 alDrawText "カーソルキーで移動", 10,10 alalSetParent 0 ; イメージID 0を描画先ウィンドウに貼り付け // キャラ alCreateImage 1, 64,64 ; 仮想イメージ(イメージID 1)を作って alLoadFile dir_exe+"\\hsptv\\tamadot.png", 0,0 ; 画像を読み込み alalSetParent 1 ; イメージID 1を描画先ウィンドウに貼り付け alalWidth 1, ,, 100,380 // 半透明楕円(池?) alCreateImage 2, 200,100 ; 仮想イメージ(イメージID 2)を作って alColor 64, 128, 255, 200 alFillEllip 0,0, 200,100 ; 楕円を書き込み alalSetParent 2 ; イメージID 2を描画先ウィンドウに貼り付け alalWidth 2, ,, 200,350 //カーソルキーでキャラ(イメージID 2)を移動 repeat alalGetRect 1, rect ; アルファレイヤー(イメージID 1)の位置を取得 getkey L,37 : getkey U,38 : getkey R,39 : getkey D,40 if L : rect(0)-=2 if U : rect(1)-=2 if R : rect(0)+=2 if D : rect(1)+=2 alalWidth 1, ,, rect(0),rect(1) ; アルファレイヤー(イメージID 1)の位置を移動 await 16 loop

勝手に #include されることへの危険性は、、、#netinclude頭の"MIZUSHIKI"とかの人の名前を見て判断してもらう、しかないかな。
(あと、命令じゃなくて関数なのは色々試したけどそれしかうまく動かなかったからです。)



この記事に返信する


MIZUSHIKI

リンク

2020/7/16(Thu) 18:47:15|NO.91005

「2D UI (GUIウィジェット) の作成について」
http://hsp.tv/play/pforum.php?mode=all&num=90686

以前、回答したスクリプトもそのまま実行して頂ければ動きますv

#ifdef _debug #include "hspinet.as" #include "mod_regexp.as" #define ctype netinclude(%1) addition %1 exist "hsptmp":if strsize>=0{sdim tmp@_nichk:sdim res@_nichk:dim flg@_nichk:notesel tmp@_nichk:noteload "hsptmp":noteunsel:matches tmp@_nichk,tmp@_nichk,"#netinclude\\s*\\(\\s*\"(.+?)\"\\s*\\)":repeat stat:exist tmp@_nichk(cnt,1):if strsize=-1{if flg@_nichk=0{netinit}:flg@_nichk=1:cdir=dir_cur:split tmp@_nichk(cnt,1),"/",res@_nichk:if stat>0{repeat stat-1:dirlist a,res@_nichk(cnt),5:if stat=0{mkdir res@_nichk(cnt)}:chdir res@_nichk(cnt):loop}:neturl "https://raw.githubusercontent.com/"+getpath(tmp@_nichk(cnt,1),32):netload getpath(tmp@_nichk(cnt,1),8):chdir cdir}:loop:if flg@_nichk{dialog "もう一度、実行してください":end}:sdim res@_nichk,0:sdim tmp@_nichk,0} #else #define ctype netinclude(%1) include %1 #endif #netinclude("MIZUSHIKI/HSP-Module/master/a2d-AlphaLayer.hsp")/* ←最初はコレを消さないで実行してください。* / #netinclude("MIZUSHIKI/HSP-Module/master/mod_TimerRepeat.hsp")/* * / // // スライダー // // 横棒 alCreateImage 0, 300,30 ; 仮想イメージ(ID 0) alColor 0, 0, 0, 1 alFillRect ; 薄膜貼っとかないと円の上端と下端がクリック反応しない alColor 200, 200, 200, 255 alFillRect 15, alGetHeight()/2-5, alGetWidth()-30, 10 //とりあえず非表示で張り付けてしまう。(子ウィンドウを乗せていくため) alalSetParent 0,,1, 100,100, *dummy ; 子ウィンドウにクリック判定を付けるため親もコールバック設定する必要あり(ダミー) // 丸 alCreateImage 1, 30,30 ; 仮想イメージ(ID 1) alColor 255, 64, 64, 255 alFillEllip 0, 0, alGetWidth()-1, alGetHeight()-1 alalSetParent 1,0,, 135,0, *click ; 仮想イメージ(ID 0)の子ウィンドウとする。さらにクリック判定のためのコールバックをセット。 // ここでスライダーを表示 alalShow 0 // // 前面レイヤー(オーバーレイ表示) : ボールをウィンドウ内でバウンドさせる // alCreateImage 2,ginfo_sx,ginfo_sy ; 仮想イメージ(ID 2) alColor 100,100,255,125 alalSetParent 2 alalZtop 2 goto *OJAMA stop *click switch iparam case 0x0201 ;WM_LBUTTONDOWN alalGetRect 1, rect ; アルファレイヤー(ID 1)の位置を取得 ret = 1.0/270*(rect(0)) mes "スライダー値: "+ret // スライダーの値を簡単に取得するため timer_repeat を使用。 timer_repeat 50 alalGetRect 0, uniq(rect0),-1 ; アルファレイヤー(ID 0)の位置を取得(p3=-1でスクリーン座標) uniq(set) = ginfo_mx - uniq(rect0)(0)-15 ; timer_repeat内ではuniq()でユニークな変数を定義できる。 if uniq(set)<0 :uniq(set)=0 if uniq(set)>270 :uniq(set)=270 alalWidth 1, ,,uniq(set) ; スライダーの●の位置を変更 alalGetRect 1, uniq(rect) ; アルファレイヤー(ID 1)の位置を取得 uniq(ret) = 1.0/270*(uniq(rect)(0)) title "スライダー値: "+uniq(ret) alColor 100,100,255,uniq(ret)*255 ; スライダーの値に合わせて ball の透明度を変更 // クリックを離していたら timer_repeat を終了させる。 getkey uniq(clk),1 if uniq(clk) == 0 :timer_break timer_deinit: mes "スライダー値: "+1.0/270*(uniq(rect)(0)) timer_loop swbreak swend return *dummy return // // オブジェクト(スライダー)の前面と背面にオジャマ描画 // *OJAMA bpx=5 : bpy=5 ; ボール用初期値 repeat // line color rnd(100)+155,rnd(100)+155,rnd(100)+155 a = rnd(ginfo_sx+ginfo_sy) cxy = ginfo_cx, ginfo_cy line a(0)*(a(0)<ginfo_sx), (a(0)-ginfo_sx)*(a(0)>=ginfo_sx), ginfo_sx, ginfo_sy pos cxy(0),cxy(1) // ball blx=blx+bpx : if blx<=0 || blx>=ginfo_sx-100 : bpx=-bpx bly=bly+bpy : if bly<=0 || bly>=ginfo_sy-100 : bpy=-bpy alErase alFillEllip blx,bly, 100,100 alalRedraw 2 color await 32 if cxy(1)>ginfo_sy-100 : break loop color 255,0,0 mes "OJAMA STOP!!" stop



MIZUSHIKI

リンク

2020/7/17(Fri) 12:28:50|NO.91009

すみません。
#netinclude ですが、関数じゃなくて命令で行けました。。。
うーん、どこかで勘違いしてそのまま思い込んでしまったようです。

【圧縮版】

#ifdef _debug #include "hspinet.as" #include "mod_regexp.as" #define netinclude(%1) addition %1 exist "hsptmp":if strsize>=0{sdim tmp@_nichk:sdim res@_nichk:dim flg@_nichk:notesel tmp@_nichk:noteload "hsptmp":noteunsel:matches tmp@_nichk,tmp@_nichk,"#netinclude\\s*\"(.+?)\"":repeat stat:exist tmp@_nichk(cnt,1):if strsize=-1{if flg@_nichk=0{netinit}:flg@_nichk=1:cdir@_nichk=dir_cur:split tmp@_nichk(cnt,1),"/",res@_nichk:if stat>0{sdim a@_nichk:repeat stat-1:dirlist a@_nichk,res@_nichk(cnt),5:if stat=0{mkdir res@_nichk(cnt)}:chdir res@_nichk(cnt):loop}:neturl "https://raw.githubusercontent.com/"+getpath(tmp@_nichk(cnt,1),32):netload getpath(tmp@_nichk(cnt,1),8):chdir cdir@_nichk}:loop:if flg@_nichk{dialog "もう一度、実行してください":end}:sdim res@_nichk,0:sdim tmp@_nichk,0} #else #define netinclude(%1) include %1 #endif #netinclude "MIZUSHIKI/HSP-Module/master/a2d+AlphaLayer.hsp" /* ←最初はコレを消さないで実行してください。* /

【通常版】

#ifdef _debug //デバッグ時のみ #netinclude 処理を実行 #include "hspinet.as" ;デバッグ時の2つのincludeは我慢してもらう。しか・・・ #include "mod_regexp.as" #define netinclude(%1) addition %1 exist "hsptmp" //addition の右側は「%c exist %1」とか繋げても一切反応しないから hsptmp を読みに行く if strsize>=0 { sdim tmp@_nichk:sdim res@_nichk:dim flg@_nichk ;初期化 notesel tmp@_nichk:noteload "hsptmp":noteunsel ;hsptmp読み込み matches tmp@_nichk, tmp@_nichk, "#netinclude\\s*\"(.+?)\"" ;#netinclude部分を読み取り repeat stat exist tmp@_nichk(cnt,1) ;ファイルがダウンロード済みなら何もしない if strsize=-1{ if flg@_nichk=0:netinit ;hspinetの初期化 flg@_nichk=1 ;1つでも未ダウンロードがないかのフラグ cdir@_nichk=dir_cur ;カレントディレクトリ保存 split tmp@_nichk(cnt,1),"/",res@_nichk ;URL(ディレクトリ)構造分解 if stat>0 { sdim a@_nichk repeat stat-1 ;深い階層を作っていく dirlist a@_nichk,res@_nichk(cnt),5 ;フォルダ存在確認 if stat=0 :mkdir res@_nichk(cnt) ;フォルダが存在しないなら作る chdir res@_nichk(cnt) ;カレントディレクトリを1階層深くに移動 loop } neturl "https://raw.githubusercontent.com/"+getpath(tmp@_nichk(cnt,1),32) ;GitHubから netload getpath(tmp@_nichk(cnt,1),8) ;HSPモジュールをダウンロード chdir cdir@_nichk ;元のカレントディレクトリに戻す } loop if flg@_nichk { ;1つでもダウンロードしてたらもう一度実行してもらう dialog "もう一度、実行してください" :end } sdim res@_nichk,0:sdim tmp@_nichk,0 ;大きめ(?)の変数を初期化 } #else //実行ファイル作成時はただの #include になる #define netinclude(%1) include %1 #endif ;メインスクリプト内の #netinclude しか認識しません。 #netinclude "MIZUSHIKI/HSP-Module/master/a2d+AlphaLayer.hsp" /* ←最初はコレを消さないで実行してください。* /



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