|
|
|
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"とかの人の名前を見て判断してもらう、しかないかな。
(あと、命令じゃなくて関数なのは色々試したけどそれしかうまく動かなかったからです。)
| |
|
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
| |
|
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" /* ←最初はコレを消さないで実行してください。* /
| |
|