Статьи

Tower Defense в JavaFX (5)

Это часть 5 этого постоянного руководства по созданию игры Tower Defense в JavaFX с использованием FXGameEngine . Теперь враги летят на пути атаки к цели, а турели целятся и стреляют в них. Итак, самые важные части есть, но все еще не хватает многих деталей. Игра просто начинается и не дает нам возможности подготовиться к следующей волне. Это не показывает счет (фактически нет никакого счета). Волна никогда не заканчивается, и вы не можете выиграть или проиграть. Поэтому нам нужно добавить немного игровой логики, HUD и Controls. Нам также нужно увидеть статус повреждений врагов. Последняя особенность — это функция, о которой мы позаботимся в этой части урока.

StackedRenderer

Итак, начнем со статуса Врага. Мы могли бы добавить их в дополнительный слой HUD, так как это то, для чего предназначен HUD, но я готовлюсь сделать это через Renderers. У каждого спрайта есть один текущий рендер. Вы можете переключать Renderers, и это то, что делают SpriteActions (мы рассмотрим их в другом учебнике), но вы все равно можете иметь только один активный Renderer одновременно. В нашем EnemySprite это анимация LookAheadTileSetAnimation. Чтобы разрешить комбинацию визуализаторов, вы можете использовать класс StackedRenderer. Это позволяет вам размещать неограниченное количество рендеров и просто делегировать им при каждом вызове метода.

Таким образом, мы можем создать простой HealthBarRenderer и использовать это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class HealthBarRenderer implements Renderer {
 
@Override
public boolean prepare(Sprite sprite, long time) {
return true;
}
 
@Override
public void render(Sprite sprite, GraphicsContext context, float alpha, long time) {
EnemySprite enemySprite = (EnemySprite) sprite;
double health = enemySprite.getHealth();
double maxHealth = enemySprite.getMaxHealth();
if (health == maxHealth) {
return;
}
 
int width = sprite.getWidth();
int height = sprite.getHeight();
double percent = health / maxHealth;
context.setFill( Color.rgb(200,200,200,.5));
context.fillRect(4+(width / 2), 10+(height / 2), (width / 2), 4);
 
context.setFill( Color.rgb(0,255,0,.5));
if (percent < .5) {
context.setFill(Color.rgb(255,255,0,.5));
}
if (percent < .2) {
context.setFill(Color.rgb(255,0,0,0.5));
}
context.fillRect(4+(width / 2), 10+(height / 2), (width / 2 * percent), 4);
}
}

И мы используем это в StackedRenderer:

1
2
final TileSetAnimation tileSetAnimation = new LookAheadTileSetAnimation(enemy1, new int[]{0, 1, 2, 3, 4, 5}, 10f);
final StackedRenderer stacked = new StackedRenderer(tileSetAnimation, new HealthBarRenderer());

И вот что мы получаем:

В следующей части мы добавим HUD.

Ссылка: Защита башни в JavaFX (5) от нашего партнера JCG Тони Эппла в блоге Eppleton .