phinajs / phina.js

phina.js is game library

Home Page:http://phinajs.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Tweenerのリファクタについて

simiraaaa opened this issue · comments

要点

  • tweener.play()と書くようにしたほうが直感的で動かないときもなぜ動かないか気づきやすい
  • clearでplaying=trueはなんか違うと思う
  • cancel
  • skip
  • target と attachしているオブジェクトとの関係性の見直し

あとは時間ないのでログ~

simiraaaa @simiraaaa 6月 18 20:37
tweener設定したのに、動かないっていう人が多いのって、今ソースコード読んでて、playingのdefaultがfalseだったらそんな問題発生しなかったんじゃないかって気づいたんですが、流石に今更変えるのは気が引けますね
elm.tweener.to({/* something */}).play()という風に書かないと最初から動かなければ、すぐplayしてなかった!ッて気づくと思うんですが
clearよりplayの方がわかりやすいと思うので、これからのサンプルはclearではなくplay()を最後につけるようにするとかで、利用者を誘導するのもありだと思います
claer _init するとplaying =trueになるのもちょっと違和感あるんですよね

phi @phi-jp 6月 18 20:56
なるほど、確かにこの辺は使い回しとか考えると今の仕様微妙なんですよね
自分もちょっと見てみます!

simiraaaa @simiraaaa 6月 18 20:56
Tweenerはだいぶ最初に作られてたので、結構設計がうーんってところがありますよね

simiraaaa @simiraaaa 6月 18 23:06
isAttachedがisAttachedじゃなくて内容的にhasTargetになってるw
実はAccessoryはtargetがあるだけじゃ、更新されないし、targetとattachしてるelementが同じとも限らない

simiraaaa @simiraaaa 6月 18 23:12
Tweener().attachTo(scene).setTarget(circle)とかできるので、isAttachedかどうかを正確に取得するにはtargetとattachされてるelementを別のメンバ変数にするか、targetがあるときはかならずattachされている設計にするか(前者のほうが好み)

daishi @daishihmr 6月 19 01:19
俺もこれからは tweener.~~~~.play() って書くようにしますわ

simiraaaa @simiraaaa 6月 19 01:20
@daishihmr さん b
でも、タッチした瞬間前回の動きをキャンセルしたいときはClear()は結局入りますけどね

daishi @daishihmr 6月 19 01:22
まあそれは文脈的にも意味が合ってるのでいいんじゃないでしょうか

simiraaaa @simiraaaa 6月 19 01:23
そうですね。強いて言えば単純にいまのタスクを強制終了するやつも欲しいですね
それこそcancel()で

daishi @daishihmr 6月 19 01:23
あー、うむ

simiraaaa @simiraaaa 6月 19 01:25
cancel(true)でアニメーションが終了した状態になると、アニメーションを飛ばすのが、楽になりそう
Skip()っぽいですが

私なら単にアニメーション終了時のplaying=falseを取り除きますかね。
そもそもplayingとはアニメーションを一時停止/再開する機能であって、ライブラリ内部で勝手に変更はしないことが望ましいのでは、と思います。

また、attachしてるelementは現状のコードを見る限り単にupdateを呼び出しているだけで、これは誰がやっても同じです。
感覚的に自然かはさておき、これは全てappなどでやった方がシンプルかと思います。が、その場合ある要素に付いているアクセサリを見る、という時検索を要してしまいます。
結論としては、setTargetメソッド自体消してしまうのが間違い無いですかね。
相互参照の片側だけをすりかえるAPIの存在がこの問題の原因であり、おそらく必要はありませんから。

まあAccessoryの実体はchildrenのないElementなのでElementとしてUpdaterで共通でupdate呼び出す実装が1番気持ち良さそうですね。
アタッチまわりの改修が結構入って来ますが