Farseer (или, точнее, Box2D, из которого он получен) настроен для лучшей работы с объектами весом от 0,1 до 10 единиц и размером от 0,1 до 10 единиц (ширина или высота). Если вы используете объекты за пределами этого диапазона, ваша симуляция может быть не такой стабильной, как могла бы быть.
В большинстве случаев это хорошо работает для объектов «обычного» размера, которые вы можете найти в игре (автомобили, книги и т. Д.), Измеряемых в метрах и килограммах. Однако это не обязательно, и вы можете выбрать любой масштаб. (Например, в играх, в которых используются шарики или самолеты, может использоваться шкала, отличная от метров / килограммов).
Большинство игр имеют различные пробелы. Например: пространство «Модель», пространство «Проекция», пространство «Вид», пространство «Мир», пространство «Экран», пространство «Клиент». Некоторые измеряются в пикселях, другие в простых единицах. И вообще игры используют матрицы для преобразования вершин из одного пространства в другое. Наиболее очевидно, когда вы берете мир, измеряемый в единицах, и отображаете его на экране, измеряемом в пикселях.
XNA's SpriteBatch
упрощает это по умолчанию, поскольку мировое пространство совпадает с пространством клиента. Одна единица мира = один пиксель.
Обычно у вас должно быть определено пространство вашего мира, равное , идентичное пространству, в котором существует ваш физический мир. Но это будет проблемой при использовании пространства по умолчанию SpriteBatch
, так как вы не сможете иметь физический объект размером более 10 пикселей без выхода за пределы диапазона, на который настроен Farseer.
Farseer's [1] решение состоит в том, чтобы иметь два разных мировых пространства - пространство game и пространство физика . И используйте класс ConvertUnits
везде, где это необходимо для преобразования между этими двумя системами.
Лично я нахожу это решение чертовски ужасным , так как оно очень подвержено ошибкам (так как вы должны получить правильное преобразование в нескольких местах, разбросанных по всему коду).
Для любой скромно серьезной разработки игр я бы порекомендовал использовать единое мировое пространство, разработанное на основе требований Farseer. А затем либо используйте глобальное преобразование в SpriteBatch.Begin
, либо что-то совершенно иное, чем SpriteBatch
, для отображения этого мира на экране.
Однако для простых демонстраций ConvertUnits
делает свою работу. И это позволяет вам сохранить замечательное свойство SpriteBatch
, что один пиксель в текстуре немасштабированного спрайта = один пиксель на экране.
[1]: в прошлый раз, когда я проверял, ConvertUnits
был частью образцов Farseer, а не частью самой библиотеки физики.