Обнаружение столкновений между двумя изображениями в Java

Не существует метода как такового. Метод finalize(), определенный в верхнем уровне Object, , может быть вызван , когда объект освобождается сборщиком мусора, но это не поведение, на которое вы можете положиться.

13
задан Mike B 2 December 2008 в 21:53
поделиться

6 ответов

Я думаю, что Ваша проблема состоит в том, что Вы не используете хороший дизайн OO для своего игрока и врагов. Создайте два класса:

public class Player
{
    int X;
    int Y;
    int Width;
    int Height;

    // Getters and Setters
}

public class Enemy
{
    int X;
    int Y;
    int Width;
    int Height;

    // Getters and Setters
}

Ваш Плеер должен иметь X, Y, Ширина и переменные Высоты.

Ваши враги должны также.

В Вашем игровом цикле, сделайте что-то вроде этого (C#):

foreach (Enemy e in EnemyCollection)
{
    Rectangle r = new Rectangle(e.X,e.Y,e.Width,e.Height);
    Rectangle p = new Rectangle(player.X,player.Y,player.Width,player.Height);

    // Assuming there is an intersect method, otherwise just handcompare the values
    if (r.Intersects(p))
    {
       // A Collision!
       // we know which enemy (e), so we can call e.DoCollision();
       e.DoCollision();
    }
}

Для ускорения вещей не потрудитесь проверять, являются ли провода врагов внеэкранными.

18
ответ дан 2 revs 2 December 2008 в 21:53
поделиться
  • 1
    Это использует n^3 и является поэтому не очень хорошим алгоритмом. Используйте алгоритм Hosam Aly. – Georg Schölly 25 January 2009 в 20:01

Вы не хотите иметь контрольный код коллизии в коде рисования. Рисование должно быть быстрым. Коллизия может войти в игровой цикл. Поэтому Вам нужно внутреннее представление объектов, независимых от их спрайтов.

3
ответ дан Karl 2 December 2008 в 21:53
поделиться
  • 1
    Который в порядке в этом случае, так как все узлы будут соединены. Гарантируемый от пути карта сгенерирована. – Mizipzor 27 January 2009 в 09:05

Так как Java не имеет пересечь функции (действительно!?) можно сделать обнаружение коллизий просто comparying X и Y, Ширина и значения Высоты ограничительных рамок (прямоугольник) для каждого из объектов, которые могли потенциально столкнуться.

Так... в базовом объекте каждого сталкивающегося объекта... т.е. если у Вашего игрока и врага есть общая база, можно поместить простой Прямоугольный объект, названный чем-то как BoundingBox. Если общая база будет созданным в классе Java тогда, то необходимо будет создать класс, который расширяет сборку в классе, и имейте плеер, и вражеские объекты расширяют новый класс или являются экземплярами того класса.

При создании (и каждая галочка или обновление) необходимо будет установить BoundingBox paremeters и для игрока и для врага. У меня нет Прямоугольного класса infront меня, но ее наиболее вероятного что-то как X, Y, Ширина и наконец Высота. X и Y то, что местоположение объектов в Вашем игровом мире. Ширина и высота сам объяснительные, я думаю. Они, скорее всего, прибудут из права местоположения плееров, хотя так, если бы X и Y были bothe в 0 и Ваша Ширина и Высота, были оба в 256, Вы ничего не видели бы, потому что символ наверху оставят за пределами экрана.

Так или иначе... для обнаружения коллизии Вы захотите сравнить атрибуты плеера и вражеского BoundingBoxes. Так что-то вроде этого...

 if( Player.BoundingBox.X = Enemy.BoundingBox.X && If( Player.BoundingBox.Y = Enemy.BoundingBox.Y )
 {
      //Oh noes!  The enemy and player are on top of eachother.
 }

логика может получить вид сложных, но необходимо будет сравнить расстояния между каждым BoundingBox и сравнить местоположения.

2
ответ дан Dalin Seivewright 2 December 2008 в 21:53
поделиться
  • 1
    Это может привести к невероятно плохим результатам, если, например, точка, сначала выбранная, включается стенами и может только достигнуть 3 других точек. – Georg Schölly 26 January 2009 в 15:32

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

Теперь, Вы перемещаете эти прямоугольники то же, поскольку Вы делаете объекты, таким образом, у них есть 'ограничительная рамка'

, я не уверен, имеет ли Java это, но это могло бы иметь метод на прямоугольном объекте, названном .intersects (), таким образом, Вы сделаете, если (rectangle1.intersectS (rectangle2) для проверки, чтобы видеть, столкнулся ли объект с другим.

Иначе можно получить координаты X и Y полей, и использование высоты/ширины их обнаруживают, пересекли ли они себя.

Так или иначе, можно использовать это, чтобы или сделать событие на пересечении (сделайте, каждый взрывается, или безотносительно), или препятствуйте тому, чтобы перемещение было оттянуто. (вернитесь к предыдущим координатам)

редактирование: здесь мы идем

, булевская переменная

пересекается (Прямоугольник r) Определяет, пересекаются ли этот Прямоугольник и указанный Прямоугольник.

, Таким образом, я сделал бы (и не вставляют этот код, он, скорее всего, не будет работать, не сделанный Java в течение долгого времени, и я не сделал графики, когда я действительно использовал его.)

Rectangle rect1 = new Rectangle(player.x, player.y, player.width, player.height);

Rectangle rect2 = new Rectangle(enemy.x, enemy.y, enemy.width, enemy.height);

//detects when the two rectangles hit
if(rect1.intersects(rect2))
{

System.out.println("game over, g");
}

, очевидно, необходимо было бы соответствовать этому в где-нибудь.

2
ответ дан 4 revs 2 December 2008 в 21:53
поделиться
  • 1
    Это имело 13 upvotes и меня don' t думают, что у достаточного количества людей был бы downvoted им. – Georg Schölly 25 January 2009 в 21:31

Вот полезная из игры с открытым исходным кодом, которая использует много коллизий: http://robocode.sourceforge.net/

можно смотреть на код и дополнение с ответами, записанными здесь.

2
ответ дан OscarRyz 2 December 2008 в 21:53
поделиться

Во-первых, используйте ограничительные рамки, как описано 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 игр

5
ответ дан 2 revs 2 December 2008 в 21:53
поделиться
  • 1
    Интересный, но sub-O (n^3) алгоритмы умножения матриц хитры, чтобы кодировать и иметь большие издержки - согласно Википедии, O (n^2.376) алгоритм является " не практичный для матриц, которые могут соответствовать на today' s компьютеры " Так на практике you' d используют O (n^3) алгоритм, делая это медленнее, чем F-W. – j_random_hacker 26 January 2009 в 04:29
Другие вопросы по тегам:

Похожие вопросы: