HyperTalk的Swiftの解釈
さて、この盆灯篭アプリの話もそろそろこれで終わりにしましょうか。
以前にも触れたように、私の本格的なプログラム体験はHyperTalk & LINGOです。 これが当時からすでにオブジェクト指向だったそうですが、そんなことは全く意識していません。
どこかでボタンをクリックするとコールを起こし、これを仮に"action"という名前にすると、それを別のところで"on action"というハンドラが検知し、そこに書き込まれている機能を実行する、つまり定義されたfunctionを実行する、というのがとても手に馴染んでいました。
ところがこの感覚がSwiftに馴染まず、よって私のようなHyperTalkあがりには使いにくいというか理解しにくい原因の一つであったのは事実です。
そこでここでも触れた"viewDidLoad()"の上書き。
"viewDidLoad()"自体は、そのスペルの通り、「アプリがロードされたら以下のことをします」というまさしく関数というかfunctionで、普通にSwiftでプロジェクトを立ち上げたら必ずviewController.swiftに最初から書き込まれています。
変な話、アプリが立ち上がった後、何もさせたくなければここに何も書かなければ良いだけ。
で、私はずっとこれは、アプリが立ち上がった直後のみにしか反応しないハンドラ(じゃないんだけどHyperTalk的に)だと思い込んでいたのですが、@objcをキーワードとしてiOSデバイスの画面上にボタンを用意し、それが押されたら... つまりHyperTalk的にいうと"on mouseUp"に"viewDidLoad()"を書き込んでみたら。
あら、アプリが立ち上がった直後と同じ動きが始まりました。
あ、ちょっとHyperTalk的。 あ、これがオブジェクト指向だったという証?
この辺り、クラスやらインスタンスと何度参考書を見ても完全に理解できなかったのが、かなり氷解。
私のこのアプリは、SceneKit、さらに全90回にも及ぶ篤志な記事に触れた方であれば想像がつくように、例のくるくる回る宇宙船を元にしています。
こいつを灯篭にし、最初から回転させるようにしたのですが、"runAction(SCNAction.repeatForever())"を使っているので、"viewDidLoad()"自体はループしているわけではなく、すでに終了しています。
ところが灯篭の絵柄を変更した時には別の".scn"ファイルを読み込み直させているため、この"viewDidLoad()"を再度呼び出さなくてはならなかった、というわけです。
え?なんでそんな原始的なことをしているか?
そうです。 背景を変更する時にはスマートな命令で処理しているので、".scn"を読み込み直すことはなく、よって画面推移も比較的スムーズです。
なのになぜ灯篭絵の変更はそれができなかった?
いえ、恥ずかしながらDiffuseを変更するのに"scene.background.contents = UIImage(named:"xxx.xxx")"に相当する命令を見つけられなかっただけ、というポンコツぶり。
仕方ないのです。 今年のお盆に間に合わせたかったのです...
最近のコメント