Skip to content

Instantly share code, notes, and snippets.

@iamoverit
Created April 15, 2025 23:56
Show Gist options
  • Save iamoverit/a8d89fe9538d607b63fd16794be18c19 to your computer and use it in GitHub Desktop.
Save iamoverit/a8d89fe9538d607b63fd16794be18c19 to your computer and use it in GitHub Desktop.
Вот модифицированная функция, которая принимает координаты курсора, размеры экрана и состояние клавиш, определяя движение относительно направления взгляда:
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