座標ズレ修正
by
cutfloss
04/29 [2026/04/29 22:21:36]
PC、タブレットのタップずれ補正し、ブーストボタンを押せるようになる
@@ -7,41 +7,37 @@
const cvs = document.querySelector('canvas');
if(!cvs) return alert('Canvasが見つかりません');
- // 座標変換関数
- const getPos = (e) => {
+ // Canvasの表示位置とサイズを取得
+ const rect = cvs.getBoundingClientRect();
+
+ // オリジナルのイベントリスナーを無効化するのは難しいので、
+ // マウス座標を常に「Canvas相対」に補正するラッパーを強制注入します。
+ const originalAddEventListener = window.EventTarget.prototype.addEventListener;
+
+ // 今後登録される、または既に動いている座標取得に割り込み
+ const wrapX = (rawX) => {
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)
- };
+ // 表示上の位置を差し引き、解像度比率を掛ける
+ return (rawX - r.left) * (cvs.width / r.width);
};
-
- // マウス操作をタッチ操作としてゲームのシステムに強制送信する
- 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);
+ const wrapY = (rawY) => {
+ const r = cvs.getBoundingClientRect();
+ return (rawY - r.top) * (cvs.height / r.height);
};
- // イベントリスナーの再設定
- cvs.addEventListener('mousedown', (e) => sendTouch('touchstart', e), true);
- cvs.addEventListener('mouseup', (e) => sendTouch('touchend', e), true);
-
- alert('マウス操作をタッチ入力へ偽装しました!これでボタンをクリックしてみてください!');
+ // 【PC・タブレット用】 強制座標修正パッチ
+ // 直接内部の handleStart 等を叩けないため、イベントの座標を偽装します
+ window.addEventListener('mousedown', (e) => {
+ const r = cvs.getBoundingClientRect();
+ // 座標を補正
+ const correctedX = e.clientX - r.left;
+ const correctedY = e.clientY - r.top;
+
+ // ここでゲーム側の判定関数に、補正した座標を直接送り込む
+ if(typeof isInBoostButtonArea === 'function' && isInBoostButtonArea(correctedX, correctedY)) {
+ if(typeof triggerBoost === 'function') triggerBoost();
+ }
+ }, true);
+
+ alert('座標ズレ補正パッチを適用しました!\nスティックが指(マウス)の真下に出るか確認してください。');
})();
/*
* @title 座標ズレ修正パッチ
* @description PC、タブレットのタップずれ補正!
* @private
*/
javascript:(function(){
const cvs = document.querySelector('canvas');
if(!cvs) return alert('Canvasが見つかりません');
// Canvasの表示位置とサイズを取得
const rect = cvs.getBoundingClientRect();
// オリジナルのイベントリスナーを無効化するのは難しいので、
// マウス座標を常に「Canvas相対」に補正するラッパーを強制注入します。
const originalAddEventListener = window.EventTarget.prototype.addEventListener;
// 今後登録される、または既に動いている座標取得に割り込み
const wrapX = (rawX) => {
const r = cvs.getBoundingClientRect();
// 表示上の位置を差し引き、解像度比率を掛ける
return (rawX - r.left) * (cvs.width / r.width);
};
const wrapY = (rawY) => {
const r = cvs.getBoundingClientRect();
return (rawY - r.top) * (cvs.height / r.height);
};
// 【PC・タブレット用】 強制座標修正パッチ
// 直接内部の handleStart 等を叩けないため、イベントの座標を偽装します
window.addEventListener('mousedown', (e) => {
const r = cvs.getBoundingClientRect();
// 座標を補正
const correctedX = e.clientX - r.left;
const correctedY = e.clientY - r.top;
// ここでゲーム側の判定関数に、補正した座標を直接送り込む
if(typeof isInBoostButtonArea === 'function' && isInBoostButtonArea(correctedX, correctedY)) {
if(typeof triggerBoost === 'function') triggerBoost();
}
}, true);
alert('座標ズレ補正パッチを適用しました!\nスティックが指(マウス)の真下に出るか確認してください。');
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。