ドラッグの受け口はカード個別ではなくシーンに置く。カードは画面の更新をまたいで生き残り、 属するレーンも並びの位置も変わる(CardLane.reconcile)ため、掴まれた時点で引き直す。
非公開gesture非公開 読み取り専用handlers非公開 読み取り専用lanes非公開 読み取り専用metrics画面を作り直すと寸法が変わるため、その都度の値を引けるようにしておく。
非公開 読み取り専用scene非公開beginPhaserはしきい値なしでポインタを押した時点でdragstartを出すため、ここではまだ何も始めない ——押しただけならタップなので、押し始めた場所だけ控えて動き出すのを待つ(レーン側も スクロールの基準を控えておく)。
非公開cancel非公開carryついてくる札を1枚増やす。入る枚数まで数えたら止まる(それ以上はついてこない)。
非公開decideタップと見分けられるだけ動いたら、押し始めた位置でカードのドラッグかレーンのスクロールかを 決める。向きは見ない——どちらの操作かは押した時点で決まっており、動きはその始まりを知らせるだけ。
非公開drop今のポインタ位置で言うことのあるドロップと、その中身(何も言うことが無ければundefined)。
返ったからといって、離せば起きるとは限らない。 理由を言うためだけの落とし先も返る
(info.enabled がfalse、CardInteraction.md 2.1節)ので、実際に起こす側(end)は必ずenabledで
絞る——絞りを外すと、何も起きない落とし先へonDropが走り、操作ログが「入れた」と嘘の再現手順を
残す(PlayScene.dropLabel)。見せる側(follow)は絞らない。それが理由を出すための落とし先だから。
非公開endドロップの実行はカードを動かすので、その前にドラッグ中の表示物を片付けておく。
非公開follow運んでいる札をポインタの中心へ置き、今の位置で言うことのあるドロップ先を枠で示す。枠が出ることは 「離せば起きる」を意味しない——理由を言うためだけの落とし先には灰色の枠が出る(同 2.1節)。
非公開locate非公開show今掴んでいるカードを受け入れられるカードすべてのふちを光らせる。
非公開start非公開track同じ落とし先の上に指を止めて留まっている間、束の2枚目以降を1枚ずつ引き連れていく(レーンの端を 押し続けて送るのと同じ速さ、holdRepeat)。待ち時間は指が止まってから数える——動いている間に 時計を進めると、落とすつもりで空き枠を横切っただけでついてきてしまう(CARRY_REST_SLOP)。
落とし先が変わっても、そこがそのまま受け取れるなら運んでいる枚数は保つ。運んでいる枚数は 「これだけ入る」という約束なので、守れなくなる枚数——新しい落とし先に入りきらないぶん——だけを 返せばよい。ハンドレーンの隣の空き枠へずらしただけで数え直しになると、枚数が多いほど待たされる。
戻り値は運ぶ枚数が変わったかどうか。
非公開update
レーンをまたぐカードのドラッグ&ドロップ(CardInteraction.md 2節 カードのドラッグ&ドロップ)。
レーン自体も横ドラッグでスクロールするため、カードの上から始まったドラッグがどちらの操作なのかを 押し始めた位置で見分ける: カードの本体から始まればカードを掴んだとみなし、左右の端から始まった ものはレーンのスクロールへ回す(CardLane.isCardBody)。どちらになるかは押した時点で決まっているので、 掴むのに待ち時間は要らない。
指が運ぶのは実体の札そのもの(CardTable.CarriedCard)。掴んだ時点で元の束から分かれ、最前面の 層で指に追従する——レーンからはみ出したカードは隣接エリアの背景板に隠れてしまう(CardLane参照) ため、レーンの中に置いたままでは持ち出せない。
落とし先の上で待つと、同じ束の2枚目以降がついてくる(trackCarry)。離せばついてきたぶんが 一度に入る。ついてくるのは入る枚数までで、ついてきた枚数はそのまま「これだけ入る」という約束になる。 運んでいる札そのものはCarriedCardが持ち、ここは「いつ増やすか・何枚まで許されるか」だけを決める。