TDD и игровая физика

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

Во-первых, я рано понял, что TDD не кажется идеальным для разработки игр. Кажется, что мнения по этому поводу довольно сильно расходятся. Моим первоначальным необразованным мнением было то, что TDD выглядело так, как будто он очень хорошо работает для всей игровой логики. Я подумал, что все, что будет иметь дело с выводом видео и звуком, будет абстрагировано в классы, которые будут проверяться визуально.

Все началось хорошо. Целью было создать двумерную космическую игру (астероиды для тех, кому небезразлично). Я создал серию модульных тестов для класса Ship. Такие вещи, как инициализация, вращение, можно легко протестировать в таких сериях, как: GetRotation (), TurnRotateRightOn (), Update (1), GetRotation (), Expect_NE (вращение1, вращение2). Затем я столкнулся с первой проблемой.

Насколько я понимаю, TDD состоит в том, что вы должны написать тест так, как, по вашему мнению, вы должны использовать этот класс. Я хочу, чтобы корабль мог двигаться, поэтому я написал класс, который в основном сказал. GetCoordinates (),ThrustOn (), Обновление (1), GetCoordinates (). Это было нормально, чтобы убедиться, что корабль переместился куда-нибудь . Однако я быстро понял, что должен убедиться, что корабль движется в правильном направлении и с правильной скоростью. За этим последовал юнит-тест на 75 строк, где мне в основном приходилось инициализировать вращение, проверять координаты, инициализировать тягу, обновлять корабль, получать новые координаты, проверять новое вращение. Более того, я не вижу необходимости когда-либо получать скорость корабля в игре (только координаты, корабль должен обновиться). Из-за этого у меня не было прямого способа получить скорость. Таким образом, тест в основном должен был пересчитать, какой должна быть скорость, чтобы я мог убедиться, что она совпадает с теми координатами, которые я получал после обновления. В целом это было очень грязно и отнимало много времени, но работало. Тест не прошел, тест прошел успешно и т.д.

Это было нормально до тех пор, пока я не понял, что хочу преобразовать код обновления корабля в абстрактный класс «Актер». Я понял, что, хотя каждый подкласс Actor должен иметь возможность правильно рассчитывать новую позицию, не каждый подкласс обязательно будет обновлять свою скорость таким же образом (некоторые сталкиваются, некоторые нет, некоторые имеют статические скорости). Теперь я в основном сталкиваюсь с перспективой дублирования и изменения этого огромного и массивного тестового кода, и я не могу не думать, что должен быть лучший способ.

Есть ли у кого-нибудь опыт работы с модульным тестированием такого рода сложного типа работ "черный ящик"? Похоже, мне в основном приходится писать точно такой же физический код в тесте, чтобы я знал, каким должен быть результат. Это действительно кажется самоубийственным, и я уверен, что где-то по пути я упускаю смысл всего этого. Буду очень признателен за любую помощь или совет, который мог бы предложить любой.

7
задан Landon 20 August 2011 в 06:41
поделиться