2011-09-26 1 views
1

В основном у меня есть куча прямоугольников, плавающих вокруг с 8 различными углами (45 градусов, 90 градусов и т. Д.). У меня обнаружение столкновений происходит между ними, но одна вещь все еще не работает так, как должна. Я не знаю, если я просто не думаю или что, но я не могу получить правильные углы. Я также пробовал искать несколько мест, но на самом деле ничего не получил от того, что нашел.Обнаружение столкновений между прямоугольниками - результирующие углы

ПРИМЕЧАНИЕ: система угла здесь начинается с 0 в верхней части и увеличивается по часовой стрелке.
Примечание: все прямоугольники имеют одинаковую массу

Say один прямоугольник идти прямо вправо (на 90 градусов) попадает еще идущие прямо левые (270 градусов). Они будут ударить друг друга просто отлично.

Теперь скажите, что один из оставшихся попадает в цель. Здесь я не могу просто перевернуть углы или что-то еще.

Если у вас есть несколько способов, учтите следующее: если я не перестрою компакт-диск, чтобы он распространился на другой код, у меня есть позиции всех прямоугольников. CD проверяется, если два дублируют друг друга, а не сравнивают, куда они идут.

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

Если вы знаете, как заставить углы выйти прямо без жесткого кодирования, отлично. На данный момент я готов жестко запрограммировать его (не слишком много), если все, что у меня есть, - это тот, который прямоугольник попадает в другой (ex 2), или если они оба делают (ex 1). Любой из них действительно полезен.

+0

Результирующий угол зависит не только от того, как они двигаются, но и от точки контакта. Вы делаете некоторые предположения о точке контакта? –

+0

У меня есть выяснение, попало ли оно в сторону или сверху/снизу, если это то, что вы имеете в виду. Честно говоря, думая об этом сейчас, компакт-диск между прямоугольниками действительно может позволить себе пойти, если нужно. Это не будет иметь особого значения, мне просто нравятся вещи определенным образом>.> – chris

+0

Что вы имеете в виду под 8 разными углами? прямоугольники, вращающиеся вокруг оси или прямые? Вы имеете в виду направление, а не угол? – SD1990

ответ

1

Я думаю, что вы имеете в виду что-то вроде этого ...

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

Obstacle* obstacle = new Obstacle; 
Obstacle** obstacles = obstacle*[]; 

For(int i = 0; i <3; i++) 
{ 
obstacles[0] = New Obstacle(x,y, etc...); 
etc... 
} 

Или что-то подобное ... это немного ржавый

void collision(obstacles) 
    { 
     for(int i = 0; i < obstacles.sizeOf();i++) 
      { 
      //bottom y 
      if((this.ypos + this.height) > (obstacles[i].ypos - obstacles[i].height)) 
       obstacles[i].doYCollision(this); 


      //top y 
      if((this.ypos - this.height) < (obstacles[i].ypos + obstacles[i].height)) 
       obstacles[i].doYCollision(this); 


      //right x 
      if((this.xpos + this.width) > (obstacles[i].xpos - obstacles[i].width)) 
       obstacles[i].doXCollision(this); 

      //left x 
      if((this.xpos - this.width) < (obstacles[i].xpos + obstacles[i].width)) 
       obstacles[i].doXCollision(this); 
      } 
    } 

снова им немного ржавый, но если вы будете следовать его, вы должны быть в состоянии relaise, что им делать.

тогда все, что вам нужно, это вызовы функций.

void doYCollision(Obstacle obstacle) 
{ 
    // Whatever y direction they are going do the opposite 
    obstacle.yDir = obstacle.yDir * -1; 
} 
void doXCollision(Obstacle obstacle) 
{ 
    // Whatever x direction they are going do the opposite 
    obstacle.xDir = obstacle.xDir * -1; 
} 

где yDir, xDir - скорость x и y текущего объекта.

Я должен указать еще раз, что это очень ржавый и без какого-либо кода от вас, это лучший результат. но в любом случае это должно привести вас к обнаружению столкновений, код выше shoudl позволяет обо всех столкновениях со всеми препятствиями/объектами/розовыми фламинго/независимо от того, что вы получили. Im надеясь также, что он сделает то, что вы хотите, когда дело доходит до нескольких столкновений одновременно.

Вам не нужно слишком беспокоиться о точном угле (если вам это не нужно для чего-то еще), так как скорость представляет собой векторную массу, так что скорость и направление и вы можете получить направление, обрабатывая x и y как два разных элементы. Вы можете сделать это, используя метод dot product aswell =>http://www.topcoder.com/tc?d1=tutorials&d2=geometry1&module=Static, но если они просто прямоугольники, это должно быть хорошо.

Надеемся, что это поможет