1. カメラを回すと「右」が変わる
さて、立体2048を触っていて戸惑いやすいのが、画面の右と盤面のX軸が一致しないことです。正面からなら右へ動いて見える操作でも、裏から見れば左に見えます。固定軸のボタンだけでは、視点を変えるたびに読み替えが必要になります。
このゲームでは、カメラの「右」「上」を基準に移動方向を選びます。ワールド座標を変えるのではなく、入力をどの軸へ割り当てるかを決めるわけです。以下は2026年10月22日に公開コードを照合した説明です。過去の端末別速度や転送量は、この手順の検証値としては扱っていません。
2. スワイプを6方向へ変換する
game-renderer.jsのconvertSwipeTo3DMove(dx, dy)では、まず移動距離が18px未満なら入力を採用しません。タップに近い小さな指の揺れで盤面を動かさないためです。
次にカメラの姿勢行列から右と上の基底を取り出します。画面座標のYは下向きが正なので、上の基底に掛けるのは-dyです。
const camRight = new THREE.Vector3();
const camUp = new THREE.Vector3();
this.camera.matrixWorld.extractBasis(camRight, camUp, new THREE.Vector3());
const screenMove3D = new THREE.Vector3()
.addScaledVector(camRight, dx)
.addScaledVector(camUp, -dy)
.normalize();このベクトルとX+、X−、Y+、Y−、Z+、Z−の単位ベクトルとの内積を比べ、最大のものを選びます。角度そのものは要らないため、Math.acosに変換しません。内積が最大の軸へ動く、という処理です。
比較は>なので同点では先に並んだ軸が残ります。斜めスワイプの境界で、常に利用者の意図通りになるとは限りません。そのため、指を離す前に軸と方向を示す予測矢印を表示しています。選ばれた方向を確認してから離してください。
3. 奥・手前と指の開始位置を分ける
キーと操作パッドはgetRelativeDirectionを使います。左右はカメラの右ベクトル、上下は上ベクトル。奥・手前は視線のY成分を0にし、水平面へ投影してから軸を選びます。カメラを上から傾けても、奥ボタンが高さ方向へ割り当てられないようにしています。
カメラの極角は0.25〜π−0.25ラジアンに制限しています。真上・真下を避けるための制限で、どの視点でも同じ見え方になるという意味ではありません。
操作の開始位置も見ます。キューブを触って始めたら移動、背景ならカメラ回転。2本指ではズームへ切り替わります。本編ではA/D・左右キー、W/S、奥手前の上下キーが使えます。Q/Eは現在の移動キーではありません。
4. 27マスと64マス、隠れたタイルの確認
現行版のCLASSICとSPEEDRUNは4×4×4(64マス)と3×3×3(27マス)を選べます。HARDは3×3×3、PARTYは4×4×4固定です。3×3×3だけが標準という説明では、今の選択肢を正しく伝えられません。
立体では、同じ列でも手前のタイルに隠れて奥の数字が見えません。X線表示と階層表示を使えば、見えない位置を確認できます。視点を回すだけでは手数も新規タイルも増えません。ただし時間制限があるときは通常、時計は進みます。
局面練習では、カメラに依存しない固定軸と奥行きごとの表で一手を比べられます。まず「128・128・512」をX+とX−へ動かし、最大タイルの場所がどう変わるかを見てください。本編の予測矢印と比較すると、画面方向と固定軸の違いを確かめられます。
5. オフライン動作は、保存が完了してから
現行のsw.jsは、必須のゲームファイルとThree.jsの読み込みが成功してからオフラインキャッシュを切り替えます。HTMLとスクリプトは通信を優先し、通信に失敗した場合に保存済みのものを返します。過去の記事にあった「常にキャッシュ優先」「2回目は必ず通信0」という説明は現行実装と一致しません。
初回アクセス中に通信が切れれば、保存が完成しない場合があります。ブラウザがデータを削除すれば再接続が必要です。また、ランキングAPIはキャッシュ対象から外しており、オフラインで世界ランキングを更新できるわけではありません。
- 接続中にゲームを開き、タイルが動くことを確認する。
- ブラウザの開発者ツールでService Workerが有効になり、必要なファイルがCache Storageにあることを確かめる。
- 通信を切って再読み込みし、移動・合体・リセットを確認する。
- ランキングの表示がオンラインと端末内で区別されていることを確認する。
この手順は、利用する端末で確かめるためのものです。特定端末での消費電力や転送量の測定結果を保証しません。