2012年8月14日火曜日

[ドリトル] 花火

季節がら、花火的なものを一つ作ってみる。
  • 重力を考慮する環境で1つタートルを打ち上げる。
  • 一定時間後、子タートルを放射状に展開し自身は消える。
  • 所定の世代数を消化するまで繰り返し。

G = 1.0.   // 重力効果値
FIRE_DURATION1 = 20. // 生成後、破裂するまでの時間(初期玉)
FIRE_DURATION2 = 15. // 生成後、破裂するまでの時間(初期玉以外)
CHILD_NUM = 6.  // 破裂時に生成する子の数
EXPLOSION_POWER = 10.      // 破裂の強さ(子の初速)

Screen ! (black) paint.
turtles = Array ! create.

t1 = Turtle ! create.
t1:vx = 3.     // 初期速度(X)
t1:vy = 30.    // 初期速度(Y)
t1:duration = FIRE_DURATION1.  // 最初の破裂までの時間
t1:life = 3.   // 残世代数
t1:myScale = 1.0.
t1 ! ( t1:myScale) scale.
t1 ! penup -200 -300 moveto.  // 打ち上げ位置へ移動
turtles ! (t1) add.   // タートルリストに加える

// 軌跡を残す場合はコメントアウトを外す。
// t1 ! (red) lineColor 1 linewidth pendown.  

// 1ステップ進める処理を定義する。
// 現在の速度に重力を加味して1ステップ分移動。
// 持ち時間に達したら子を生成して自身は消える。

t1:step = [ | ; forward r v deg | 
  vy = vy - G.
  v = sqrt(vx*vx + vy*vy).
  deg = atan(vy/vx).
  [vx < 0] ! then [deg = deg + 180] execute.
  ! (deg) direction.
  ! (v) forward.
  duration = duration - 1.
  [duration == 0] ! then [
    [(life) > 0] ! then [! makeChild] execute.
  ] execute.
].

// 破裂時の子生成
// 所定の数の子を作成して初期速度を与え、タートルリストに追加
// 子を生成したら自身は消去する。

t1:makeChild = [
  [ | n ; tChild |
    tChild = ! create.
    tChild:life = (life) - 1.  // 子は親より残世代が1つ減る。

    // 破裂までの時間設定。最後の世代は長寿命にしておく
    [ tChild:life > 0] ! 
        then [tChild:duration = FIRE_DURATION2] 
        else [tChild:duration = 1000] execute. 

    // 爆発の威力に応じた速度を各子に与える。
    tChild:vx = vx + EXPLOSION_POWER * cos(n * 360 / CHILD_NUM).
    tChild:vy = vy + EXPLOSION_POWER * sin(n * 360 / CHILD_NUM).
    tChild:myScale = myScale * 0.85.  // 親より少し小さめ
    tChild ! (tChild:myScale) scale.

    // タートルリストに加える。
    turtles ! (tChild) add.
  ] ! (CHILD_NUM) repeat.
  turtles ! (self) remove.
  ! makeFigure.   // 軌跡を残す時用に軌跡を切り離す。
  ! hide.
].

timer1 = Timer ! create.
timer1 ! 0.1 interval 6000 duration.

timer1 ! [ 
   turtles ! [| t | t ! step.] foreach. ] execute.


こんな感じになった。花火というより単にカメが破裂しているようにしか見えない気がするが、 とりあえずこんなところで。

軌跡を残すようにするとこんな感じになる。

...
// 軌跡を残す場合はコメントアウトを外す。
 t1 ! (red) lineColor 1 linewidth pendown.  
...




0 件のコメント:

コメントを投稿