|
 |
|
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になったら、覗いて見て下さい。
ちょっと長くてまとまりが悪いですが、スクリプトも公開しています。
|
|