![]() | handler という関数(引数はscene)を設定(def)して、フレームが変化するごとに呼び出されるハンドラー(frame_change_pre)として登録をしました。 フレームの変更があった際に、そのフレームの処理を行う前に呼び出されます。 このスクリプトでは、print文を使ってフレーム数を出力しています。 注)printの出力は(メイン画面ではなく)コンソールに表示されます。 | |
![]() | ||
ところで、少しずつ機能を変えながら何度もスクリプトを実行していくと、登録されたハンドラーがどんどん溜ってゆき、似たような処理を何度も行うようになってしまいます。 しかも、このhandlerという名前の関数は、たとえ関数の中身を変更して(新しい関数として)登録されたのちも、古い関数はずっと残って実行され続けます。 | ||
| 登録前に、clear()を使って登録リストを空にしておきます。 おそらく、これで古い関数も誰からも参照されなくなるので、自動で削除(ガベージコレクション)されるものと信じています。 |
| 毎回オブジェクトを生成してゆくので、シーンの最初では一度いらないオブジェクトをクリアする必要があります。 クリア用の関数を作成しました。 使い捨てのオブジェクトかどうかは、今回名前で管理するようにしました。 前セクションで作った、オブジェクトを全てクリアするスクリプトを変更して、Ico*という名前のオブジェクトなどを削除する関数を定義してみます。 fnmatchという拡張機能を使うと、ワイルドカードなどが使えて便利ということです。 | |
| ClearObjects() は frame 2 で呼ぶようにしました。 本当は1にするべきですが、デバグ中などにシーンの先頭にいくとものが消えてしまうと、少々不便なためです。 8コマごとにオブジェクトを生成するようにします。 | |
| オブジェクトを生成するスクリプトは、前セクションのものを少し変更したものです。 幾つかキーフレームを配置することで、初期速度を設定しています。 | |
![]() | 適当な背景のオブジェクトを配置してアニメーションを再生(Alt+A)すると、球が次々に出現してこぼれ落ちてゆくシーンが設定できました。 | |
| デフォルト状態ではシーンの最後に達すると、先頭に戻ってオブジェクトがすべてクリアされてしまうので、最後に再生を停止するようにスクリプトを追加しました。 |
|
frame_change_pre をクリアするハンドラを作成して render_pre に登録しました。 これで、一度レンダリングを実行すると、フレームごとのハンドラ処理は行わなくなるので、 オブジェクトのクリアや生成は起こらなくなります。 (再度有効にするには、再度スクリプトの実行が必要になります) |
| 出現時にキーフレームを配置するまでは、表示や相互作用を無効にして、出現した時に初めて有効になるように、出現時の処理にいくつか追加をしました。 | |
![]() | アニメーション再生(Alt-A)を一度実行するとシーンが構築されます。 その状態でレンダリングを行うことで、シーンをもとにレンダリングを実行することができるようになりました。 |