前回「Morphって何だ」と書いたらXでその来歴をお教えいただきました。ありがとうございます。そこでミニゲーム「Lights Out」の残りを御本通り入力、動作はOKっと。しかし「ゲームのインスタンス」の消去の仕方が? メタ・クリックを繰り出したですが、消去されるのは盤面を構成するセル1個。お惚け老人は立ち往生。
※今回の動作確認は、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の方のコードにそって)入力、ゲームそのものは動作しました。こんな感じね。
ただ、上のように初期位置 5@5 が、メニューバーの下に重なって見ずらいです。そこでLOGameクラスの以下のメソッドの黄色のマーカ部分を35@35に勝手改ざん。も少し右下の位置にゲームの盤面が表示されるようにいたしました。
PlaygroundとWorkspace
さて、ゲームの起動の時点に遡ります。ゲームの起動はPlaygroundウインドウから以下のようにして行いました。LOGame newで新たなインスタンスを作り、それへ openInWorldとメッセージを送ります。
すると、Playgroundウインドウの外、さきほどの地のウインドウ内にゲームの盤面が出現しました。クリクリしてみると予定の動作(クリックした上下左右のセルの状態が反転する)をしているようです。そして右上に並んでいるアイコンのうち、矢印が円を描いているアイコンを押すと、右に開いているMorphタブにその時の「盤面」がコピーされて表示されます。インスペクトされているってことかい?
やはりPharo様、カッケーです。
しかしちょっと気になったのが、Workspaceというものの存在です。古いドキュメントみると、上のPlaygroundに打ち込んでいるようなものは、Workspaceというものに入力することになっていたみたい。今回練習に使っているPharo10では、メニューからはWorkspaceというものは取り外されてしまっているので、Workspaceでなく、Playground使えよってこってすかい?
ただね、Workspace(仕事場)でしょ、Playground(お遊び場)よりなんかフォーマルな気がする。。実際、Playgroundで
Workspace open
と打ち込んで Do it すると、Workspaceが開きます。こんな感じ。
こちらは素っ気ない見た目ですが、同じように入力してDo itすれば、ゲームの起動は可能です。お勧めじゃないけど、まだ存在はしている?
LOGameのインスタンス、沢山作ってしまったケド
WorkspaceとPlaygroudの違いなど観察していて、両方でLOGameを複数回起動していたら、知らぬうちに画面が酷いことになってました。右クリックのWorld contentsメニューを見たところが以下に。
なんやらインスタンスが5個もあります(重なっているので2個しかみえてないです)
当然、x印とかメニューバーとか「ウインドウ」についてないです。しかし、忘却力の老人もそこはかとなく覚えてます。「メタ・クリック」という技。あれ、ALT+SHIFT+クリックだったけ?
周囲をアイコンが取り巻きます。しかしx印押してみると消えるのはセル1個っす。
肝心の「Lights Out」ゲームのインスタンスそのものが消えるのではなく、その配下のLOCell一個が消えちゃうみたい。
そこで気づきました。WorkspaceでもPlaygroundでも、「Lights Out」ゲームのインスタンスを作ったときにそれを変数などに保存してないです。起動して終わり。
Pharo様内部ではちゃんとMenuに表示されているのでどこぞに記帳されているみたいですが、どこかのメモリに隠れているインスタンスを消すのはどしたら良いの? そいつにDeleteとかメッセージを送ったら消えるのかい?どうなんだ。Pharo素人老人はまた壁に当たるのであります。トホホ。
メタ・クリックを連打すると、より上位のモーフ(オーナー)を選択できます!
PlaygraoundやWorkspaceからは、World submorphs inspect とか LOGame allInstances inspect で各LOGame(のインスタンス)にリーチできます(念のため、後者はインスタンスの数が少ないときだけしか意味をなしません^^;)
(World submorphsSatisfying: [ :morph | morph == LOGame ]) do: #delete などで一気に消してしまうこともできます
メタクリック連打、駄目でしたか…
あと ×morph == LOGame → ○morph class == LOGame の誤りでした
すみません^^;