Допустим, у вас есть что-то вроде этого изображения:
Когда ты перемещайте свой персонаж, видимая область перемещается вместе с ним, так что ваш персонаж, например, всегда посередине.
Когда персонаж перемещается, charX
увеличивается, и через него проходит определенное расстояние, он попадает в положение, когда противник активирует:
И он остается активным до тех пор персонаж получает здесь:
Реализация может быть примерно такой:
someOffset
может быть произвольным постоянным значением, вы используете его так, чтобы противник активировался до того, как он войдет в экран и станет видимым.
Таким образом, для каждого кадра вы можете сделать это:
if (Math.abs(enemyX - charX) <= visibleWidth/2 + someOffset) {
// the enemy patrols between leftLimit and rightLimit
if (enemySpeed < 0 && enemyX < leftLimit) {
enemyX = leftLimit;
enemySpeed = -enemySpeed;
} else if (enemySpeed > 0 && enemyX > rightLimit) {
enemyX = rightLimit;
enemySpeed = -enemySpeed;
}
enemyX += enemySpeed * delta;
renderEnemy();
}
[Update]
Если я правильно помню, экран в Марио может идти только вправо. Если Марио идет влево, экран остается в положении и позволяет Марио только добраться до его левого края, не дальше.
Поскольку он не всегда находится в том же положении на видимой области, было бы лучше, если бы враги были активны/визуализированы на основе видимой области, а не позиции персонажа.
Допустим, что visibleX
является x-позицией левого края видимой области (зеленый прямоугольник).
На каждом обновлении вы могли бы сделать что-то вроде:
visibleX = Math.max(charX - visibleWidth/2, visibleX);
if (enemyX <= visibleX + visibleWidth + someOffset && enemyX >= visibleX - someOffset) {
// ...
}
Фантастические диаграммы! –
Я знаю, что я не должен публиковать это, но ваш ответ действительно хорошо структурирован, хорошо отредактирован и хорошо отображен! Очень хорошая работа @mrzli !!! – Ferdz