Во-первых, используйте ограничительные рамки, как описано Jonathan Holland , чтобы найти, может ли у Вас быть коллизия.
От (многокрасочных) спрайтов, создайте черные и белые версии. У Вас, вероятно, уже есть они, если Ваши спрайты прозрачны (т.е. существуют места, которые являются в ограничительной рамке, но можно все еще видеть фон). Это "маски".
Использование Image.getRGB()
на маске для достигания пикселей. Для каждого пикселя, который не прозрачен, устанавливает немного в целочисленном массиве (playerArray
и enemyArray
ниже). Размер массива height
если width <= 32
пиксели, (width+31)/32*height
иначе. Код ниже для width <= 32
.
, Если у Вас есть коллизия ограничительных рамок, сделайте это:
// Find the first line where the two sprites might overlap
int linePlayer, lineEnemy;
if (player.y <= enemy.y) {
linePlayer = enemy.y - player.y;
lineEnemy = 0;
} else {
linePlayer = 0;
lineEnemy = player.y - enemy.y;
}
int line = Math.max(linePlayer, lineEnemy);
// Get the shift between the two
x = player.x - enemy.x;
int maxLines = Math.max(player.height, enemy.height);
for ( line < maxLines; line ++) {
// if width > 32, then you need a second loop here
long playerMask = playerArray[linePlayer];
long enemyMask = enemyArray[lineEnemy];
// Reproduce the shift between the two sprites
if (x < 0) playerMask << (-x);
else enemyMask << x;
// If the two masks have common bits, binary AND will return != 0
if ((playerMask & enemyMask) != 0) {
// Contact!
}
}
Ссылки: JGame, Платформа для Маленьких Java игр
Кнопки в настройке формы указывают, что вы собираетесь что-то сделать с формой; отправка, очистка, добавление файла и т. д. Если сделать кнопку отмены ссылкой, вы можете оставить ее в любое время без каких-либо последствий.