コロナ関係

Last-modified: 2015-05-03 (日) 21:21:24

コロナ関係 †
Opcode04D5などでコロナを作成する場合、スクリプトの同じ場所のコードは同一の物とみなされてしまいます。

for 3@ = 0 to 4

   0093: 4@ = integer 3@ to_float
   04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 4@ 0.0
   04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30

end
このようなコードを書いたとき、オブジェクトの場合は5個CJの前にオブジェクトが並びます。
ところがこのコードを実行するとCJから4m離れた所にコロナが一つ出てくるだけです。

04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 0.0
04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 1.0 0.0
04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 2.0 0.0
04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 3.0 0.0
04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 4.0 0.0
04D5: create_corona_at 0@ 1@ 2@ radius 1.0 type 4 flare 0 RGB 255 30 30
こうすることでこの問題は回避できますが、変数によってコロナを制御するにはとても不便な形となります。

そこで、あらかじめコードを書いておき、そこへそれぞれジャンプさせることによって
この問題を回避しようというのがこのページの趣旨です。


コード

:key
wait 0
if
00E1: player 0 pressed_key 17
jf @key
0006: 32@ = 0

:main
wait 0
if
0019: 32@ > 3000
then

   jump @key

end

for 0@ = 0 to 4

   0093: 1@ = integer 0@ to_float
   04C4: store_coords_to 2@ 3@ 4@ from_actor $PLAYER_ACTOR with_offset 0.0 1@ 0.0
   0085: 31@ = 0@ // (int)
   0012: 31@ *= -0x1F
   000A: 31@ += @corona
   gosub 31@

end
jump @main

:corona
hex
D504030200030300030400060000803F0404040005FF0005FF0005FF005100
D504030200030300030400060000803F0404040005FF0005FF0005FF005100
D504030200030300030400060000803F0404040005FF0005FF0005FF005100
D504030200030300030400060000803F0404040005FF0005FF0005FF005100
D504030200030300030400060000803F0404040005FF0005FF0005FF005100
end
最初の例のコードを動く形にしたものです。


D504030200030300030400060000803F0404040005FF0005FF0005FF005100

04D5: create_corona_at 2@ 3@ 4@ radius 1.0 type 4 flare 0 RGB 255 255 255
0051: return
をバイナリ変換した物です。

変換の仕方
{$VERSION 3.1.0027}
{$CLEO .cs}
04D5: create_corona_at 2@ 3@ 4@ radius 1.0 type 4 flare 0 RGB 255 255 255
0051: return
こんなコードを書いてコンパイルします。
その後.csをバイナリエディタで「D5 04」で検索し、hitしたところから「51 00」までをコピーすれば出来上がりです。
これをコロナを作りたい分hex-endで記述し、その前にラベルを付けます。
この場合5個なので5個分記述します。
あとはこの変換した部分にそれぞれジャンプさせることによって
5つのコロナを作成することが出来ます。

一番上のD504~ から使用していきます。
gosub @corona としてしまうと、一番上しか使用されず 結局最初の例のように一つしか作成されません。
ラベルは、コンパイルされるとき目的の場所が何バイト先にあるかを調べ、そのサイズに変換されます。
そこで、その構造を利用して別の場所へjumpさせます。

1. バイナリ変換後のサイズを見ます。
8bit=1byteなのでこの場合31バイトになります。 簡単に言うと2文字で1バイト計算です。
10進31は16進1Fですので上の例では0x1Fとなっています。10進で書いても問題ありません。

2. このサイズの負の値を使う番号に掛けます。上から0番目1番目…4番目

3. ラベルを足す。
あとはgosub 変数 と記述すると目的の場所へjumpさせることが出来ます。
※ここは全て整数型で計算してください。