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

Порой необходимо, чтобы одни спрайты реагировали на столкновения с другими спрайтами определенным образом. Например, мяч при столкновении  со стенкой должен отскакивать, а при столкновении с ловушкой - умирать.

Есть два простых способа как это делать:

Различие по классу спрайта

register('#', WallSprite::new);
register('w', TrapSprite::new);
register('o', BallSprite::new)
    .onCollision(ai::bounce, WallSprite.class)
    .onCollision(ai::halt, TrapSprite.class);

Различие по категории спрайта

А что если у меня два вида ловушек на экране и шар должен реагировать на эти ловушки по-разному. Например, огненный шар, попав в воду  должен стать обычным шаром, а попав в огонь - исчезать.

В этом случае использовать предыдущий способ невозможно, так как и огонь и вода являются TrapSprite.class - по этому признаку их не различить.

К счастью есть способ различать спрайты по их символу, который использовался для загрузки уровня:

register('#', WallSprite::new);
register('w', TrapSprite::new)
    .onInit(w -> w.setMaterial(TrapMaterial.WATER));
register('f', TrapSprite::new)
    .onInit(f -> f.setMaterial(TrapMaterial.FIRE));
register('o', BallSprite::new)
    .onCollision(ai::bounce, WallSprite.class)
    .onCollision(ai::halt, 'f')
    .onCollision(b -> b.setFlame(false), 'w');

Таким образом если мяч столкнется с огнем (f) - сработает ai::halt. А если с водой (w) - сработает b.setFlame(false)


Comments