Top > 豆知識
HTML convert time to 0.003 sec.


豆知識

Last-modified: 2015-05-03 (日) 21:31:06

豆知識 †
知っているとスクリプトが作りやすくなるかもしれない小ネタ。

パスから外す(車)
その辺に走っている車を制御するとき、たとえば

07D5: set_car [email protected] velocity_in_direction_XYZ [email protected] [email protected] 0.0 rotation_velocitiesXY 0.0 0.0 unk 0.0
このようなコードを使うだけでは どんな値を設定しても車に対して反映されません。
これは車がパスに沿って走っているからです。
スクリプトのパスとは違うので、05D6や05ECを使っても意味がありません。
このパスは、物が当たったり攻撃されたり外的要因が加わると外れるようです。
なるべく車を傷つけずパスだけ外したいという場合、

04FE: deflate_tire 2 on_car [email protected]
0699: set_car [email protected] repair_tire 2
このようなコードを入れます。パンクさせすぐに直しているだけです。
0001:wait を挟んでいないので、パンクしているのを見ることは出来ません。

パスから外す(人)
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 0.0 0.0 0.0
人が地面についている場合、このコードではZ方向のみで、XとYにいくら高い値を入れても反映されません。
ですので一度地面から離してやる必要があります。
方法1
00A0: store_actor $PLAYER_ACTOR position_to [email protected] [email protected] [email protected]
00A1: put_actor $PLAYER_ACTOR at [email protected] [email protected] [email protected]
00A1を実行すると地面より少し高い位置に置き換えられるのを利用。
方法2
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 0.0 0.0 10.0
wait 0
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 10.0 0.0 0.0
一度Z方向のみを適用させ、1フレーム待ってXY方向を適用させる。
Z方向は適用されるので、waitを入れることで地面から離すことが出来る。

タイマー
タイマー[email protected],[email protected]には1フレームの時間が加算されます。
通常25FPSのGTA:SAでは毎フレーム最大40が加算されます。
これを利用して、フレームが一定で無くても等間隔に同じスピードでオブジェクトや煙などを配置することが出来ます。
また、タイマーは整数型なので1フレームが1>t(ms)>0の場合、
つまり、通常あり得ませんが1001FPS以上出ている時は0が加算され
タイマーや0001:wait 1以上 を使用することが出来なくなります。
主に015D: set_gamespeed 0.025以下等 を使った場合に発現します。

コロナ、レーシングチェックポイント
動かない場合は問題ありませんが、基点が高速で移動するとコロナやレーシングチェックポイントが思った位置より後ろに出現してしまいます。
コロナは速度ベクトルの1/25.0
レーシングチェックポイントは速度ベクトルの1/12.5
をそれぞれ足すことによって遅れを修正することができます。
おそらくフレームレートの影響を受けているので、タイマーから値を取るとより正確になるでしょう。
以下に車に乗って移動する時のレーシングチェックポイントの例を書きます。

0093: [email protected] = integer [email protected] to_float //毎フレーム[email protected]を0にする必要あり。
0017: [email protected] /= 3.2 //[email protected]の最大を40とし常に比を一定にするためタイマー値を 40/12.5=3.2 で割る。
06A2: get_car [email protected] velocity_in_direction_XYZ [email protected] [email protected] [email protected]
0073: [email protected] /= [email protected] // (float) //タイマー不使用の場合は 12.5で割る
0073: [email protected] /= [email protected] // (float) //タイマー不使用の場合は 12.5で割る
0073: [email protected] /= [email protected] // (float) //タイマー不使用の場合は 12.5で割る
00AA: store_car [email protected] position_to [email protected] [email protected] [email protected]
005B: [email protected] += [email protected] // (float)
005B: [email protected] += [email protected] // (float)
005B: [email protected] += [email protected] // (float)
07F3: move_racing_checkpoint [email protected] to [email protected] [email protected] [email protected]
0006: [email protected] = 0

人物車の解放
01C2: remove_references_to_actor $PLAYER_ACTOR // Like turning an actor into a random pedestrian
01C3: remove_references_to_car [email protected] // Like turning a car into any random car
01C4: remove_references_to_object [email protected] // This object will now disappear when the player looks away
勘違いされている方が多いのですが、このコードははcleoで作成した人物車のみに使用します。
例えば、その辺に走っている車に乗った時変数へ代入、その後01C3を使用したりしてはいけません。
ミッションなどで作成された車などを勝手に解放してしまうと、車から離れたり0395を使用するスクリプトだったりする場合
存在しない車を制御しようとするのでエラーが出る可能性が非常に高くなります。
Ryderミッションの床屋から出た時エラーが出るのはほぼ全てこれが原因です。

オブジェクト制御

オブジェクトを制御するとき
0381: throw_object [email protected] velocity_in_direction [email protected] [email protected] [email protected]
このコードをよく使われると思います。
しかし、オブジェクトには限界速度があり 詳しく調べていないのですが150~200m/s辺りです。
それ以上の速度で移動させる必要がある場合、オブジェクトの座標を直接操作します。
毎フレーム移動させることになるので、フレームレートに依存します。
この方法で移動させる場合前述のタイマーの項目通り、ゲームスピードが著しく低い場合は使うことが出来ません。

0006: [email protected] = 0
for [email protected] = 0 to 250

   wait 0
   0093: [email protected] = integer [email protected] to_float 
   0006: [email protected] = 0
   0013: [email protected] *= 1.0
   0400: store_coords_to [email protected] [email protected] [email protected] from_object [email protected] with_offset 0.0 0.0 [email protected]
   01BC: put_object [email protected] at [email protected] [email protected] [email protected]

end
このコード場合、1000m/sで10km飛んでいきます。(25FPSの場合)
速度の調整は0013で行います。1.0=1000m/s 0.1=100m/s という感じです。
もちろん、ただの移動なので04DAなどで衝突判定をすることは出来ませんので
06BD: (check) no_obstacles_between [email protected] [email protected] [email protected] and [email protected] [email protected] [email protected] solid 1 car 0 actor 0 object 0 particle 0
このコードを使って障害物があればアクションを起こすようにすれば擬似的な衝突判定が出来ます。

しかしこのコードにも問題があり、01BCを使用すると移動後の座標に近い人、物、車が消えてしまします。
(人物車その他を作るときに注意すべき事参照)
近くの場合はメモリを操作して移動させることが出来るのですが、
プレイヤーから一定の距離を離れるとメモリで操作しても"表示上"の座標が更新されないという仕様があります。
今のところ回避方法は分かっていませんが、0381を併用することで速度は変わってしまいますが、見かけは問題なく動作します。