Есть 2D-игровое поле на основе html canvas. При помощи rxjs я создал два потока:
1 - для отслеживания нажатий клавиш
2 - для хранения координат игрового объекта
Проблема в том, что из тела оператора map, в котором происходит пересчёт координат мне приходится обращаться к глобальной переменной canvasWidthPx чтобы объект на вышел за пределы игрового поля.
const keys$ = fromEvent(document, 'keydown').pipe(
startWith({ key: '' }),
map((e: KeyboardEvent) => e.key),
);
const tank$ = of(tankInit);
const player$ = combineLatest(tank$, keys$).pipe(
map(([tank, key]) => {
switch (key) {
case 'ArrowUp':
if(tank.y >= tank.step) { tank.y -= tank.step; }
break;
case 'ArrowRight':
if(tank.x <= canvasWidthPx - tankSizePx - tank.step) { tank.x += tank.step; }
break;
case 'ArrowDown':
if(tank.y <= canvasHeightPx - tankSizePx - tank.step) { tank.y += tank.step; }
break;
case 'ArrowLeft':
if(tank.x >= tank.step) { tank.x -= tank.step; }
break;
}
return tank;
})
);
С точки зрения функционального подхода это неправильно потому то функция перестаёт быть чистой. Подскажите пожалуйста как можно избежать использования глобальных переменных для моего случая. И возможно ли это вообще?
Если важно, то полный код
тут.