OBY24
表情のアニメーション?
つ〜か、オビーをほったらかしにしておいても、
勝手にいろいろと表情が変わるようにしてみるです。
stepでランダムにアニメーションやらかすわけですが、
まあほとんどがHeadMorphのパターンそのままでする。
(っていったら今までのも全部じゃん)
■メソッドを追加します。
● Obyクラスstepメソッド
- 1/10の確率で口の表情をかえたり〜の
(daha,heh,uhyo,nee,ehe gohのメソッドからランダムに選びちょっとしてから
口の表情をnomal gee hoheのメソッドからランダムに選んでます。)
- 1/5の確率で目の開閉をやり〜の
- 1/20の確率で目を細めたりもとにもどしたり〜の
- 1/3の確率でカーソルの方を見させたり〜の
- 1/3の確率で正面を向かせたり〜の
- 1/3の確率でワールド内のモーフのどれかを見させたり〜のしてます。
--------------------------------------------
step
| amount |
super step.
10 atRandom = 1
ifTrue: [[self lips perform: #(daha heh aha uhyo nee ehe goh) atRandom.
(Delay forMilliseconds: 2000 atRandom) wait.
self lips perform: #(nomal nomal gee hohe) atRandom] fork].
5 atRandom = 1
ifTrue: [[self closeEye.
(Delay forMilliseconds: 180) wait.
self openEye.
2 atRandom = 1 ifTrue: [self lookAtFront]] fork.
^ self].
20 atRandom = 1
ifTrue: [amount _ (0.2 to: 1.0 by: 0.01) atRandom.
amount _ self eyes leftEye eyeExtent x * amount.
self eyes leftEye openness: amount.
self eyes rightEye openness: amount].
3 atRandom = 1 ifTrue: [self lookAtHand. ^ self].
3 atRandom = 1 ifTrue: [self lookAtFront. ^ self].
3 atRandom = 1 ifTrue: [self lookAtMorph: self world submorphs atRandom]
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
ここで登場する「perform」と「fork」なんすけど、なんか難しそうな響きじゃん。
ちょっとひきぎみだったけど、でもどこかで聞いたことあるなあ・・と思ったのね。
そうそう「perform」はプラガブルってやつを調べてたときに出てきたやつでした。
これを使うと実行時までメソッドの名前が決まってなくてもいいんだって。
だからランダムで決まるまでどのメソッドを使うか決めなくてもだいじょうぶってな
処理ができるわけね・・・・なんるほど。
(さくさくSmalltalkね)
それから「fork」なんすけどこれも「Smalltalk Idioms」読んでたらでてきたぞおお!
並行性を記述するためにフォーク(fork)を用いるそうです。(スレッドみたいなもん?)
「Smalltalk Idioms」は最近ちょっとづつ読んでたんだけどグッドタイミングでした。
● ObyクラスstepTimeメソッド
ステップタイムは1000にするです。
--------------------------------------------
stepTime
^ 1000
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
★インスタンスを出して試してみる
--------------------------------------------
boby _ Oby new openInWorld
--------------------------------------------
Alt + d ( Cmd + d )
としばらくするとエラーでまくりっす。
で調べてみるといろいろとメソッドを作り忘れてたのが発覚。
ってことでまたまたいくつかメソッドを追加です。
● ObyEyeクラスopennessメソッド
目の縦の幅を変えるメソッドっす。
--------------------------------------------
openness: aNum
| previousCenter |
previousCenter _ self eye center.
self eye extent: (self eye extent x) @ aNum.
self eye align: self eye center with: previousCenter.
(self eye containsPoint: self iris center) ifFalse: [self lookAtFront]
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● ObyEyesクラスopennessメソッド
ObyEyesでもアクセスできるようにするです。これで両目の設定ができるってわけね。
--------------------------------------------
openness: aNum
self leftEye openness: aNum.
self rightEye openness: aNum.
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● Obyクラスopennessメソッド
Obyからもアクセスできるようにしまする。
--------------------------------------------
openness: aNum
self eyes openness: aNum.
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● ObyEyesクラスlookAtFrontメソッド
ObyEyesからもアクセスできるようにします。
ObyEyeにはすでにメソッドは作っちゃってあるからね。
--------------------------------------------
lookAtFront
self leftEye lookAtFront.
self rightEye lookAtFront.
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● ObyクラスlookAtFrontメソッド
Obyからもアクセス可能にするです。
--------------------------------------------
lookAtFront
self eyes lookAtFront.
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● ObyEyeクラスinitializeメソッドの修正
eyeExtentの初期化の行を追加します。(緑の部分ね)
--------------------------------------------
initialize
super initialize.
eyeExtent _ self extent.
"目の土台の設定"
self color: Color transparent.
self extent: 15@15.
"白目の設定"
eye _ EllipseMorph new.
eye color: (Color r: 1.0 g: 0.968 b: 0.935).
eye extent: 15 @ 15.
eyeExtent _ eye extent.
self addMorphFront: eye.
eye align: eye center with: self center.
"黒目の生成と設定"
iris _ EllipseMorph new.
iris extent: 6@6.
iris borderWidth: 0.
iris color: Color black.
eye addMorphFront: iris.
self lookAtFront
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
● ObyEyeクラスcloseEyeメソッド
上で初期化しちゃったんでこの行は削除です。(コメントアウトしてるけどね)
--------------------------------------------
closeEye
"eyeExtent _ self eye extent."
self iris delete.
self eye position: self eye position + (0 @ (self eye extent y // 2)).
self eye extent: self eye extent x @ 2
--------------------------------------------
アクセプト。
Alt + s ( Cmd + s )
★インスタンスを出して試してみる
--------------------------------------------
boby _ Oby new openInWorld
--------------------------------------------
Alt + d ( Cmd + d )
どうよ?やっとこさオビーに命を吹き込んだっつ〜かんじになってきたっしょ?
▲PREV ------ ● TOP ● ------ NEXT▼
■ MEMO ■
Tuesday, 20 April 2004, 10:19:12 pm
ちなみにここまでのソースコード。--thoru
ObyMorph.st
Links to this Page
- I BOBY last edited on 28 April 2004 at 8:57:55 pm by tk0005-202x210x196x109.ap-TK.usen.ad.jp
- OBY23 last edited on 18 June 2007 at 5:29:41 am by localhost.localdomain
- OBY25 last edited on 17 June 2007 at 7:25:33 am by localhost.localdomain