NetMorph は eToy 対応しているので、 普通は自分でSmalltalkのプログラムを書く必要はありません。このページは開発者用に書かれました。
最初の例
NetMorph 0.2 にはリモートからモーフを操作するための、整理された API が提供されています。
簡単なコード例です。別のイメージの ip と portが #('192.168.1.2' 37459)であると考えてください。
"ローカルでモーフを開く"
morph _ Morph new openInWorld.
"別のイメージにモーフを移動。プロキシを残していく"
proxy _ morph leaveProxyDo: [morph warp: '192.168.1.2' port: 37459].
"モーフの位置をリモートコントロール"
proxy position: 100@100.
"モーフの色をリモートから変える"
proxy color: Color random.
"ちょっとした視覚効果"
proxy poofIn.
"リモートでマーカーモーフを開く"
"マーカーモーフは後でモーフを引っ張り戻すのに使う"
proxy leaveMarkerMorph.
proxy showBalloon: 'こんにちは! このタイルを僕を呼ぶときに使ってね!'.
"リモートのワールドの色を3回変える(悪戯)"
oldColor _ proxy world color.
3 timesRepeat: [proxy world color: Color random. (Delay forSeconds: 1) wait].
proxy world color: oldColor.
"家に帰る"
proxy warpToHome.
この旅の後で、帰ってきたモーフをインスペクトして、 #path メッセージを送ってみましょう。モーフがどこを訪れたかがわかります。
Callback
Morphのサブクラスを定義して、移動時の振る舞いをカスタマイズできます。
- Morph>>onBeforeWarp は、ローカルを立ち去る直前に呼ばれます。
- Morph>>onAfterWarp は、リモートに着いた直後に呼ばれます。
遠隔 Perform
NetMorphでは, すべてのモーフにidがあります。idがわかっていれば、そのモーフのメソッドをリモートから呼び出せます。
- Morph>>perform: selector of: identifier
Morph Proxy
移動前にメソッドを後で呼び出すためにidを取っておくのは面倒でしょう。
そこで簡単な操作で、モーフの抜け殻(プロキシ)を得ることができるようになっています。
- Morph>>leaveProxyDo: ["移動のフレーズ"].
で抜け殻が帰ります。この抜け殻にメッセージを送るとリモートの本物に届きます。
プロキシに渡せる引数、返値には制限があります。Block, thisContextなどは渡せません。モーフが別のモーフを返すようになっていた場合、呼び出し側は自動的に、そのモーフのプロキシを得られるようになっています。
例,
worldProxy _ proxy world.
で、リモートのWorldのプロキシが返ります。
Morph>>stepのオーバーライド
Morph>>stepをオーバーライドすると、モーフが自ら動けるようになります。ということは、ネットワークエージェントも簡単に書けると言うことです。
例えば、ネット上をランダムに放浪するモーフを書きたい場合、#stepは以下のようになるでしょう。:
step
self warpTo: (self worldMap allWorldNames atRandom).
- step内では、下記のようなメソッドが役立ちます。
- Morph>>worldMap で WorldMap が返ります。接続している全てのイメージの情報を得られます。
- Morph>>address で、 WorldMap上の自分の現在位置がわかります。
- Morph>>path で、今までの行程を知ることができます。
MarkerMorphの使い方
MarkerMorph は、モーフに対する「見えるポインタ」です。 これを使うとリモートからのモーフの操作が容易になります。いつもは自分で動くモーフに、外部から指令を送るような時に使えます。
MarkerMorph は普通のモーフなので、#stepをオーバーライドできます。例えば時折、放浪しているモーフを呼び戻したい場合、#step を以下のように書けるでしょう。:
step
self morph warpToHome.
Morph>>leaveMarkerMorph でそのモーフを指す新たな MarkerMorph が返ります。(最初のコードに例があります)。
[
Link to this Page