[420] Dycoon : "行動記述用スクリプト例"
KANI Lispではこのような形にしました.

http://www.rmake.net/dycoon/testbbs/files/extclass.txt

ほかにもいろいろな書き方はできますが
物体の行動記述で主に使いそうなのは次にあげる二つかと思います.
状態遷移的な書き方
メソッドが状態に対応しています.
動作内容としては,
床があるかどうかを調べて,床がなければ後退して方向転換をすることで
落下しないようにするという処理にしています.

(def TestClass2 (PhClass_Inherit TestClass
  '(
   ...
   (GoForward  ;前進状態
    '(lambda ()
     (if (BottomCheck)  ;床があるかどうか調べる
      (WalkTurn 1.0 0.0) ;前進する
      (progn ;複文
       (SetState '(GoBackward)) ;後ろに下がる状態へ遷移
       (def count 20)    ;後ろに下がるステップ数
      )
     )
    )
   )

   (GoBackward  ;後進状態
    '(lambda ()
     (if (> count 0)
      (progn ;複文
       (WalkTurn -1.0 0.0)  ;後ろに下がる
       (def count (- count 1))
      )
      (progn ;複文
       (SetState '(Rotate)) ;旋回状態へ遷移
       (def count 20)   ;旋回するステップ数
      )
     )
    )
   )

   (Rotate  ;旋回状態
    '(lambda ()
     (if (> count 0)
      (progn ;複文
       (WalkTurn 0.0 1.0)  ;旋回
       (def count (- count 1))
      )
      (SetState '(GoForward)) ;前進状態へ遷移
     )
    )
   )

   (States  ;初期状態を設定する
    (GoForward)
   )
  )
 )
)

シーケンス的な書き方
・4秒間前進

・5秒間旋回

・4秒間後退

・3秒間停止

・繰り返し
という具合の処理を行います.


(def TestClass3
 (PhClass_Inherit TestClass2
  '(
   (States  ;シーケンスを設定する
    (
     (Start '(TimerNext 4.0 '(WalkTurn 1.0 0.0))) ;4秒間前進
     (nil '(TimerNext 5.0 '(WalkTurn 0.0 1.0)))  ;5秒間旋回
     (nil '(TimerNext 4.0 '(WalkTurn -1.0 0.0)))  ;4秒間後退
     (nil '(TimerNext 3.0 '(WalkTurn 0.0 0.0)))  ;3秒間停止
     (nil '(GoLabel 'Start))  ;繰り返し
    )
   )
  )
 )
)


シーケンスの項目の先頭はラベルの役割をしているが
これは次のような形に
変更しようかとも思います.

(def TestClass3
 (PhClass_Inherit TestClass2
  '(
   (States  ;シーケンスを設定する
    (
     (TimerNext 4.0 '(WalkTurn 1.0 0.0)) ;4秒間前進
     (TimerNext 5.0 '(WalkTurn 0.0 1.0))  ;5秒間旋回
     (TimerNext 4.0 '(WalkTurn -1.0 0.0))  ;4秒間後退
     (TimerNext 3.0 '(WalkTurn 0.0 0.0))  ;3秒間停止
     (SetState States)  ;繰り返し
    )
   )
  )
 )
)

シーケンスをさらに状態遷移させることもできます.

処理が複雑になると状態遷移的な書き方が
力を発揮するとは思いますが
シーケンスによる書き方も
特に高級な命令がそろってきた段階ならば
手軽なものになるかと思います.
...Sat Dec 28 17:04:11 JST 2002



返信 編集