非公開 座標ズレ修正

    @@ -5,39 +5,60 @@ */ javascript:(function(){ const cvs = document.querySelector('canvas'); - if(!cvs) return alert('Canvasが見つかりません'); + const joyBase = document.getElementById('virtual-joystick-base'); + if(!cvs || !joyBase) return alert('必要な要素が見つかりません'); - // Canvasの表示位置とサイズを取得 - const rect = cvs.getBoundingClientRect(); - - // オリジナルのイベントリスナーを無効化するのは難しいので、 - // マウス座標を常に「Canvas相対」に補正するラッパーを強制注入します。 - const originalAddEventListener = window.EventTarget.prototype.addEventListener; - - // 今後登録される、または既に動いている座標取得に割り込み - const wrapX = (rawX) => { + /* 1. 座標変換の極意:ブラウザ上の生座標を「Canvas内の座標」に変換 */ + const getCanvasPos = (e) => { const r = cvs.getBoundingClientRect(); - // 表示上の位置を差し引き、解像度比率を掛ける - return (rawX - r.left) * (cvs.width / r.width); + 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), + rawX: clientX, + rawY: clientY + }; }; - const wrapY = (rawY) => { - const r = cvs.getBoundingClientRect(); - return (rawY - r.top) * (cvs.height / r.height); + + /* 2. 入力イベントをまるごと上書き(フック) */ + const handlePCInput = (e) => { + const pos = getCanvasPos(e); + + /* A. ブースト判定 (これでボタンが押せる) */ + if(typeof isInBoostButtonArea === 'function' && isInBoostButtonArea(pos.x, pos.y)) { + if(e.type === 'mousedown') triggerBoost(); + return; + } + + /* B. スティックの表示位置を修正 (ここが今回追加した重要ポイント) */ + if(e.type === 'mousedown') { + window.isGameReady = true; // 念のため + window.touchStartPos = { x: pos.rawX, y: pos.rawY }; + window.inputState.drawing = true; + + joyBase.style.display = 'block'; + /* マウス位置(pos.rawX)にそのまま合わせる。余白の計算はブラウザがやってくれる */ + joyBase.style.left = (pos.rawX - 60) + 'px'; + joyBase.style.top = (pos.rawY - 60) + 'px'; + + if(typeof sendInput === 'function') sendInput(); + } }; - // 【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(); + /* ゲームのイベントリスナーより先に実行させる */ + window.addEventListener('mousedown', handlePCInput, true); + + /* 3. マウス移動時のスティック追従も修正 */ + window.addEventListener('mousemove', (e) => { + if (window.touchStartPos) { + const deltaX = e.clientX - window.touchStartPos.x; + const deltaY = e.clientY - window.touchStartPos.y; + window.inputState.dx = deltaX; + window.inputState.dy = deltaY; + if(typeof handleMove === 'function') handleMove(e.clientX, e.clientY); } }, true); - alert('座標ズレ補正パッチを適用しました!\nスティックが指(マウス)の真下に出るか確認してください。'); + alert('【修正完了】ブーストOK & スティック位置補正を適用しました!'); })();
  • /*
     * @title 座標ズレ修正パッチ
     * @description PC、タブレットのタップずれ補正!
     * @private
     */
    javascript:(function(){
        const cvs = document.querySelector('canvas');
        const joyBase = document.getElementById('virtual-joystick-base');
        if(!cvs || !joyBase) return alert('必要な要素が見つかりません');
    
        /* 1. 座標変換の極意:ブラウザ上の生座標を「Canvas内の座標」に変換 */
        const getCanvasPos = (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),
                rawX: clientX,
                rawY: clientY
            };
        };
    
        /* 2. 入力イベントをまるごと上書き(フック) */
        const handlePCInput = (e) => {
            const pos = getCanvasPos(e);
    
            /* A. ブースト判定 (これでボタンが押せる) */
            if(typeof isInBoostButtonArea === 'function' && isInBoostButtonArea(pos.x, pos.y)) {
                if(e.type === 'mousedown') triggerBoost();
                return; 
            }
    
            /* B. スティックの表示位置を修正 (ここが今回追加した重要ポイント) */
            if(e.type === 'mousedown') {
                window.isGameReady = true; // 念のため
                window.touchStartPos = { x: pos.rawX, y: pos.rawY };
                window.inputState.drawing = true;
    
                joyBase.style.display = 'block';
                /* マウス位置(pos.rawX)にそのまま合わせる。余白の計算はブラウザがやってくれる */
                joyBase.style.left = (pos.rawX - 60) + 'px';
                joyBase.style.top = (pos.rawY - 60) + 'px';
                
                if(typeof sendInput === 'function') sendInput();
            }
        };
    
        /* ゲームのイベントリスナーより先に実行させる */
        window.addEventListener('mousedown', handlePCInput, true);
        
        /* 3. マウス移動時のスティック追従も修正 */
        window.addEventListener('mousemove', (e) => {
            if (window.touchStartPos) {
                const deltaX = e.clientX - window.touchStartPos.x;
                const deltaY = e.clientY - window.touchStartPos.y;
                window.inputState.dx = deltaX;
                window.inputState.dy = deltaY;
                if(typeof handleMove === 'function') handleMove(e.clientX, e.clientY);
            }
        }, true);
    
        alert('【修正完了】ブーストOK & スティック位置補正を適用しました!');
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。