スクリプトの例

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

スクリプトの例 †
実際にスクリプトを挙げて解説します。
スクリプトの書き方については、人によってかなりクセがあったりします。

{$VERSION 3.1.0027}
{$CLEO .cs}
thread 'CONVENI'

:START
wait 0
if
8AB0:not key_pressed 109 //-
jf @TXT
if
8AB0:not key_pressed 107 //+
jf @CATA
if
8AB0:not key_pressed 106 //*
jf @CREATE
jump @START

:TXT
wait 500
03E5: show_text_box 'TXT'
jump @START

:CATA
wait 500
if
056D: actor $ACTOR_CATALINA defined
jf @START
Actor.SetImmunities($ACTOR_CATALINA,1,1,1,1,1)
jump @START

:CREATE
wait 1000
0247: load_model #NRG500
038B: load_requested_models

:CREATE2
wait 0
if
0248: model #NRG500 available
jf @CREATE2
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 3.0 0.0
00A5: 10@ = create_car #NRG500 at 1@ 2@ 3@
01C3: remove_references_to_car 10@ // Like turning a car into any random car
jump @START

0A93: end_custom_thread
このスクリプトは「-」キー押下で'TXT'の内容を表示
「+」キー押下でカタリーナを無敵に
「*」キー押下でNRG500を目の前に出す
ということをやります。


それでは順に解説していきます。

{$VERSION 3.1.0027}
{$CLEO .cs}
thread 'CONVENI'
詳しくはSBの使い方へ

:START
wait 0
if
8AB0:not key_pressed 109 //-
jf @TXT
 :
jf @CREATE
jump @START
キーが押下されたか確認する部分です。8AB0,先頭が8なので否定の意味です。
jfはjump_if_falseの省略形で、偽を返されたときにラベルへジャンプします。
「key109(テンキー"-")が押されない場合真を返す」
押されると偽を返すので:TXTへジャンプします。何も押されなければ:STARTへ戻ります。
ここでは自分が分かりやすいように注釈を付けています。( //- )

:TXT
wait 500
03E5: show_text_box 'TXT'
jump @START
waitの次の数値はミリ秒です。 1000ms = 1s なのでここでは0.5秒待ちます。
理由は処理が早く、キーを押下したとき何度もこの処理を行うのを防ぐためです。
03E5は左上にテキストを表示します。
表示したら:STARTにジャンプします。

他の方法として

:TXT
wait 0
if
8AB0: not key_pressed 109 //-
jf @TXT
03E5: show_text_box 'TXT'
jump @START
とすれば、キーを離すと初めて処理が実行されます。
こうすることで連打に対応が出来ます。

:CATA
wait 500
if
056D: actor $ACTOR_CATALINA defined
jf @START
Actor.SetImmunities($ACTOR_CATALINA,1,1,1,1,1)
jump @START
カタリーナを無敵にします。Class(Actor.Set Immunities)についてはClassについてを参照してください。
カタリーナがいないときに無敵にしようとすると エラーが出て落ちますので
その前に、$ACTOR_CATALINAが人として有効であるかチェックします。
有効でないなら:STARTにジャンプします。有効ならば無敵にして:STARTにジャンプします。

:CREATE
wait 1000
0247: load_model #NRG500
038B: load_requested_models
NRG500を出すための前処理を行ってます。
乗り物に限らず、人、物も同じ前処理が必要です。

手順
1.モデルをロードする

2.ロードできたか(使用可能か)確認する

3.モデルを出す(このとき車なのか人なのか物なのかを指定する)

4.必要なければモデルを解放する

038B: load_requested_models
リクエストを終了します という宣言。
モデルロードの最後に必ず表記します。

:CREATE2
wait 0
if
0248: model #NRG500 available
jf @CREATE2
モデルがロードできたか(使用可能か)チェックしています。
もしロード出来ていなかったら:CREATE2へジャンプします。

04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 3.0 0.0
00A5: 10@ = create_car #NRG500 at 1@ 2@ 3@
01C3: remove_references_to_car 10@ // Like turning a car into any random car
jump @START
ロードできたら車を出します。
04C4で目の前の座標XYZをそれぞれ1@ 2@ 3@に格納します。
NRG500を座標1@ 2@ 3@に出し、10@に格納します。

01C3は必要のない車(10@)を解放しています。
これを表記するとCJが車から離れると自動的に消えます。
消えてほしくないときは書きません。
書かない場合は、必ず車を消すコードをどこかに書かなければなりません。
出した状態でセーブした場合永遠に消えなくなります。
車を出したら:STARTにジャンプします。

0A93: end_custom_thread
スレッドを終了します。
この場合はループするのでスレッドが終了することはありません。
なので付けても付けなくてもどっちでも良いです。
似たものにend_threadがありますが、これは使ってはいけません。
この命令では他のスレッドも全て終了してしまいます。
弊害として、解放されていない人・物・オブジェクトがセーブによって全て消せなくなったりします。