2011-02-07 1 views
1

Я развиваю игру в свободное время в течение последних нескольких месяцев. Одной из точек привязки, которую я повторно выполнял снова и снова и не получал 100% работы, является обнаружение столкновения. Моя система (размещенная ниже) в основном работает, однако случайные вещи, похоже, происходят время от времени, например, игрок выталкивается за пределы уровня и т. Д. Учебники по этому вопросу, с которыми я столкнулся, кажутся предлагающими основные работы, т. Е. У вас есть знать объект будет по отношению к рассматриваемому объекту, но в реальной игре вы бы этого не знали. Вот моя реализация, но то, что я хочу, - это если кто-то знает хорошую систему для достижения того, что я здесь делаю.2D система обнаружения столкновения прямоугольника (которая работает в реальной игре)

Обратите внимание, что элемент исходит из коллекции IItem, которая предоставляет Rectangle и несколько других бит для каждого элемента.

public void Move(float xAdditional, float yAdditional) 
    { 
     X += xAdditional; 
     Y += yAdditional; 

     foreach (var item in Level.Items) 
     { 
      if (item != this) 
      { 
       if (item.Boundary.Intersects(this.Boundary)) 
       { 
        if (item.Boundary.Top > this.Boundary.Top) //we have collided with an object below us. 
        { 
         Y = item.Boundary.Top - (this.Boundary.Height/2); 
        } 
        if(item.Boundary.Bottom < this.Boundary.Bottom)//we have collided with an object above us. 
        { 
         Y = item.Boundary.Bottom + (this.Boundary.Height/2); 
        } 
        if(item.Boundary.Left > this.Boundary.Left) //We have collided with an object to the right. 
        { 
         X = item.Boundary.Left - (this.Boundary.Width/2); 
        } 
        if(item.Boundary.Right < this.Boundary.Right)// We have collided with an object to the left; 
        { 
         X = item.Boundary.Right + (this.Boundary.Width/2); 
        } 
       } 
      } 

     } 


    } 
+0

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

+0

Спасибо Empyrean, После некоторого серьезного чтения учебников я собираюсь сидеть и узнавать об использовании Farseer, основанного на Box2D. Я понимаю, я думаю. Кажется, это наиболее подходит для того, как я хотел бы работать с вещами. Увидев его в действии, его немного не хватает. – Nick

ответ

1

Окончательным решением было отказаться от моего собственного решения и реализовать Farseer.

Благодаря

Через некоторое время с ним, то я выбрал для physics2d.net, который я нашел гораздо более удобным с точки зрения разработчиков.

0

Прежде всего, обнаружение столкновений в значительной степени зависит от геометрии объекта. Существует несколько доказанных решений для работы в линейной алгебре математики, , но они зависят от геометрии, которую вы пытаетесь использовать. Вместо того, чтобы реализовать алгоритм с использованием свойств объекта, попробуйте непосредственно реализовать математическое уравнение, а затем использовать результат, чтобы определить, произошло ли ваше столкновение или нет. (например, используя векторы t = a-b, если | t |> 0 столкновение, иначе - нет).

Если у вас есть простая геометрия, как прямоугольники или круги, вы должны принять взгляд в «Математику для 3d программирования игр & компьютерной графики» Эрик Ленджиел.

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

+0

Спасибо за ваш счет Count0. Это не столько обнаружение столкновения, которое является моей проблемой, я знаю, когда что-то сталкивается, его разумное реагирование. Я взламываю пыль, пытаясь придумать мой собственный метод для надежной работы. Привет. – Nick