Created
April 15, 2025 23:56
-
-
Save iamoverit/a8d89fe9538d607b63fd16794be18c19 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Вот модифицированная функция, которая принимает координаты курсора, размеры экрана и состояние клавиш, определяя движение относительно направления взгляда: | |
javascript | |
Copy | |
```js | |
function getMovementState(cursorX, cursorY, screenWidth, screenHeight, keys) { | |
// Определяем центр экрана (позиция персонажа) | |
const centerX = screenWidth / 2; | |
const centerY = screenHeight / 2; | |
// Вектор направления взгляда (от персонажа к курсору) | |
const dirX = cursorX - centerX; | |
const dirY = cursorY - centerY; | |
// Нормализация вектора направления | |
const dirLength = Math.hypot(dirX, dirY); | |
if (dirLength === 0) return 'none'; | |
const normDirX = dirX / dirLength; | |
const normDirY = dirY / dirLength; | |
// Вектор движения на основе клавиш (WASD) | |
let moveX = 0; | |
let moveY = 0; | |
if (keys.w) moveY -= 1; // Предполагаем, что ось Y вверх отрицательная | |
if (keys.s) moveY += 1; | |
if (keys.a) moveX -= 1; | |
if (keys.d) moveX += 1; | |
// Нормализация вектора движения (для диагоналей) | |
if (moveX !== 0 || moveY !== 0) { | |
const moveLength = Math.hypot(moveX, moveY); | |
moveX /= moveLength; | |
moveY /= moveLength; | |
} | |
// Проекции движения на направление взгляда и перпендикуляр | |
const forwardDot = moveX * normDirX + moveY * normDirY; | |
const strafeDot = moveX * (-normDirY) + moveY * normDirX; | |
// Определение доминирующего направления | |
const absForward = Math.abs(forwardDot); | |
const absStrafe = Math.abs(strafeDot); | |
if (absForward > absStrafe) { | |
return forwardDot > 0 ? 'forward' : 'backward'; | |
} else if (absStrafe > 0) { | |
return strafeDot > 0 ? 'strafe_right' : 'strafe_left'; | |
} | |
return 'none'; | |
} | |
``` | |
Как использовать: | |
cursorX, cursorY: Координаты курсора в экранной системе (например, из MouseEvent) | |
screenWidth, screenHeight: Размеры игрового холста | |
keys: Объект с состоянием клавиш (например, { w: false, a: true, s: false, d: true }) | |
javascript | |
Copy | |
// Пример объекта с состоянием клавиш при нажатии W и D | |
const keys = { w: true, a: false, s: false, d: true }; | |
// Курсор в правой половине экрана | |
const state = getMovementState(800, 400, 1280, 720, keys); | |
Особенности реализации: | |
Нормализация движения: | |
Диагональное движение (например, W+D) нормализуется, чтобы проекции корректно отражали направление. | |
Система координат: | |
Предполагается, что: | |
Ось Y направлена вниз (как в Canvas) | |
moveY -= 1 = движение вверх | |
moveY += 1 = движение вниз | |
Порог срабатывания: | |
Возвращает 'none', если: | |
Курсор точно на персонаже | |
Не нажаты клавиши движения | |
Примеры поведения: | |
Нажатые клавиши Позиция курсора Результат | |
W Вверху forward | |
S Слева strafe_right | |
A + D Любая none | |
W + D Справа-вверху forward | |
Доработки для вашего проекта: | |
Если используется другая система координат (Y вверх = положительное направление), измените знаки для moveY: | |
javascript | |
Copy | |
if (keys.w) moveY += 1; | |
if (keys.s) moveY -= 1; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment