DOFさんへの返信用記事です。
以下のコードは、CJからもっとも近くにある乗り物のハンドルを、
自分で追加したメモリプールの0x000番地に書き込むためのものです。
まず、一番下のMemoryPoolルーチンでメモリを確保します。0が8つあるので
最大0xFFFFFFFFまで、つまり4byteデータを1つ格納できます。それを5つ
用意してあります。GTAで扱う変数は、1つ当たり4byteあれば充分なので、
私は基本的に4byteメモリを1変数として使っています。
次にGetPointerルーチンは、メモリプールのMemoryPoolの位置を調べて
そのメモリ上のアドレスを変数30@に書き込む処理です。csの最初に
gosub @GetPointer
と書いておけば、以降30@を基準として追加メモリにいつでもアクセス
できるようになります。なので30@はcs内では絶対書き換えないように
しましょう。
そしてGetNearVehicleを呼び出すと、現在画面内に生成されている乗り物
全てを、ハンドルの数値が若い順から1つずつ探していきます。もし1つ
見つかったら、その乗り物とCJの距離を計算し、記憶します。同時にその
乗り物のハンドルも記憶しておきます。そして次の乗り物を探し、また
その乗り物との距離を計算し、もし現在記憶している距離よりも短ければ
上書き記憶します。長ければ無視します。これを全ての乗り物に対して
実行すれば、最期に記憶された乗り物はCJとの距離が一番近いものです。
ここで、このコードでは「CJとの距離」を条件にしています(赤字部分)が、
これを「規定の直方体の中にある乗り物で、最初に見つかったNGR500」
に変更すれば、GetNearVehicleを呼び出した時に規定の範囲内にNGR500が
存在するかをチェックできます。もし存在していたなら何もしなくていいですし、
1台も見つからなかった時はその範囲内の指定の位置に生成させればOKです。
あとはそのチェックするタイミングですが、これはCJが規定範囲内のある位置から
一定距離離れた瞬間とか、一定時間ごとなど、色々やり方はあると思います。
すいませんが、帰宅したばかりでもう寝ないとヤバいのでこの辺で(´・ω・`)ノシ
かなりアバウトな内容だとは思いますが、ほとんど全てを書いてます。
サンプルコード
--------------------------------
// ************************
// 追加メモリの先頭アドレスを取得する
// ************************
:GetPointer
0A9F: 30@ = current_thread_pointer
000A: 30@ += 0x10
0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0
000E: 30@ -= @MemoryPool
return
// ********************************************************
// もっとも近くにある乗り物のハンドルを0x000に格納する
// ********************************************************
:GetNearVehicle
0A8E: 31@ = 30@ + 0x000
0A8C: write_memory 31@ size 4 value -1 virtual_protect 0
0A8D: 27@ = read_memory 0xB74494 size 4 virtual_protect 0
000A: 27@ += 0x4
0A8D: 27@ = read_memory 27@ size 4 virtual_protect 0
for 28@ = 0 to 27904 step 0x100
0A8D: 26@ = read_memory 27@ size 1 virtual_protect 0
000A: 27@ += 0x1
if and
0029: 26@ >= 0x00
001B: 0x80 > 26@
then
005A: 26@ += 28@ // (int)
if
056E: car 26@ defined
then
0A8E: 31@ = 30@ + 0x05C
0A8D: 15@ = read_memory 31@ size 4 virtual_protect 0
if
15@ == -1
then
0A8C: write_memory 31@ size 4 value 26@ virtual_protect 0
else
00A0: store_actor $PLAYER_ACTOR position_to 10@ 11@ 12@
00AA: store_car 15@ position_to 13@ 14@ 15@
00AA: store_car 26@ position_to 16@ 17@ 18@
050A: 19@ = distance_between_XYZ 10@ 11@ 12@ and_XYZ 13@ 14@ 15@
050A: 20@ = distance_between_XYZ 10@ 11@ 12@ and_XYZ 16@ 17@ 18@
if
0025: 19@ > 20@
then
0A8C: write_memory 31@ size 4 value 26@ virtual_protect 0
end
end
end
end
end
return
// ************************
// 追加メモリのプール (5個分)
// ************************
:MemoryPool
hex
00000000 00000000 00000000 00000000 00000000
end
--------------------------------
【アクセサリ配布】瑞鷹梅酒(ワンカップ) |
(04/30)
|
結月ゆかり・弦巻マキをWindows10で起動する |
(04/20)
|
iコミックらんど 解約方法 |
(04/05)
|
MMDにおける視野角設定 |
(01/18)
|
ちゃいなくおりてー2 |
(11/02)
|