JavaScriptで作ったジグソーパズルをスマホにも対応させます。基本的にPC版に対してコードを追加していきます。

フリックによるスクロールの許可と禁止

フリックすることでピースを移動させるのですが、スクロールもフリックでおこないます。ピースを移動させたいのにスクロールも同時におこなわれては困るのでスクロールを許可したり禁止する処理が必要になります。

そこで以下のような関数を定義します。第二引数でフリック時のスクロールを許可したり禁止します。

フリック開始時の処理

ディスプレイにタッチしたら指が触れている部分の座標を取得します。そしてその座標にピースがある場合はそのなかでも一番手前にあるものをmovingPieceに格納します。後述しますが、pieces.filter関数が返す配列の一番最後のものがそれに該当します。

ピースを移動させる処理

フリックしているときの処理を示します。movingPieceがnullでないなら、指が触れている部分の座標を調べて、その部分に移動中のピースの中央が描画されるようにします。またピースが見えない位置に移動してしまわないように注意します。

フリック終了時の処理

フリックが終了したときの処理を示します。PC版とほとんどやっていることは同じなのですが、ディスプレイが狭いのでピースを仮置きできる場所を増やすために、そこにすでにピースがある場合、移動をキャンセルする処理をなくしました。

完成したときにピースが存在する場所に固定されているピースがなく、その位置からズレが小さいときだけフィットさせることにします。

またフリックが終了したタイミングで、フリックによるスクロールを禁止する処理をおこないます。

リロードの抑止

通常、手前にスワイプしたときにリロードが発生しますが、パズルを解いている最中にリロードされては困るのでリロードを抑止したいのですが完全に抑止することはできないので、リロードが発生するまえに確認のダイアログを表示させます。