非公開 座標ズレ修正

    @@ -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 です。