2014-01-19 2 views
1

У меня есть вопрос о перемещении врага в моей игре, как черепахи в игре брата Марио.Libgdx враг движется

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

Когда враг начнет двигаться (рендеринг)? на некоторой задержкой времени или когда игрок находится близко к противнику (1-2 экраны шириной), все время ...

ответ

10

Допустим, у вас есть что-то вроде этого изображения:

enter image description here

Когда ты перемещайте свой персонаж, видимая область перемещается вместе с ним, так что ваш персонаж, например, всегда посередине.

Когда персонаж перемещается, charX увеличивается, и через него проходит определенное расстояние, он попадает в положение, когда противник активирует:

enter image description here

И он остается активным до тех пор персонаж получает здесь:

enter image description here

Реализация может быть примерно такой:
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) { 
    // ... 
} 
+2

Фантастические диаграммы! –

+0

Я знаю, что я не должен публиковать это, но ваш ответ действительно хорошо структурирован, хорошо отредактирован и хорошо отображен! Очень хорошая работа @mrzli !!! – Ferdz

Смежные вопросы