オブジェクト操作

Last-modified: 2015-05-03 (日) 21:16:57

オブジェクト操作 †
物を作成し、動かしたり当てたりするには ただOpcodeを眺めているだけでは難しい事です。
ここでは大まかな方法を記述します。


使用する主なcode †
0107: 0@ = create_object #KNIFECUR at 0.0 0.0 0.0
0382: set_object 0@ collision_detection 1
0392: make_object 0@ moveable 1
04D9: object 0@ set_scripted_collision_check 1
04DA: has_object 0@ collided
0750: set_object 0@ visibility 0
09CA: set_object 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
069A: attach_object 0@ to_object 1@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0
069B: attach_object 0@ to_actor 1@ with_offset 0.0 0.5 -1.0 rotation 0.0 0.0 0.0
0682: detach_object 0@ 0.0 0.0 0.0 collision_detection 0
0381: throw_object 0@ velocity_in_direction 1@ 2@ 3@
01C4: remove_references_to_object 0@ // This object will now disappear when the player looks away

0107 座標を指定してオブジェクト作成
0382 当たり判定。0で無し 1で有り
0392 飛ばせるようにするかどうか。1で飛ばせるようにする
04D9 当たり判定を調べるか。0で調べない 1で調べる
04DA 0@が何かに当たったかどうか。あらかじめ04D9で調べるように設定しなければならない
0750 可視か不可視か。0で不可視 1で可視
09CA オブジェクトの耐性。0で耐性無 1で耐性有 左から銃撃、炎、爆発、衝撃(?)、水(?)
069A 0@を回転し、1@から見た座標へ0@をくっつける。
069B 0@を回転し、$PLAYER_ACTORから見た座標へ0@をくっつける。
0682 当たり判定を指定し、0@をくっついていない状態にする。
0381 0@をX方向に1@m/s、Y方向に2@m/s、Z方向に3@m/sの速さで移動させる。(初速)
01C4 使わないオブジェクト0@を解放する。


オブジェクトを飛ばす †

04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 3.0 0.0
0107: 0@ = create_object #KNIFECUR at 1@ 2@ 3@
0382: set_object 0@ collision_detection 1
0392: make_object 0@ moveable 1
0381: throw_object 0@ velocity_in_direction 0.0 0.0 20.0
01C4: remove_references_to_object 0@ // This object will now disappear when the player looks away

#KNIFECUR
0381を実行した後は重力が掛かります。0906でオブジェクトの重さを0にしても変わりません。
水平に飛ばしたい場合は重力を切るか、毎フレーム0381でZ+0.8m/sを実行すると良いでしょう。
後者の場合は一定距離離れたらオブジェクトを消すなどする必要があります。


オブジェクトの当たり判定を調べる †

0107: 0@ = create_object #KNIFECUR at 0.0 0.0 100.0
0382: set_object 0@ collision_detection 0
09CA: set_object 0@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
 
0107: 1@ = create_object 1582 at 0.0 0.0 100.0
0750: set_object 1@ visibility 0
09CA: set_object 1@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
 
069A: attach_object 0@ to_object 1@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0
069B: attach_object 1@ to_actor $PLAYER_ACTOR with_offset 0.0 3.0 0.0 rotation 0.0 0.0 0.0
0682: detach_object 1@ 0.0 0.0 0.0 collision_detection 1
0381: throw_object 1@ velocity_in_direction 30.0 0.0 5.0
04D9: object 1@ set_scripted_collision_check 1
0006: 32@ = 0
 
:loop
wait 0
if and
03CA: object 1@ exists
03CA: object 0@ exists
then

   if or
   04DA:   has_object 1@ collided
   0019:   32@ > 3000
   then
       01BB: store_object 1@ position_to 2@ 3@ 4@
       020C: create_explosion_with_radius 2 at 2@ 3@ 4@
       0108: destroy_object 1@
       0108: destroy_object 0@
       jump @loopend
   end

end
jump @loop

:loopend

東に向かって30m/s 上に向かって5m/sでナイフを飛ばし、何かに当たるか3秒たった場合
ナイフが存在する場所に爆発を作成し、ナイフを消すcodeです。

一連の流れ

ナイフと当たり判定用のダミーを作成する
ナイフには元々当たり判定が無く、04D9が使用できません。ですので当たり判定がある別のオブジェクト(1582)を一緒に作成しています。
1582はPizza Boxです。小さくて空気抵抗が少ないので多くのプログラマに愛されています。
ナイフとダミーを無敵にしてあるのは、ダメージを受けるとオブジェクトが消えてしまうことがあるため。
ダミーのピザは見えると格好悪いので見えないようにします。
ナイフとダミーをくっつける
くっつけることで一回のオブジェクト操作だけで両方が同時に動いてくれます。
ここからはダミーのみを操作します。
オブジェクトの位置修正
ダミーを$PLAYER_ACTORにくっつけます。ここで回転をかけたりします。
この命令を実行すると 0392: make_object 1@ moveable 1 を記述する必要が無くなります。
飛ばす
$PLAYER_ACTORについたままでは飛ばせないので外します。同時に当たり判定も付けます。
オブジェクトを飛ばし、04D9で当たり判定を調べられるようにします。
当たり判定チェック
この場合は時間制限もあるので タイマー32@を初期化します。
一応0@と1@がオブジェクトとして使用可能かチェックします。
1@(ダミー)が何かにぶつかっているか タイマーの値が3000msより大きい場合 爆発を作成し、オブジェクトを消します。
1@だけでなく0@(ナイフ)も消すのをお忘れ無く。
上の例ではナイフの角度や飛ぶ方向は固定です。必要に応じて座標計算を行ってください。