Порой необходимо, чтобы одни спрайты реагировали на столкновения с другими спрайтами определенным образом. Например, мяч при столкновении со стенкой должен отскакивать, а при столкновении с ловушкой - умирать.
Есть два простых способа как это делать:
Различие по классу спрайта
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)