SqueakToys その2
では今度こそ本当に息抜きに(トラップ抜きで(笑))、いくつか興味深いフレーズを使ってスクリプトを楽しんでみましょう。--sumim - 2002-11-30, 19:12:45
…と思ったのですが、結構、重要なテーマを扱うのを忘れていたので、もうちょっと頭をひねっていただきます(^_^;)。--sumim - 2002-11-30, 19:24:20
Ant を緑ハローで複製して、スクリプトを走らせてください。3色 Rectangle の上での動きは問題ないと思います。しかし、二匹同時に動かすと、アニメがぎこちなくなる、もしくはまったく動かなくなるのに気づかれると思います。--sumim - 2002-11-30, 19:27:24
これは2匹の蟻が、共通のインデックスを同時にインクリメントしてしまっているためだとすぐわかります。--sumim - 2002-11-30, 19:29:25
本流復帰\(^^)/
>では今度こそ本当に息抜きに
…と思ったのですが
はは(汗)
ちょっとやぼ用がありますので,続きは明日になるかも知れません.すみません…--人狼 - 2002-11-30, 19:47:36
>編集が加わればすぐにわかるので見過ごされることはめったにない
私には判りませんので,教えて頂けると幸いです(と,ここでも好奇心丸出しで地雷原突入(汗))--人狼 - 2002-11-30, 19:48:57
さすがにアクセスしないとわかりませんが、changes をブックマークしておくと編集が加えられるとトップにくるのですぐわかります。このページのように頻繁に書き変わっている場合は常にトップにあるのでだめですが…。--sumim - 2002-11-30, 19:55:12
>changes をブックマークしておくと編集が加えられるとトップにくるのですぐわかります
了解しました.いや,まったくもっておっしゃる通りです.changesを見る癖を付けなくては.では,行って参ります.--人狼 - 2002-11-30, 20:02:42
帰って来ました.
>二匹同時に動かすと、アニメがぎこちなくなる、もしくはまったく動かなくなる
現象を確認しました.ご説明頂いた理由も了解です.(どうでもよい事ですが…F-15と言う名前のままで複製したらF-16と言う名前のモーフが出来ました.蟻なのに(苦笑))--人狼 - 2002-11-30, 21:02:25
プチウケ(笑)>F-16
ぎこちなくなる問題を解消するのにインスタンス変数を使ってみたいと思ったのですが、よい実装方法を思いつきません(笑)。一緒に考えてみてください。あと、こうした作業を通じて、緑ハローによる同じ挙動をする複製モーフの管理が面倒だ…ということに気づいていただくのも趣旨にあります。--sumim - 2002-11-30, 22:11:00
あと、訂正があります。プレイヤが生まれるタイミングですが「モーフがデスクトップに現れたとき」と申し上げましたが、正確には「ビューワをはじめて表示させたとき」になります。これに絡めて三手でモーフを動かせる…という最初の例で示したコードもひとつメッセージを変える必要がありました(ビューワを表示させたことのないモーフでこのコードを do-it するとスケッチモーフならいけるのですが、他のモーフだとノーティファイアが出てうまく動きません)。--sumim - 2002-11-30, 22:32:31
プレイヤが生まれるのは,ビューワを初めて表示させた時なのですか.う〜ん,ちょっとしっくり来ませんね.これではビューワを表示させない限り絵を動かす事が出来ないのでしょうか….今はSqueakToysで絵を動かしていますが,Smalltalkから動かす場合にも,ビューワを表示させなくてはならないと言う事になりますでしょうか?ちなみに,三手での例ですが私のところではノーティファイアは出ないのですが?--人狼 - 2002-11-30, 22:54:54
>これではビューワを表示させない限り絵を動かす事が出来ない
そんなことはありません。例に赤字で示したように、ないなら作る的メッセージである assuredPlayer を、あろうがなかろうが返す(なければ nil )player の代わりに使えば大丈夫です。ちなみに assuredPlayer は、ビューワを初めて呼び出すときにも、そのためのメソッド内で使われています。--sumim - 2002-11-30, 22:59:15
>三手での例ですが私のところではノーティファイアは出ない
これは(確認していませんが)ペイントツールを起動した時点で、プレイヤが作られているからだと思います。--sumim - 2002-11-30, 23:07:04
>ないなら作る的メッセージであるassuredPlayer
例のところの読み下しは「Sketch XXXにプレイヤがあればそのプレイヤを,無ければnilを返す.その返却されたオブジェクトを5進める」でよろしいのでしょうか?--人狼 - 2002-11-30, 23:15:29
>これは(確認していませんが)ペイントツールを起動した時点で、プレイヤが作られているから
了解しました.今はここは重要なポイントでは無さそうですね. - 2002-11-30, 23:16:34
>例のところの読み下しは
訂正前のまま、プレイヤを得るメッセージに player を使うならそうです。未定義の場合、nil が返ってノーティファイアが出てしまいます。nil という UndefinedObject に属するインスタンスは forward: 5 というメッセージを理解できないのでこうなります。プレイヤが定義済みならそれが返るので問題なしです。assuredPlayer を使った場合は、プレイヤが未定義(nil)なら作って返す、のでいずれにせよプレイヤが返り問題は起こりません。--sumim - 2002-11-30, 23:21:16
>訂正前のまま、プレイヤを得るメッセージに player を使うならそうです
あ,判りました,判りました.また日本語の解読に失敗したみたいです(苦笑)
>ないなら作る的メッセージであるassuredPlayerを、あろうがなかろうが返す(なければnil)playerの代わり
の解釈が間違えてました.
メッセージ | --プレイヤありの場合の返値 | --プレイヤなしの場合の返値 |
assuredPlayer | --プレイヤ | --その場で作ったプレイヤ |
player | --プレイヤ | --nil |
と言う事だったのですね.--人狼 - 2002-11-30, 23:41:58
そうです。--sumim - 2002-11-30, 23:45:36
そうそう。訂正というか追記がまだあります。元のスケッチに戻す方法ですが、graphics カテゴリに restoreBaseGraphic というそのまんまのフレーズがありました(^_^;)。これを使ってください。--sumim - 2002-11-30, 22:41:09
プチかぁ.残念>F‐16
>インスタンス変数を使ってみたい
ん〜と.ついにインスタンス変数の登場ですね.と,言ってもまだどんなものかは推測なのですが.インスタンス変数と言うくらいですから,そのスコープはインスタンス内に留まるのですよね.それと…そうそう.先にご説明頂いたプレイヤのところでちらっと出てきた「自由な変数」と言う物ですか?
仮にその変数名をcrntCsrとすると(ここが,既にCっぽい(^^;)三項演算子(あれば,ですが)を使ってcrntCsr = (crntCsr == 1) ? 1 : 2として,look likeにてcrntCsrでAnt'sを参照してプレイヤを決める…なんて事が出来るのでしょうか.う〜ん,なんかすごくCっぽいなぁ.緑ハローによる複製は確かに面倒くさいですね.このように他のオブジェクトの変数(あれ?cursorは変数?)を変化させる場合にはおかしな事になりますから制御が面倒ですね.片方のスクリプトを変更したら,もう一方(とは,限りませんね.1以上ですね.)も必ず直さなくてはならないし.これではクラスを直せばインスタンスは全部直ると言うオブジェクト指向の恩恵に全然あずかってないですね.--人狼 - 2002-11-30, 22:46:23
いや、プレイヤは Smalltalk のインスタンス的性格より Self のフレーム的性格を強く持っているのか、スロット名(インスタンス変数名、スクリプト名)がわかればどこからでもアクセス可能という意味で Self や NewtonScript のフレーム的です。ここはちょっとだけプロトタイプベースっぽい頭の切り替えが必要になります。--sumim - 2002-11-30, 22:53:32
>プレイヤのところでちらっと出てきた「自由な変数」と言う物ですか?
そうです。--sumim - 2002-11-30, 22:55:48
>いや、プレイヤは Smalltalk のインスタンス的性格より Self のフレーム的性格を強く持っているのか
から始まるパラグラフが理解出来ませんでした.すみません.もう少しご説明頂けますか?
インスタンス変数=自由な変数と言うのは了解です.有り難うございます.--人狼 - 2002-11-30, 23:08:45
>もう少しご説明頂けますか?
これは情報隠蔽の話です。原則として Smalltalk のインスタンスでは、インスタンス変数には他のオブジェクトからの直接アクセスはできません(その気になればできちゃうので「推奨されない」と言ったほうが正確なのはインスペクタなどを使うとわかると思いますが(^_^;))。Self や NewtonScript のフレームではその点、オープンでスロット(インスタンス変数に相当)の名前さえわかれば、アクセス(情報を直接参照したり、内容を変更すること)が可能ということです。--sumim - 2002-11-30, 23:16:25
>これは情報隠蔽の話です。
これは,私が
>そのスコープはインスタンス内に留まるのですよね.
とお書きした事について
>スロット名(インスタンス変数名、スクリプト名)がわかればどこからでもアクセス可能
とお書き頂いた事で,「いやいや,スコープはそうじゃないぞ.実は見えてしまうのだよ.」と言う事だったのでしょうか.--人狼 - 2002-11-30, 23:35:58
そのつもりでしたが、はずしてしまっていましたか?--sumim
>そのつもりでしたが、はずしてしまっていましたか?
いえ…恥ずかしながら,そもそもの私の文章に対するsumimさんのフォローアップである「いや、プレイヤは…」から始まる文章が,私の前の文章のどこに対するフォローアップかの読み解きがうまくできていなかっただけです,ご心配&お手数をおかけしました.--人狼 - 2002-11-30, 23:45:50
引用を怠ったのがいけなかったですね。ごめんなさい。--sumim - 2002-11-30, 23:49:05
Ant にインスタンス変数 cursor を設けて、とりあえずこんなのにしてみました。もっとよいアイデアがあれば是非。--sumim - 2002-11-30, 22:39:05
なるほど…タイルの意味は判りました.たぶん.(graphicのところは推測の域を出てませんが)Antにcursorを設けて(Ant's cursor),それに1を加えてAntsのcursor(Ants's cursor)に代入しています.Ant's cursorが1なら2を,Ant's cursorが2なら3を,Ants's cursorに代入します.しかし,Ants's cursorは1または2しか値を取りません.先に確認したようにそれを超える値の場合は1に戻りますので,結果としてはAnts's cursorは1または2になります.この後でAnts's cursorをAnt's cursorに代入し返しますので,Ant's cursorは現在のAnts's cursorの値と等しくなります.その上で,Ant's graphicはAnts's graphicAtCursorを参照している.と言う事なのですね.確かにこの方法の方が私が考えた物よりははるかにスマートでした.
まだまだですな(しょんぼり)--人狼 - 2002-11-30, 23:25:43
>しょんぼり
あいや。せっかく考えていただいたのに先に例を出してしまって申し訳ありません(^_^;)。ただ、これも問題があって、複数の蟻から問い合わせが殺到したときにちゃんと動くのかどうか…とかいろいろと考えるとキリがなさそうです。もっとも、タイルだけではそれほど厳密なスクリプトは組めないのでこの程度にしておくのが吉なのかもしれません。とりあえず、これで何匹かに増えても動きが止まったりすることなしに、蟻は動き続けてくれるはずです。--sumim - 2002-11-30, 23:36:56
>あいや。せっかく考えていただいたのに先に例を出してしまって申し訳ありません(^_^;)
いえ,例はとても有りがたかったです.参考になりました.私のタイルスクリプトとの違いも明らかになりましたし,私のタイルスクリプトが甘いと言う事も判りましたし.しょんぼりしているのは,sumimさんの考え方がスマートだったもんで,自分のアプローチの甘さにしょんぼりしただけです(苦笑)と,言うことで0時も近いですし今日はこの辺で失礼します.
#枕,ぬらしちゃうかも(笑)--人狼 - 2002-11-30, 23:49:19
SqueakToys のスクリプトも細かいところに凝るといろいろと楽しめます。ただ、Smalltalk コードを考えるときの楽しみとはちょっと異質で、どちらかというと Smalltlak 以外のプログラミング言語のそれやパズルを解くときのそれ、つまり、何か制約があるときにそれをどう克服して実現したいことに近づくか…に近いのがワタシ的にはちょっと残念ですね。ちなみに Smalltalk の場合は、制約などというものは(自分の知識や理解、発想力の限界以外には)なくて、どうやってでも行けるけど、どういう道のりをたどるのが楽しいか…と考えを巡らすことができる…という印象を持っています。もっとも、Lisp はおろか Perl でさえも、似たような事を言う人を見かけたことはあるので、別に Smalltalk に限った話ではない(実現したいことの質、それへの理解度、処理系の向き不向き、処理系におけるスキル…等々次第)のかもしれませんが。--sumim - 2002-12-01, 00:01:08
複数のプレイヤを同期しながら管理したいときには、緑ハローによるモーフの複製は向きません。このための機能が Sibling です。赤ハローメニューの siblings.. から make a sibling instance を選ぶか、make multiple siblings で作りたい“兄弟”の数を指示します。単なる複製と違うのは、もうプレイヤの仕組みを説明しているのでマニアックに説明すると(^_^;)、プレイヤが兄弟間でそのクラス定義を共有するところです。緑ハローの複製は、クラス定義はその都度、新設(複製)されます。従って、その後の編集内容は複製元には反映されません。それに対して、兄弟ではクラス定義を共有しているので変数の数や名前、スクリプトの内容や名前を変更すると、すべての兄弟にそれが反映されます。--sumim - 2002-12-01, 11:19:07
プロトタイプを指定して差分プログラミングをするプロトタイプベースと違って、Sibling は文字通り“兄弟”すべてが(それこそ同じクラスに属するインスタンス同士程度に)等価なので、どれを捕まえて編集をしても編集結果はすべての兄弟に反映されます(換言すれば「どのインスタンスを捕まえてそのクラスを編集しても…」となるので当たり前っちゃあ当たり前)。Self や NewtonScript プログラミングのときのようにプロトタイプという別格オブジェクトを用意したり意識せずにすむ代わりに、プロトタイプとの“差分”だけを実装するようなことはできなくなります。つまり、他の兄弟と違った機能をそれぞれに与えることはできません。--sumim - 2002-12-01, 11:22:55
>パズルを解くときのそれ、つまり、何か制約があるときにそれをどう克服して実現したいことに近づくか
う〜む,そういう事なんですね.私は,まだ自分の知識や理解の方の制約が大きいので(汗)今の内に基礎体力をつけておかんとSmalltalkに行った時に危ないですね(汗)--人狼 - 2002-12-01, 13:42:08
Siblinssですね.なるほど,緑ハローによる複製は,プレイヤのクラス定義が都度作られる(複製,とは言え)のに対して,Siblings(=兄弟)ではクラス定義を共有しているのですね.なので,何か変更を加えると,全ての兄弟にそれが反映される…あれ?変更を加えるのはプレイヤのインスタンスですよね.プレイヤのインスタンスを変更するとクラス定義も変更されて,クラス定義が変更されるから全ての兄弟が変更される?--人狼 - 2002-12-01, 13:49:33
>“兄弟”すべてが(それこそ同じクラスに属するインスタンス同士程度に)等価なので
あれ?兄弟はクラスを共有するのですよね?でも同じクラスに属するインスタンスと言う訳ではないのですか?
>換言すれば「どのインスタンスを捕まえてそのクラスを編集しても…」となる
と,言う事はモーフを編集しているように見えて,実はプレイヤを操作していたんだけど,それも本当はプレイヤのクラスを編集していたと言う事ですか?ますますクラスとインスタンスの関係が(汗)--人狼 - 2002-12-01, 13:52:03
>でも同じクラスに属するインスタンスと言う訳ではない
モーフとしてみると違うけど、プレイヤとしてみればそう…というニュアンス含みでくだんの表現になりました。--sumim
>モーフを編集しているように見えて,実はプレイヤを操作していた
このフレーズを書いていただいた時点でほぼこのテーマ(SqueakToys)の目標は達せられました(笑)。--sumim
>ますますクラスとインスタンスの関係が(汗)
実はここいらへんのしっくりいっていない部分は、「ふっふっふ」トラップ周辺かつ、次のテーマなのですよね(^_^;)。ここで説明を始めると、たぶん未来永劫、兄弟ネタには戻ってこれないような気がするので、無理して進めて SqueakToys を終わらせてしまいましょう。--sumim - 2002-12-01, 14:42:22
>モーフとしてみると違うけど、プレイヤとしてみればそう…というニュアンス
了解です.いかんいかん.すっかりモーフを忘れてプレイヤしか考えてませんでした.確かにモーフは別物ですものね.
>ほぼこのテーマ(SqueakToys)の目標は達せ
可くらいにはなったでしょうか(汗)
>実はここいらへんのしっくりいっていない部分は
ありゃ,そうですか.判りました.深いところは置いておいても,そこが気になって夜も眠れないと言うわけではないので,SqueakToysの続きをお願いします.次のテーマをやっていく内に「おぉ,そうだったのか」となれるように頑張ります--人狼 - 2002-12-01, 15:00:34
言っても、あとちょっとです。兄弟を作った蟻のスクリプトから条件分岐と forwardBy フレーズを削除したいのですが、その前に、このバージョンを保存しておきます。スクリプティを開いて、プレイヤ名のところをクリックしたとき表示されるメニューから save this version を選択します。これで、必要なときにこのバージョンに復帰させることが可能です。その後、forwardBy フレーズと条件分岐をゴミ箱にドラッグ&ドロップして削除してしまいます。ちなみにゴミ箱がデスクトップにないときは、1)デスクトップにドロップしてモーフとして削除する。2) Squeak フラップにあるゴミ箱にドロップインする。3) Widget フラップや Object Catalog からゴミ箱モーフを取り出し、改めてそこにドロップインする…などの方法があります。念のため。--sumim - 2002-12-01, 15:04:48
で2つのタイルを削除する代わりに move toward フレーズをドロップインします。このフレーズは motion カテゴリにあります。ここにある dot というのはプロジェクト作成時にデフォルトでデスクトップの片隅(左下の Navigator フラップに隠れている)に用意されるダミーのモーフ(プレイヤ)です。この dot に、Rectangle を角砂糖に見立てた Sugar モーフを作って(カラーや枠を適当にしてそれっぽいのを是非)置き換えたいと思います。--sumim - 2002-12-01, 15:10:11
くだんの move toward の dot タイル部分を Sugar のそれと置き換えるのには、ビューワを開く必要はありません。選択したときに現れる右下のタイル作成“蜜柑色”ハローをクリックしてタイルをつかみ、スクリプティの dot タイルの部分にドロップインします。--sumim - 2002-12-01, 15:15:13
とかく、ビューワを切り替えながらスクリプトをくんでいると、いろいろな取り違えが起こりがちなので、とりあえず、自分のビューワの相当フレーズを使ってスクリプトをくんでしまい、対象となるモーフ(プレイヤ)の名称を示すタイルはあとから、蜜柑色ハローを駆使して置き換える…という手法も悪くないと思います。--sumim - 2002-12-01, 15:18:27
これでスクリプトを走らせると、蟻は角砂糖にむかって歩き始めます。ひきはがしたり、角砂糖をピックアップして移動したりして楽しめます。念のため、兄弟のスクリプトは一斉に置き換わっているのに、兄弟でない緑ハロー複製蟻はそうなっていないことを確認してください。兄弟は、さらに、scrripts scripting カテゴリにある start all フレーズを fire して、スクリプトを一斉にスタートさせることができます。同様に、pause all もしくは stop all を fire すれば走っているスクリプトを止めることもできます。--sumim - 2002-12-01, 15:23:26
蟻の場合、コスチュームは他から借りてきているので意味をなしませんが、専用のコスチュームを持っているときは、兄弟の誰かのコスチュームを再編集、もしくは look like で変えた場合、赤ハローメニューの siblings → make all siglings look like me で同じコスチュームに統一できます。画面に分散している兄弟を呼び集めたり、兄弟とそうでないものを区別するのには、同じメニューの bring all siblings to my location が役立つでしょう。--sumim - 2002-12-01, 15:28:09
で、最後にこんなスクリプトを組んでおしまいにしたいと思います。touchesA フレーズは、指定したプレイヤと同じコスチュームをまとっているスケッチモーフにおいて機能する判断フレーズです。表示領域が触れて(重なって)いるとき true を返すので、条件分岐パネルの条件欄に置いて、Yes 欄内のスクリプトを実行するのに使います。触れていなければ No 欄が実行されます。random タイルはスクリプティのモーフ(プレイヤ)名の部分をクリックして表示されるメニューから hand me a "random number" tile を選ぶことで作り出せます。--sumim - 2002-12-01, 15:46:00
>右下のタイル作成“蜜柑色”ハローをクリックしてタイルをつかみ
おぉっ!これは便利ですね.--人狼 - 2002-12-01, 16:51:31
>これでスクリプトを走らせると
なるほど.動作確認できました.確かに緑ハローによる複製モーフ以外は砂糖まっしぐらです.砂糖を動かすと…ぷぷ.うちのネコみたいです(笑)
>scrripts カテゴリにある start all フレーズ
あれ…?あ,scriptingカテゴリですね.--人狼 - 2002-12-01, 16:55:59
>赤ハローメニューのsiblings→
とりあえず,bring all siblings to my locationは試してみました.蟻が集まってきて,ちょっといや〜んな状態です(笑)--人狼 - 2002-12-01, 16:57:54
>最後にこんなスクリプトを組んでおしまいにしたい
touchesAフレーズは了解です.randomフレーズですが,フレーズの後ろの「10」はどういう意味でしょうか?それと,randXとrandYはインスタンス変数の追加でよいのですよね?
ところでworld's width, world's heightはどこにあるのでしょう?--人狼 - 2002-12-01, 17:08:34
>あ,scriptingカテゴリですね
そうです。失礼しました。--sumim - 2002-12-01, 17:39:17
>ところでworld's width, world's heightはどこに
とりあえず、geometory カテゴリの Ant's width、Ant's height で組んでおいて、Ant's のところだけモーフとして選択したデスクトップの蜜柑色ハローでつかんだタイルで置き換えます。--sumim - 2002-12-01, 17:41:34
>フレーズの後ろの「10」はどういう意味でしょうか?
1〜10 までの数をランダムで発生するという意味です。--sumim - 2002-12-01, 17:46:01
ランダムパネルはちょっとタコな仕様で、フレーズの最後にしかおけないという制約があるため、インスタンス変数を設けました。--sumim - 2002-12-01, 17:46:54
あはは。タコは私でした。こういうふうにすれば、インスタンス変数はいりません。--sumim - 2002-12-01, 18:00:17
>Ant's のところだけモーフとして選択したデスクトップの蜜柑色ハロー
いやはや,言われてみればその通りでして.応用が出来てませんね>自分.済みません.--人狼 - 2002-12-01, 18:05:15
>1〜10 までの数をランダムで発生する
了解です.
>こういうふうにすれば、インスタンス変数はいりません
なるほど.演算の組み立て一つですねぇ.でも,私にとってはインスタンス変数の良い練習になりましたです.
さて,風邪で熱が出てきたので今日はこの辺で.後で見に来るかも知れませんが,これ以上は勉強しても頭に入らなさそうなので(汗)--人狼 - 2002-12-01, 18:07:44
いや。これで SqueakToys は終わりにしましょう。明日からはクラスとインスタンスの関係について…です。--sumim - 2002-12-01, 18:12:17
このページを編集 (25666 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 2150 times.