座標ズレ修正
by
cutfloss
04/29 [2026/04/29 22:21:36]
PC、タブレットのタップずれ補正し、ブーストボタンを押せるようになる
@@ -4,55 +4,44 @@
* @private
*/
javascript:(function(){
- // 1. 座標変換関数をハックする
- // ゲーム内部で使われている(と推測される)変換処理を、PCのCanvas位置に合わせる形に書き換え
const cvs = document.querySelector('canvas');
if(!cvs) return alert('Canvasが見つかりません');
- // マウス/タッチ位置をCanvas上の座標に正しく変換する関数
- function getCorrectPos(e) {
- const rect = cvs.getBoundingClientRect();
- const clientX = e.clientX || (e.touches && e.touches[0] ? e.touches[0].clientX : 0);
- const clientY = e.clientY || (e.touches && e.touches[0] ? e.touches[0].clientY : 0);
-
- // Canvasの表示サイズと内部解像度の比率
- const scaleX = cvs.width / rect.width;
- const scaleY = cvs.height / rect.height;
-
+ // 座標変換関数
+ const getPos = (e) => {
+ const r = cvs.getBoundingClientRect();
+ const clientX = e.clientX || (e.touches ? e.touches[0].clientX : 0);
+ const clientY = e.clientY || (e.touches ? e.touches[0].clientY : 0);
return {
- x: (clientX - rect.left) * scaleX,
- y: (clientY - rect.top) * scaleY
+ x: (clientX - r.left) * (cvs.width / r.width),
+ y: (clientY - r.top) * (cvs.height / r.height)
};
- }
-
- // 2. ゲーム側のイベント処理を強制的に書き換え
- // 本家が参照している座標変数を、マウス移動時にリアルタイム更新する
- const updateGameInput = (e) => {
- const pos = getCorrectPos(e);
-
- // 多くのゲームクライアントで使われる変数名に一斉射撃
- if (typeof mouse !== 'undefined') { mouse.x = pos.x; mouse.y = pos.y; }
- if (window.game && window.game.input) {
- window.game.input.x = pos.x;
- window.game.input.y = pos.y;
- }
- // タッチイベントとして偽装して流し込む
- if (typeof isTouch !== 'undefined') isTouch = true;
};
- // 3. マウスイベントをタッチイベントとしてエミュレート
- // これにより、クリックでブーストボタンが押せるようになります
- cvs.addEventListener('mousedown', (e) => {
- updateGameInput(e);
- const pos = getCorrectPos(e);
- // 本家のタッチ開始処理をキック(関数名が特定できれば直撃させる)
- console.log('Click at:', pos.x, pos.y);
- }, true);
-
- window.addEventListener('mousemove', updateGameInput, true);
-
- // 4. CSSでマウスカーソルを「指」にして、どこが反応するか分かりやすくする
- cvs.style.cursor = 'crosshair';
+ // マウス操作をタッチ操作としてゲームのシステムに強制送信する
+ const sendTouch = (type, e) => {
+ const pos = getPos(e);
+ const touch = new Touch({
+ identifier: Date.now(),
+ target: cvs,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ pageX: e.pageX,
+ pageY: e.pageY
+ });
+ const touchEvent = new TouchEvent(type, {
+ cancelable: true,
+ bubbles: true,
+ touches: [touch],
+ targetTouches: [touch],
+ changedTouches: [touch]
+ });
+ cvs.dispatchEvent(touchEvent);
+ };
- alert('PC操作支援パッチを適用しました。\n画面をクリック・ドラッグしてみてください!');
+ // イベントリスナーの再設定
+ cvs.addEventListener('mousedown', (e) => sendTouch('touchstart', e), true);
+ cvs.addEventListener('mouseup', (e) => sendTouch('touchend', e), true);
+
+ alert('マウス操作をタッチ入力へ偽装しました!これでボタンをクリックしてみてください!');
})();
/*
* @title 座標ズレ修正パッチ
* @description PC、タブレットのタップずれ補正!
* @private
*/
javascript:(function(){
const cvs = document.querySelector('canvas');
if(!cvs) return alert('Canvasが見つかりません');
// 座標変換関数
const getPos = (e) => {
const r = cvs.getBoundingClientRect();
const clientX = e.clientX || (e.touches ? e.touches[0].clientX : 0);
const clientY = e.clientY || (e.touches ? e.touches[0].clientY : 0);
return {
x: (clientX - r.left) * (cvs.width / r.width),
y: (clientY - r.top) * (cvs.height / r.height)
};
};
// マウス操作をタッチ操作としてゲームのシステムに強制送信する
const sendTouch = (type, e) => {
const pos = getPos(e);
const touch = new Touch({
identifier: Date.now(),
target: cvs,
clientX: e.clientX,
clientY: e.clientY,
pageX: e.pageX,
pageY: e.pageY
});
const touchEvent = new TouchEvent(type, {
cancelable: true,
bubbles: true,
touches: [touch],
targetTouches: [touch],
changedTouches: [touch]
});
cvs.dispatchEvent(touchEvent);
};
// イベントリスナーの再設定
cvs.addEventListener('mousedown', (e) => sendTouch('touchstart', e), true);
cvs.addEventListener('mouseup', (e) => sendTouch('touchend', e), true);
alert('マウス操作をタッチ入力へ偽装しました!これでボタンをクリックしてみてください!');
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。