@zlodiak

Возможно ли полностью избавиться от глобальных переменных?

Есть 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;
  })  
);


С точки зрения функционального подхода это неправильно потому то функция перестаёт быть чистой. Подскажите пожалуйста как можно избежать использования глобальных переменных для моего случая. И возможно ли это вообще?

Если важно, то полный код тут.
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
combineLatest([tank$, keys$, canvasSizes$])
же

А вообще непонятно, это же у вас реакция на нажатия кнопок?
Тогда инициатором потока должны быть только кнопки, а при изменении канваса и танка поток дергаться не должен.
Т.е. надо
keys$.pipe(
 withLatest(tank$),
 withLatest(canvasSizes$), 
)


А еще почему танк в потоке тоже непонятно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы