[プログラミング] スクリプトを利用したAlgodooでの色々なギミックの作り方

プログラミング

Algodooは2D物理シミュレータとして様々なことを表現することができます。
本記事ではAlgodooで実現できる各ギミックの作り方を備忘としてまとめておきます。
Tipsなども含めていますので参考にしてみてください。

物体に設定する変数

Algodoo上で作成した物体は、右クリックのメニューから「スクリプトメニュー」を選択することで、物体に設定されている変数名と値を確認することができます。
細かい設定をするにはこの値を変更することになります。

加えて、ユーザ側で制御できる変数を設定することが可能です。
この変数を使うことで、例えば、特定の変数がtrueの場合に挙動を変えるといった、ユーザ独自の制御に使うことができます。

ユーザ変数を設定する場合は、変数の先頭に「_」(アンダーバー)を指定することに注意してください。
指定しなかった場合、一時的な変数とみなされ、Algodooアプリを再起動した場合などは、設定した変数が削除される動作となります。

「_hitpoint」という変数を定義する場合は以下を実行します。
テキストボックスに「_hitpoint=5」を入力してエンターキーで確定します。

変数の一覧に「_hitpoint」として定義されます。もちろん値を変更することも可能です。

物体Aの動きに残像を残す

物体が落下する際にモーションをつける設定です。
無理に設定する必要はないですが、動きが分かりやすくなったり、単純に見た目が派手になりますので、見ていて楽しいです。

設定は簡単で、右クリックのメニューから「図形アクション」ー「中心にトレーサーを取り付ける」を選択するだけです。

トレーサーの設定項目として「完全に消えるまでの時間」と「サイズ」を指定することができます。
「完全に消えるまでの時間」が長いと、残像が残る時間が長くなり、見づらくなったり、PC側にも負荷が掛かりやすいので短めに設定することをおすすめします。
「サイズ」については、トレーサーを取り付ける物体の大きさとも比較して調整すれば大丈夫です。

トレーサーの内側の丸印が気になると思いますので、「セレクトメニュー」から「背面へ」を選択することで隠すことができます。

あとは、「表示」から「境界線を表示」と「おうぎ形を表示する」のチェックを外すことで、トレーサー付きのシンプルな円を作成することができます。

実際に動かしてみると、落下中の物体に残像が表示される動作となります。

物体Aが物体Bにぶつかったら物体Aを消す

ここでは、物体A(赤色の円)が、物体B(黄色の四角系)にぶつかった時に、物体Aを消すような例で解説します。

単純に物体を作成するだけだと、落下してしまうので、物体Bを壁とするために、背景に固定しておきます。
「図形アクション」から「背景に接着」を選択することで落下しないようにできます。

この状態で動かしても、当たり前ですが物体Aは消えません。

ぶつかった際に物体Aを消す方法としては、2通りの方法があります。
用途によって使い分けることができますが、「1. 物体Aに設定する方法」で問題ないと思います。

1. 物体Aに設定する方法

物体Aに設定を追加します。
「スクリプトメニュー」から「onColide」の値に以下のスクリプトを追記します。

(e)=>{
    e.this.timeToLive = 0
}

実行するとぶつかったタイミングで、物体Aが消えるようになったと思います。

スクリプト解説

まず、物体がぶつかった際にはonColideが呼び出されます。onColide変数に指定された値が実行されると思ってくれたら大丈夫です。

e.this.timeToLive=0 という意味は、e.thisが自分の物体(物体A)を指しており、その物体のtimeToLive(生存時間)を0に設定しています。
timeToLiveはデフォルトでは無限大に設定されており、通常は消えることはないですが、ぶつかった時にこの値が0に設定されることで消える動作となります。

2. 物体Bに設定する方法

物体Bに設定を追加します。
「スクリプトメニュー」から「onColide」の値に以下のスクリプトを追記します。

(e)=>{
    e.other.timeToLive = 0;
}

実行するとぶつかったタイミングで、物体Aが消えるようになったと思います。

スクリプト解説

まず、物体がぶつかった際にはonColideが呼び出されます。onColide変数に指定された値が実行されると思ってくれたら大丈夫です。

e.other.timeToLive=0 という意味は、e.otherが自分の物体(物体B)以外(つまりは物体Aが対象)のtimeToLive(生存時間)を0に設定しています。
timeToLiveはデフォルトでは無限大に設定されており、通常は消えることはないですが、ぶつかった時にこの値が0に設定されることで消える動作となります。

物体Aが物体Bに何度かぶつかったら物体Aを消す

ブロック崩しなどで、何度か物体にぶつかったら消すようなロジックがあると思います。
Algodooでも同様な動作を作れます。

ここでは、物体A(赤色の円)が、物体B(黄色の四角系)に何度か(ここでは5回とします)ぶつかった時に、物体Bを消すような例で解説します。
物体Bはブロックとして背景に固定しておきます。

物体Bに何度ぶつかったかの情報を保持しておくため、ユーザ変数を設定しておきます。
ここでは「_hitpoint=5」を設定します。
設定方法は冒頭の「物体に設定する変数」に従ってください。

さらに物体Bの「スクリプトメニュー」から「onColide」の値に以下のスクリプトを追記します。

(e)=>{
    e.this._hitpoint = e.this._hitpoint - 1;
    e.this._hitpoint <= 0 ? {
        e.this.timeToLive = 0
    } : {}
}

実行してみると、物体Bに物体Aなどが5回ぶつかったタイミングで消えます。

スクリプト解説

e.this._hitpoint = e.this._hitpoint - 1;

何回ぶつかったかを管理する変数の値を-1しています。
(ヒットポイントが0になったら消えるイメージです)

    e.this._hitpoint <= 0 ? {
        e.this.timeToLive = 0
    } : {}

Algodooでは、Thymeというスクリプト言語が使用されており、こちらはThymeでのif文となります。
_hitpoint変数の値が0以下になったら、e.this.timeToLive = 0によって自分の物体を消す動作としています。

物体を消す別の方法

「e.this.timeToLive = 0」の代わりに、以下のコードでも物体を消すことができます。

    e.this.collideSet = 0;
    e.this.colorHSVA = [0, 0, 0, 0]

衝突レイヤー(e.this.collideSet)を無効化(0)した上で、色(e.this.colorHSVA)を透明にする([0, 0, 0, 0]の4つめの数値が透明度)ことで消えるように見せることができます。

物体としては存在していますので、別の条件で再度復活させることもできます。

コメント

タイトルとURLをコピーしました