View this PageEdit this PageAttachments to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide

OBY24

PREV ------ ● TOP ● ------ NEXTUploaded Image: imager.jpg


表情のアニメーション?

つ〜か、オビーをほったらかしにしておいても、
勝手にいろいろと表情が変わるようにしてみるです。
stepでランダムにアニメーションやらかすわけですが、
まあほとんどがHeadMorphのパターンそのままでする。
(っていったら今までのも全部じゃん)




■メソッドを追加します。

Obyクラスstepメソッド
--------------------------------------------
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 )


としばらくするとエラーでまくりっす。
で調べてみるといろいろとメソッドを作り忘れてたのが発覚。
ってことでまたまたいくつかメソッドを追加です。

       Uploaded Image: image1.jpg



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 )




どうよ?やっとこさオビーに命を吹き込んだっつ〜かんじになってきたっしょ?


       Uploaded Image: image.jpg





PREV ------ ● TOP ● ------ NEXT







■ MEMO ■

Tuesday, 20 April 2004, 10:19:12 pm
ちなみにここまでのソースコード。--thoru

ObyMorph.st

Links to this Page