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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1014
アキアキノヒロロおにたまさんの[#defcfunc alien]に物理法則を融合4解決


アキアキノヒロロ

リンク

2021/10/14(Thu) 12:41:53|NO.94165

『ゾロゾロ関数(+物理法則)』です。
コンテスト応募"ANIMAL_ISLAND"での不都合を改善しようと、工夫しました。

もとは、おにたまさんの[#defcfunc alien]です。
https://qiita.com/onionsoftware/items/d9c837725251ae89a376

これを取り入れた時、あとを追うモデルに物理設定するのを初めから諦めていました。
しかし、やはり追随モデルがどんなものも素通り通過してしまうのは、ダメだ。
で、どうにかしたスクリプトです。
これを「sample/hgimg4/」に入れて実行してみて下さい。

ゾロゾロ関数(+物理法則)

#include "hgimg4.as" title "ゾロゾロ関数(+物理法則)" gpreset setcls CLSMODE_SOLID, $404040 gpfloor id_floor, 15,15, $00ffff ; 床ノードを追加 gppbind id_floor, 0 ; [地面]の物理設定を行なう setpos GPOBJ_CAMERA, 0,5,15 ; カメラ位置を設定 box_x=0.0 : box_y=0.3 : box_z=0.0 ;〓〓[tamane]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox ta_box, 0.6, 0x3333ff ; [tamane]用箱ノードを追加 (青色) setpos ta_box, box_x, box_y, box_z setcoli ta_box, 1, 1 ; コリジョングループ設定 gppbind ta_box, 1.0, 1.0 ; 物理設定 setalpha ta_box, 32 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_tamane, "res/tamane" ; [tamane]モデル読み込み setscale id_tamane, 0.006,0.006,0.006 setpos id_tamane, box_x, box_y-0.3, box_z ;〓〓ターゲット〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox target, 0.2, 0xff0000 ; ターゲット用箱ノードを追加 (赤色) setpos target, box_x-1, box_y-0.1, box_z-1 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ;〓〓[tamane2]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox ta2_box, 0.6, 0x3333ff ; [tamane2]用箱ノードを追加 (青色) setpos ta2_box, -6, 0.3, 5 ; 仮の初期位置(基本的にどこでもいい) setcoli ta2_box, 1, 1 ; コリジョングループ設定 gppbind ta2_box, 1.0, 1.0 ; 物理設定 setalpha ta2_box, 32 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_tamane2, "res/tamane2" ; [tamane2]モデル読み込み setscale id_tamane2, 0.007,0.007,0.007 setpos id_tamane2, 0, 0.0, 0 ; 仮の初期位置(基本的にどこでもいい) ; メインループ内で、[tamane2]用箱の位置をコピー ;〓〓障害物〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox block, 1.2, 0xffff00 ; 障害物用箱ノードを追加 (黄色) setpos block, -2, 0.6, 2 setcoli block, 1, 1 gppbind block, 0 ; 物理設定 = 動かない setalpha block, 192 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *MainLoop stick key,15 if key&128 : end ; タッチでカメラ位置を動かす if dragmd { ; ドラッグ中 getkey a,1 if a=1 { dx=0.05*(mousex-dragx)+cx dy=0.05*(mousey-dragy)+cy setpos GPOBJ_CAMERA, dx,dy,cz } else { dragmd=0 } } else { ; ドラッグなし getkey a,1 if a { dragx=mousex:dragy=mousey getpos GPOBJ_CAMERA, cx,cy,cz dragmd=1 } } gplookat GPOBJ_CAMERA, 0,0,0 ; カメラから指定した座標を見る ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ; カーソルキーで[ta_box]を動かす if key&1 : gppapply ta_box, GPPAPPLY_IMPULSE, -0.1, 0.0, 0.0 if key&4 : gppapply ta_box, GPPAPPLY_IMPULSE, 0.1, 0.0, 0.0 if key&8 : gppapply ta_box, GPPAPPLY_IMPULSE, 0.0, 0.0, 0.1 if key&2 : gppapply ta_box, GPPAPPLY_IMPULSE, 0.0, 0.0, -0.1 getpos ta_box, x, y, z setpos id_tamane, x, y-0.3, z setpos target, x-1, y-0.1, z-1 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ getpos ta2_box, now_x, now_y, now_z ; [ta2_box]の 現在の位置 etx=alien( now_x, x-1) ; [ta2_box]の 進むべき X座標 etz=alien( now_z, z-1) ; [ta2_box]の 進むべき Z座標 ;■■ 新規関数[#defcfunc alien] へ行く = [gosub *#defcfunc alien ~ return 戻り値] のようなかたち // setpos ta2_box, etx, 0.0, etz ; メインループ毎時の [ta2_box]の進むべき[etx, 0.0, etz]の位置 と 現在の[ta2_box]の位置 との差 impulse_x = etx - now_x ; X方向の差 impulse_z = etz - now_z ; Z方向の差 ; この差をX,Z方向の[impulse]として、[GPPAPPLY_IMPULSE]で、[ta2_box]を動かす gppapply ta2_box, GPPAPPLY_IMPULSE, impulse_x, 0, impulse_z ; 動いた[ta2_box]の位置を、[id_tamane2]にコピー getpos ta2_box, x, y, z setpos id_tamane2, x, y-0.3, z ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ redraw 0 ; 描画開始 gpdraw ; シーンの描画 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 goto *MainLoop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 #defcfunc alien double value, double value2 ; [double] = 実数値に変換 esp(0)=0.09*1.5 : esp(1)=0.08*1.5 ; [tamane2]用箱 の移動スピード ; res=limitf( value2-value, -esp(0), esp(1) ) ; [limit] ではなく、[limitf]実数値 とする ; return value+res ; 上記の2式を合わせて ↓↓ return value+limitf( value2-value, -esp(0), esp(1) ) ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
方向キーで、[tamane]を動かすと、[tamane2]も動きます。
物理設定している[ta2_box]の位置をコピーしているので、障害物でつっかえます。
[tamane]に回転の動きを加えたり、[ta2_box]をさらなるターゲットとして、二人目の追随者を加えることもできます。
更に更に、三人目、四人目なんてことも、物理設定付きで。



この記事に返信する


アキアキノヒロロ

リンク

2021/10/16(Sat) 22:04:07|NO.94175

複数の追随者(ここでは3人)のスクリプトを載せます。
ただ、各ターゲットをそれぞれのキャラの真後ろにすると、リーダーのちょっとした動きでも、振れ幅が大きくなりすぎます。
動きは面白いけど......。プログラムに組み込むと、不都合なことが起こりやすいでしょう。
リーダー真後ろに等間隔で置いた方が扱いやすそうです。
書き換えのコメントのある行を◆◆~◆◆で置き換えると、各ターゲットを等間隔にしたものになります。
「sample/hgimg4/」に入れて実行してみて下さい。

#include "hgimg4.as" title "ゾロゾロ関数(+物理法則)" gpreset setcls CLSMODE_SOLID, $404040 gptexmat id_tex, "hsp3dish.png" ; テクスチャマテリアル作成 gpfloor id_floor, 50, 50, , id_tex ; 床ノードを追加 gppbind id_floor, 0 setpos GPOBJ_CAMERA, 0,5,15 ; カメラ位置を設定 box_w=0.6 : box_x=0.0 : box_y=box_w/2 : box_z=0.0 ;〓〓[id_model(0)]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox mo_box(0), box_w, 0x3333ff ; [id_model(0)]用箱ノードを追加 (青色) setpos mo_box(0), box_x, box_y, box_z setcoli mo_box(0), 1, 1 ; コリジョングループ設定 gppbind mo_box(0), 1.0, 1.0 ; 物理設定 setalpha mo_box(0), 64 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_model(0), "res/tamane" ; [tamane]モデル読み込み setscale id_model(0), 0.006,0.006,0.006 setpos id_model(0), box_x, box_y-box_y/2, box_z ;〓〓[id_model(1)]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox mo_box(1), 0.6, 0x3333ff ; [id_model(1)]用箱ノードを追加 (青色) setpos mo_box(1), -6, 0.3, 5 ; 仮の初期位置(基本的にどこでもいい) setcoli mo_box(1), 1, 1 ; コリジョングループ設定 gppbind mo_box(1), 1.0, 1.0 ; 物理設定 setalpha mo_box(1), 64 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_model(1), "res/tamane2" ; [tamane2]モデル読み込み setscale id_model(1), 0.007,0.007,0.007 setpos id_model(1), 0, 0.0, 0 ; 仮の初期位置(基本的にどこでもいい) ; メインループ内で、[id_model(1)]用箱の位置をコピー ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 getpos mo_box(1), x, y, z ;〓〓[id_model(2)]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox mo_box(2), 0.6, 0x3333ff ; [id_model(2)]用箱ノードを追加 (青色) setpos mo_box(2), x-1, y, z-1 ; 仮の初期位置(基本的にどこでもいい) setcoli mo_box(2), 1, 1 ; コリジョングループ設定 gppbind mo_box(2), 1.0, 1.0 ; 物理設定 setalpha mo_box(2), 64 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_model(2), "res/tamane2" ; [tamane2]モデル読み込み setscale id_model(2), 0.004,0.006,0.004 setpos id_model(2), 2, 0.0, 2 ; 仮の初期位置(基本的にどこでもいい) ; メインループ内で、[id_model(2)]用箱の位置をコピー ;〓〓[id_model(3)]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox mo_box(3), 0.6, 0x3333ff ; [id_model(3)]用箱ノードを追加 (青色) setpos mo_box(3), x-3, y, z-3 ; 仮の初期位置(基本的にどこでもいい) setcoli mo_box(3), 1, 1 ; コリジョングループ設定 gppbind mo_box(3), 1.0, 1.0 ; 物理設定 setalpha mo_box(3), 64 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpload id_model(3), "res/tamane2" ; [tamane2]モデル読み込み setscale id_model(3), 0.005,0.007,0.005 setpos id_model(3), 2, 0.0, 2 ; 仮の初期位置(基本的にどこでもいい) ; メインループ内で、[id_model(3)]用箱の位置をコピー ;〓〓障害物〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox block_A, 1.2, 0xffff00 ; 障害物用箱ノードを追加 (黄色) setpos block_A, -2, 0.6, 2 setcoli block_A, 1, 1 gppbind block_A, 0 ; 物理設定 = 動かない setalpha block_A, 192 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpbox block_B, 1.2, 0xffff00 ; 障害物用箱ノードを追加 (黄色) setpos block_B, 3, 0.6, -8 setcoli block_B, 1, 1 gppbind block_B, 0 ; 物理設定 = 動かない setalpha block_B, 192 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ gpbox block_C, 1.2, 0xffff00 ; 障害物用箱ノードを追加 (黄色) setpos block_C, 6, 0.6, 4 setcoli block_C, 1, 1 gppbind block_C, 0 ; 物理設定 = 動かない setalpha block_C, 192 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;〓〓ターゲット〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox target(0), 0.2, 0xff0000 ; ターゲット用箱ノードを追加 (赤色) gpbox target(1), 0.2, 0xff0000 ; ターゲット用箱ノードを追加 (赤色) gpbox target(2), 0.2, 0xff0000 ; ターゲット用箱ノードを追加 (赤色) ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpact id_model(0) gpact id_model(1) gpact id_model(2) gpact id_model(3) number=3 ; 従者の人数 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *MainLoop stick key,15 if key&128 : end if key&2 { ; ■■ [↑]キーで、前進 ; [モデルの向きの変化量] が [カメラの向きの変化量] と違うならば if model_cnt!=ca_cnt : gosub *model_cnt_set ; [モデル=id_model(0)] の向きを操作 ; [モデルの向きの変化量] が [カメラの向きの変化量] に同じならば if model_cnt=ca_cnt { ; deg2rad(ca_deg) = カメラ角度(ca_deg)をラジアンに変換して Mx=sin (deg2rad(ca_deg))*(0.1) Mz=cos (deg2rad(ca_deg))*(0.1) gppapply mo_box(0), GPPAPPLY_IMPULSE, Mx, 0.0, Mz ; 珠音用箱に[GPPAPPLY_IMPULSE](=瞬間的な衝撃)を与える } setangr id_model(0), 0.0, model_cnt, 0.0 } if key&8 { ;■■ [↓]キーで、後退 ; [モデルの向きの変化量] が [カメラの向きの変化量] と違うならば if model_cnt!=ca_cnt : gosub *model_cnt_set ; [モデル=id_model(0)] の向きを操作 ; [モデルの向きの変化量] が [カメラの向きの変化量] に同じならば if model_cnt=ca_cnt { ; deg2rad(ca_deg) = カメラ角度(ca_deg)をラジアンに変換して Mx=sin (deg2rad(ca_deg))*(-0.03) Mz=cos (deg2rad(ca_deg))*(-0.03) gppapply mo_box(0), GPPAPPLY_IMPULSE, Mx, 0.0, Mz } setangr id_model(0), 0.0, model_cnt, 0.0 } ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ; 次の ①→②→③→④ を繰り返すことで、順次、後を追っていくモデルの動きとなる ; ただ、主人となる[モデル]は、操作による回転/移動(位置決め)なので、自らの[ターゲット]はない ; 当然、① はなく、次の ② から始まり、操作している [ボックス] に 主人の [モデル] をセット ; ③ の回転の代わりに、それと連動するカメラの動きを入れる ; ④ の回転値は、操作による回転なので、これまた当然、求める必要はなく ; 次の ① で、自らの[モデル] の回転値に、操作による回転値(model_cnt)を使って、最初の従者用の[ターゲット]の位置決めをする ; ここからは、②→③→④→①→②→③ とループしていくが、最後の従者は、③ でループ終了 ; ■■ ① ■■ [モデル] の回転に応じて、その[モデル]の後ろに 次の [ターゲット] の位置を決める ; ■■ ② ■■ [ターゲット] に近づいて行く [ボックス] に [モデル] をセット ; ■■ ③ ■■ その [モデル] の向きを 前の [モデル] の方向に向き直す ; ; ■■ ④ ■■ 操作している [モデル] の回転値を求める ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;■■ ② ■■ 操作している [ボックス=mo_box(0)] に 主人の [モデル=id_model(0)] をセット ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ getpos mo_box(0), x, y, z setpos id_model(0), x, y-box_w/2, z ;■■ ③ ■■ (カメラをセット)その [モデル=id_model(0)] の向きを操作 ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ base_x=x : base_y=y : base_z=z gosub *camera_set ; カメラをセット repeat number + 1 ; number=3 if cnt!=0 { ; 主人 でなければ ;■■ ③ ■■ その [モデル=id_model(cnt)] の向きを 前の [モデル=id_model(cnt-1)] の方向に向き直す ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ getpos id_model(cnt-1), mo_x, mo_y, mo_z gplookat id_model(cnt), mo_x, mo_y, mo_z addangr id_model(cnt), 0, 128, 0 ;■■ ④ ■■ その [モデル=id_model(cnt)] の回転値を求める ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆ getangr id_model(cnt), angr_x, angr_y, angr_z ;〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆ if angr_x = 0 { angr255_y = ( angr_y+256) \ 256 } else { angr255_y = (-angr_y+384) \ 256 } ;〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆〇●□■◇◆ } ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;■■ ① ■■ [モデル] の回転に応じて、その[モデル=id_model(cnt)]の後ろに 次の [ターゲット=target(cnt)] の位置を決める ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ if cnt=0 : angr_cnt=model_cnt ; 主人 ならば if cnt!=0 : angr_cnt=angr255_y ; 主人 でなければ if cnt!=number { ; 最後の従者 でなければ mo_deg=360* angr_cnt /256 ;この行を ◆◆[ mo_deg=360* model_cnt /256 ]◆◆ で、ターゲット等間隔 marker_x=sin (deg2rad(mo_deg))*1.2 ;この行を ◆◆[ marker_x=sin (deg2rad(mo_deg))*1.2 *(cnt+1) ]◆◆ で、ターゲット等間隔 marker_z=cos (deg2rad(mo_deg))*1.2 ;この行を ◆◆[ marker_z=cos (deg2rad(mo_deg))*1.2 *(cnt+1) ]◆◆ で、ターゲット等間隔 getpos mo_box(cnt), x, y, z setpos target(cnt), x-marker_x, 0.1, z-marker_z getpos target(cnt), target_x, target_y, target_z ; その [ターゲット=target(cnt)] に、次の [ボックス=mo_box(cnt+1)] を 近づけていく ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ getpos mo_box(cnt+1), now_x, now_y, now_z ; [mo_box(cnt+1)]の 現在の位置 etx=alien( now_x, target_x) ; [mo_box(cnt+1)]の 進むべき X座標 etz=alien( now_z, target_z) ; [mo_box(cnt+1)]の 進むべき Z座標 ;■■ 新規関数[#defcfunc alien] へ行く = [gosub *#defcfunc alien ~ return 戻り値] のようなかたち // setpos mo_box(cnt+1), etx, 0.0, etz ; メインループ毎時の [mo_box(cnt+1)]の進むべき[etx, 0.0, etz]の位置 と 現在の[mo_box(cnt+1)]の位置 との差 impulse_x = etx - now_x ; X方向の差 impulse_z = etz - now_z ; Z方向の差 ; この差をX,Z方向の[impulse]として、[GPPAPPLY_IMPULSE]で、[ボックス=mo_box(cnt+1)]を動かす gppapply mo_box(cnt+1), GPPAPPLY_IMPULSE, impulse_x, 0, impulse_z ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;■■ ② ■■ [ターゲット] に近づいて行く [ボックス=mo_box(cnt+1)] に [モデル=id_model(cnt+1)] をセット ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ getpos mo_box(cnt+1), x, y, z setpos id_model(cnt+1), x, y-box_w/2, z ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;■■ ③ ■■ その [モデル=id_model(cnt+1)] の向きを 前の [モデル=id_model(cnt)] の方向に向き直す ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ getpos id_model(cnt), mo_x, mo_y, mo_z gplookat id_model(cnt+1), mo_x, mo_y, mo_z addangr id_model(cnt+1), 0, 128, 0 } loop ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ redraw 0 ; 描画開始 gpdraw ; シーンの描画 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 goto *MainLoop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 #defcfunc alien double value, double value2 ; [double] = 実数値に変換 esp(0)=0.09*2.0 : esp(1)=0.08*2.0 ; [tamane2]用箱 の移動スピード ; res=limitf( value2-value, -esp(0), esp(1) ) ; [limit] ではなく、[limitf]実数値 とする ; return value+res ; 上記の2式を合わせて ↓↓ return value+limitf( value2-value, -esp(0), esp(1) ) ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *camera_set if key&1 { ; [←]キー ca_cnt++ if ca_cnt=256 : ca_cnt=0 } if key&4 { ; [→]キー ca_cnt-- if ca_cnt=-256 : ca_cnt=0 } setangr GPOBJ_CAMERA, 0, ca_cnt, 0 // [モデルの向き]≠[カメラの向き]の場合も組み入れているので、この命令は削除 // setangr id_model, 0, ca_cnt, 0 ; 珠音も、カメラと同じだけの回転量 // [ca_cnt](=256で一回転)を増減することで、カメラの移動方向の角度[ca_deg]を変える // 単位係数を(-20)として、珠音用箱からの カメラ位置のX/Z方向の距離を求め、カメラをセットする ca_deg=360*ca_cnt/256 ; deg2rad( ) = 度をラジアンに変換 Cx=sin (deg2rad(ca_deg))*(-20) Cz=cos (deg2rad(ca_deg))*(-20) setpos GPOBJ_CAMERA, base_x+Cx, base_y+10, base_z+Cz ; カメラをセット gplookat GPOBJ_CAMERA, base_x, base_y-7, base_z ; カメラから指定した座標(珠音用箱方向)を見る return ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *model_cnt_set ; [モデルの向きの変化量] が [カメラの向きの変化量] より大きいならば if model_cnt>ca_cnt { sa=model_cnt-ca_cnt if sa<=128 : model_cnt-- : if model_cnt<ca_cnt : model_cnt=ca_cnt if sa>128 : model_cnt++ : if model_cnt>(ca_cnt+256) : model_cnt=ca_cnt } ; [モデルの向きの変化量] が [カメラの向きの変化量] より小さいならば if model_cnt<ca_cnt { sa=model_cnt-ca_cnt if sa>=-128 : model_cnt++ : if model_cnt>=ca_cnt : model_cnt=ca_cnt if sa<-128 : model_cnt-- : if model_cnt<=(ca_cnt-256) : model_cnt=ca_cnt } return ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓



アキアキノヒロロ

リンク

2021/10/17(Sun) 07:07:54|NO.94176

補足です。
このスクリプトの肝は、以下の点です。

目印となるターゲットへ向かって従者を近づけて行く時、
[#defcfunc alien]で求められた、進むべきはずの位置と、
その時従者が実際にいる位置との差を、
X,Z方向の[impulse]として、[GPPAPPLY_IMPULSE]で、動かすということです。
もちろん、物理設定してある従者用の箱を動かすことで、従者を動かすのです。
こうすることで、従者に物理挙動を反映させるのです。

また、このターゲットの位置の決め方で、全体の動きも変わってくるということです。



アキアキノヒロロ

リンク

2021/10/19(Tue) 16:36:32|NO.94204

コンテスト応募作"ANIMAL_ISLAND"に、上記の『ゾロゾロ関数(+物理法則)』を何とか組み込むことが出来ました。
これで、素通り通過の不都合はなくなりましたが、様々な設定数値を調整し直すのに、これまた時間がかかりそうです。
とにかく、プログラムへの後からの適用はやっかいなものですね。
とりあえずは、一段落ついて、ホッとしました。



アキアキノヒロロ

リンク

2021/10/29(Fri) 13:49:19|NO.94246

『ゾロゾロ関数(+物理法則)』を組み込んで、"ANIMAL_ISLAND_ver1.1"、アップしてきました。
ゲーム(ではないですが)の中でどんな感じで動いているのか、見ていただけると、うれしいです。
まだ、アップしてきたばかりです。ダウンロードOKになったら、覗いて見て下さい。
ちょっと長くてまとまりが悪いですが、スクリプトも公開しています。



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