@zlodiak

Как получить набор точек на координатной плоскости?

Я задался идеей избавиться от глобальных переменных и все данные, необходимые для работы функции, передавать ей через параметры. Для задачи получения набора точек на координатной плоскости я написал следующий код:

const walls$ = combineLatest(
  range(0, constants.wallsCnt),
  of(constants.canvasWidthPx),
  of(constants.canvasHeightPx),
  of(constants.wallSizePx),
)
.pipe(
  map(([range, canvasWidthPx, canvasHeightPx, wallSizePx]) => {
    return {
      x: Math.floor(Math.random() * Math.floor(canvasWidthPx - wallSizePx)),
      y: Math.floor(Math.random() * Math.floor(canvasHeightPx - wallSizePx)),
      strength: Math.floor(Math.random() * Math.floor(constants.wallStrengthMax)) + 1,
    }
  }),
  toArray(),
  tap(v => {
    console.log(v)
  }),
).subscribe()


Проблема в том, что на выходе я получаю только одну точку, хотя должен получить 3. Потому что
constants.wallsCnt = 3

Примечательно, что проблема решается, если переписать код с использованием глобальных переменных:
const walls$ = range(0, constants.wallsCnt)
.pipe(
  map(_ => {
    return {
      x: Math.floor(Math.random() * Math.floor(constants.canvasWidthPx - constants.wallSizePx)),
      y: Math.floor(Math.random() * Math.floor(constants.canvasHeightPx - constants.wallSizePx)),
      strength: Math.floor(Math.random() * Math.floor(constants.wallStrengthMax)) + 1,
    }
  }),
  toArray(),
)


Но мне нужна запись именно в первом варианте. Помогите пожалуйста починить код.

Не спрашивайте только зачем мне это нужно. Я пишу небольшую 2D-игру, полный код здесь, если интересно.
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
Однако ты своим вопросом заставил поломать голову
Конечно, сам способ так считать координаты это полный изврат, однако такое поведение combineLatest на какое-то время сильно меня озадачило :)

Но все оказалось довольно просто https://stackblitz.com/edit/tanks-field-without-gl...
Найди отличие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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