ソフトな忘却力(43) Smalltalk、Pharo、Lights Outゲームが消えん?

Joseph Halfmoon

前回「Morphって何だ」と書いたらXでその来歴をお教えいただきました。ありがとうございます。そこでミニゲーム「Lights Out」の残りを御本通り入力、動作はOKっと。しかし「ゲームのインスタンス」の消去の仕方が? メタ・クリックを繰り出したですが、消去されるのは盤面を構成するセル1個。お惚け老人は立ち往生。

※「 ソフトな忘却力」投稿順 Index はこちら

※今回の動作確認は、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。

ミニゲーム Lights Out

さて、以下の文書ではChapter 6、

Pharo by Example 9 – 2022 Edition

以下の日本語版ドキュメントでは

https://github.com/SquareBracketAssociates/PharoByExample-japanese/blob/master/PBE1-ja.pdf

Chapter 2に登場するGUIを使ったミニゲームがLights Outです。これ使ってPharo様の流儀を学べということみたいです。前回はそこに登場するMorphというクラスに「変態?」などと誤解を入れつつ疑問を呈したら、お教えいただきました。Pharo様に進化する以前からの法灯を引き継ぐGUI構成のためのクラスみたいです。

さて、小さなゲームなので、上記ドキュメント(のうちExample9の方のコードにそって)入力、ゲームそのものは動作しました。こんな感じね。LightsOut

ただ、上のように初期位置 5@5 が、メニューバーの下に重なって見ずらいです。そこでLOGameクラスの以下のメソッドの黄色のマーカ部分を35@35に勝手改ざん。も少し右下の位置にゲームの盤面が表示されるようにいたしました。
OriginalLOGameinitialize

PlaygroundとWorkspace

さて、ゲームの起動の時点に遡ります。ゲームの起動はPlaygroundウインドウから以下のようにして行いました。LOGame newで新たなインスタンスを作り、それへ openInWorldとメッセージを送ります。
Playground

すると、Playgroundウインドウの外、さきほどの地のウインドウ内にゲームの盤面が出現しました。クリクリしてみると予定の動作(クリックした上下左右のセルの状態が反転する)をしているようです。そして右上に並んでいるアイコンのうち、矢印が円を描いているアイコンを押すと、右に開いているMorphタブにその時の「盤面」がコピーされて表示されます。インスペクトされているってことかい?

やはりPharo様、カッケーです。

しかしちょっと気になったのが、Workspaceというものの存在です。古いドキュメントみると、上のPlaygroundに打ち込んでいるようなものは、Workspaceというものに入力することになっていたみたい。今回練習に使っているPharo10では、メニューからはWorkspaceというものは取り外されてしまっているので、Workspaceでなく、Playground使えよってこってすかい?

ただね、Workspace(仕事場)でしょ、Playground(お遊び場)よりなんかフォーマルな気がする。。実際、Playgroundで

Workspace open

と打ち込んで Do it すると、Workspaceが開きます。こんな感じ。Workplace

 

こちらは素っ気ない見た目ですが、同じように入力してDo itすれば、ゲームの起動は可能です。お勧めじゃないけど、まだ存在はしている?

LOGameのインスタンス、沢山作ってしまったケド

WorkspaceとPlaygroudの違いなど観察していて、両方でLOGameを複数回起動していたら、知らぬうちに画面が酷いことになってました。右クリックのWorld contentsメニューを見たところが以下に。LOGame

なんやらインスタンスが5個もあります(重なっているので2個しかみえてないです)

当然、x印とかメニューバーとか「ウインドウ」についてないです。しかし、忘却力の老人もそこはかとなく覚えてます。「メタ・クリック」という技。あれ、ALT+SHIFT+クリックだったけ?LOCellMetaClick

周囲をアイコンが取り巻きます。しかしx印押してみると消えるのはセル1個っす。

LOCellMetaClickAfter肝心の「Lights Out」ゲームのインスタンスそのものが消えるのではなく、その配下のLOCell一個が消えちゃうみたい。

そこで気づきました。WorkspaceでもPlaygroundでも、「Lights Out」ゲームのインスタンスを作ったときにそれを変数などに保存してないです。起動して終わり。

Pharo様内部ではちゃんとMenuに表示されているのでどこぞに記帳されているみたいですが、どこかのメモリに隠れているインスタンスを消すのはどしたら良いの? そいつにDeleteとかメッセージを送ったら消えるのかい?どうなんだ。Pharo素人老人はまた壁に当たるのであります。トホホ。

ソフトな忘却力(42) Smalltalk、Pharo、気になるMorphってなんだ? へ戻る

ソフトな忘却力(44) Smalltalk、Pharo、インスタンスのdelete へ進む

“ソフトな忘却力(43) Smalltalk、Pharo、Lights Outゲームが消えん?” への2件の返信

  1. メタ・クリックを連打すると、より上位のモーフ(オーナー)を選択できます!

    PlaygraoundやWorkspaceからは、World submorphs inspect とか LOGame allInstances inspect で各LOGame(のインスタンス)にリーチできます(念のため、後者はインスタンスの数が少ないときだけしか意味をなしません^^;)

    (World submorphsSatisfying: [ :morph | morph == LOGame ]) do: #delete などで一気に消してしまうこともできます

  2. メタクリック連打、駄目でしたか…

    あと ×morph == LOGame → ○morph class == LOGame の誤りでした

    すみません^^;

コメントは受け付けていません。