キーボード縦移動修正
by
cutfloss
06/01 [2026/06/01 00:28:51]
キーボード縦移動時にちゃんとまっすぐになるぞ!
@@ -4,43 +4,60 @@
* @private
*/
javascript:(function(){
- if (window._ultimateStraightPatch) {
+ if (window._pwmDitheringPatch) {
alert('パッチはすでに適用されています。');
return;
}
- /* キーボードの状態をブラウザ全体で独自に監視 */
- const myKeys = {};
- window.addEventListener('keydown', e => { myKeys[e.key.toLowerCase()] = true; }, true);
- window.addEventListener('keyup', e => { myKeys[e.key.toLowerCase()] = false; }, true);
-
- /* ゲームの描画・更新ループ(loop関数)の裏で、座標を強制ロックする */
- setInterval(function() {
- /* 自分がゲームに参加しており、プレイヤーデータが存在するか確認 */
- if (typeof players !== 'undefined' && typeof myId !== 'undefined' && myId !== null) {
- const me = players.find(p => p.id === myId);
- if (me) {
- const up = myKeys['arrowup'] || myKeys['w'];
- const down = myKeys['arrowdown'] || myKeys['s'];
- const left = myKeys['arrowleft'] || myKeys['a'];
- const right = myKeys['arrowright'] || myKeys['d'];
-
- /* 左右が押されておらず、縦移動(上または下)だけのとき */
- if ((up || down) && !left && !right) {
- /* サーバーから「少し斜め」の座標(targetX)が送られてきても、強制的に現在のX座標で固定する */
- if (window._lastSecureX === undefined || !up && !down) {
- window._lastSecureX = me.x;
- }
- me.targetX = window._lastSecureX;
- me.x = window._lastSecureX;
- } else {
- /* 通常移動時はロックを解除して現在の座標を記憶 */
- window._lastSecureX = me.x;
- }
+ /* 直進モードの状態管理 */
+ let straightMode = null; /* 'up', 'down', null */
+ let toggleFrame = false; /* 63と64(190と191)を切り替えるフラグ */
+
+ /* キーボードの入力を監視 */
+ window.addEventListener('keydown', function(e) {
+ const key = e.key.toLowerCase();
+
+ /* チャット入力中は無視 */
+ if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') return;
+
+ if (key === 'arrowup' || key === 'w') {
+ /* すでに上直進中なら解除、そうでなければセット */
+ straightMode = (straightMode === 'up') ? null : 'up';
+ if(straightMode) console.log('【垂直直進】真上モード起動');
+ } else if (key === 'arrowdown' || key === 's') {
+ /* すでに下直進中なら解除、そうでなければセット */
+ straightMode = (straightMode === 'down') ? null : 'down';
+ if(straightMode) console.log('【垂直直進】真下モード起動');
+ } else if (key === 'arrowleft' || key === 'a' || key === 'arrowright' || key === 'd') {
+ /* 左右が押されたら安全のために直進モードを解除 */
+ straightMode = null;
+ }
+ }, true);
+
+ /* 画面タップ/クリックでも直進を解除できるようにする */
+ window.addEventListener('mousedown', () => { straightMode = null; }, true);
+ window.addEventListener('touchstart', () => { straightMode = null; }, true);
+
+ /* WebSocketの送信関数をハック */
+ const originalSend = WebSocket.prototype.send;
+ WebSocket.prototype.send = function(data) {
+ if (straightMode && data && (data.byteLength === 1 || data.length === 1)) {
+ const view = new Uint8Array(data.buffer || data);
+
+ /* フラグを毎フレーム反転させて交互に数値を送り出す */
+ toggleFrame = !toggleFrame;
+
+ if (straightMode === 'up') {
+ /* 63(左寄り) と 64(右寄り) を交互に送って平均63.5(真上)にする */
+ view[0] = toggleFrame ? 63 : 64;
+ } else if (straightMode === 'down') {
+ /* 190(右寄り) と 191(左寄り) を交互に送って平均190.5(真下)にする */
+ view[0] = toggleFrame ? 190 : 191;
}
}
- }, 1000 / 60); /* 60FPSで常に座標の横滑りを監視・修正 */
+ return originalSend.apply(this, arguments);
+ };
- window._ultimateStraightPatch = true;
- alert('【物理法則書き換えパッチ】\n1バイト通信の限界による「0.7度の傾き」を検知しました。\n縦移動中のみ、横方向へのズレをリアルタイムで強制相殺します!');
+ window._pwmDitheringPatch = true;
+ alert('【ディザリング直進パッチ:起動】\n・Wキー / ↑キー:真上へ自動直進(1回押すだけ)\n・Sキー / ↓キー:真下へ自動直進(1回押すだけ)\n※もう一度押すか、左右移動、画面タップで解除されます。');
})();
/*
* @title キーボード縦移動修正
* @description キーボード縦移動時にちゃんとまっすぐになるぞ!
* @private
*/
javascript:(function(){
if (window._pwmDitheringPatch) {
alert('パッチはすでに適用されています。');
return;
}
/* 直進モードの状態管理 */
let straightMode = null; /* 'up', 'down', null */
let toggleFrame = false; /* 63と64(190と191)を切り替えるフラグ */
/* キーボードの入力を監視 */
window.addEventListener('keydown', function(e) {
const key = e.key.toLowerCase();
/* チャット入力中は無視 */
if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') return;
if (key === 'arrowup' || key === 'w') {
/* すでに上直進中なら解除、そうでなければセット */
straightMode = (straightMode === 'up') ? null : 'up';
if(straightMode) console.log('【垂直直進】真上モード起動');
} else if (key === 'arrowdown' || key === 's') {
/* すでに下直進中なら解除、そうでなければセット */
straightMode = (straightMode === 'down') ? null : 'down';
if(straightMode) console.log('【垂直直進】真下モード起動');
} else if (key === 'arrowleft' || key === 'a' || key === 'arrowright' || key === 'd') {
/* 左右が押されたら安全のために直進モードを解除 */
straightMode = null;
}
}, true);
/* 画面タップ/クリックでも直進を解除できるようにする */
window.addEventListener('mousedown', () => { straightMode = null; }, true);
window.addEventListener('touchstart', () => { straightMode = null; }, true);
/* WebSocketの送信関数をハック */
const originalSend = WebSocket.prototype.send;
WebSocket.prototype.send = function(data) {
if (straightMode && data && (data.byteLength === 1 || data.length === 1)) {
const view = new Uint8Array(data.buffer || data);
/* フラグを毎フレーム反転させて交互に数値を送り出す */
toggleFrame = !toggleFrame;
if (straightMode === 'up') {
/* 63(左寄り) と 64(右寄り) を交互に送って平均63.5(真上)にする */
view[0] = toggleFrame ? 63 : 64;
} else if (straightMode === 'down') {
/* 190(右寄り) と 191(左寄り) を交互に送って平均190.5(真下)にする */
view[0] = toggleFrame ? 190 : 191;
}
}
return originalSend.apply(this, arguments);
};
window._pwmDitheringPatch = true;
alert('【ディザリング直進パッチ:起動】\n・Wキー / ↑キー:真上へ自動直進(1回押すだけ)\n・Sキー / ↓キー:真下へ自動直進(1回押すだけ)\n※もう一度押すか、左右移動、画面タップで解除されます。');
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。