MicroModelator Objects. MultiObjects

Надеюсь, вы уже убедились в простоте использования объектов CUmmObject в своих программах (например в заставках или AboutBox'ах - разве не прелесть - иметь реально трехмерный логотип в окне справки и всего за полчаса работы).

Однако, настало время использования CUmmObject'ов в более серьезных вещах - например играх, где часто применяется большое количество одинаковых объектов - кучи солдат, корабликов, машинок и прочего.

Допустим, нам необходимо иметь в игре 20 вот таких вот UGLY-красавцев :


Простейший выход - завести 20 объектов CUmmObject и у каждого из них произвести вызов LoadObject (file_name). Однако, таким образом, мы создадим в памяти 20 копий одних и тех же данных - текстур, анимационных последовательностей. А это не есть хорошо. Хорошо бы, чтобы несколько объектов имели возможность использовать одни и те же общие данные.
Теперь у нас есть эта возможность - у CUmmObject'a появилась новая функция -
	LoadObject (CUmmObject* object) ;
Эта функция позаимствует у object все данные, могущие быть общими - начальную сетку, текстуры, анимацию и прочее. Таким образом вы можете наплодить бесчетное количество копий этого объекта, причем новые вызовы могут быть примененны к любой из копий. Самое замечательное - вы можете в каком угодно порядке удалять или очищать созданные объекты - работа с памятью будет вестись корректно - просто все объекты - близнецы имеют ссылку на общий счетчик использования общих данных, и они удалятся только когда он обнуляется. Вот и все дела! не забывайте лишь вызывать CleareObject(), если вам вдруг захочется перезагрузить объект, перед тем, как сделать это.

Еще одна новая полезная функция -
	void SetAnimation (int type, char* name, int flag, int last_key, LPVOID back_func, int back_num) ; 
внимательно посмотрев на нее, вы увидите отличие от простой SetAnimation - дополнительный int в конце. На самом деле есть еще и второе отличие - back_func - указатель на функцию типа
	void (BACK_FUNCTION2)(int) ;

соответственно, по окончанию анимации, возвратная функция будет вызвана с параметром back_num. Это очень удобно - множество объектов могут ссылаться на одну и ту же функцию, и различать она будет вызвавших ее именно по параметру back_num. Все это хорошо видно в представленной ниже программе :

В этой программке действительно присутствуют 20 UGLY's, расположенные на доске 8*8. Каждый из них ведет себя, как ему вздумается, но если ему на пути попадается другой, то в ход немедленно идет молоток. Будьте уверены - уже через пару минут их останется не больше трех-четырех, а немного подождав, вы застанете одного самого везучего в полном одиночестве. Думаю, вы будете удивлены, что вся логика UGLY's реализована одной простой функцией, а сама программа написана за 3-4 часа, из которых 2 ушли на создание и анимирование UGLY's и игрового поля.

Программа идет в любом допустимом разрешении, глубина цвета - 16/24 бита определяется автоматически. Используется DirectDraw. Имеется возможность управлять способом отрисовки UGLY's.
Предлагаются следующие файлы :
multiumm.rar [скачать!] Здесь готовая программа (читайте about.txt) 98 кб.
multiumm_src.rar [скачать!] Здесь MS VC++ проект этой программы (не забудьте подключить файлы dxdraw.lib и dxguid.lib) 29 кб.


29.08.01

Hosted by uCoz