Войти
Уголок tool-программСтатьи

[Конкурс] Простой редактор уровней на основе существующих пакетов. Часть 2

Автор:

Простой редактор уровней средствами 3D Studio Max

Редактирование и экспорт  игровых сцен из 3D Studio Max
Наказненко Павел Анатольевич, aka “Crio”
Специально для конкурса проводимого сообществом «Уголок tool-программистов»
www.gamedev.ru

Часть 2. Улучшаем редактор уровней
В прошлой статье мы написали маленький, простой, но довольно удобный редактор
уровней. Сегодня мы улучшим наш редактор.
Дело в том, что иногда возникает потребность отображать объекты на сцене в виде
их реальных прототипов. Для этого приходится пользоваться утилитой Merge (File->Merge),
а затем, вновь добавленному телу присваивать свойства объекта уровня, что довольно
неудобно. Первое, что приходит в голову – это перехват события Merge, добавление к
объекту некоторых свойств. Однако, сделать это средствами MaxScript практически не возможно.
Попробуем решить эту задачу «задом на перед».
Добавим на панель Object Editor новую кнопку Merge, по нажатию которой будет вызваться окно
диалога открытия файла .max. Затем объект добавляется на сцену уже со свойствами, которые
были указаны перед нажатием кнопки Merge.

Итак, преступим к написанию скрипта.

Примечание: так как бОльшая часть кода остается без изменений, рассмотрим только ту часть, которая подверглась изменениям

 utility ObjectEditor "Object Editor"
(
  group "Object properties"
  (
  dropDownList ObjectType "Object type:" pos:[13,22] width:140 \
                                             height:40 enabled:true \ 
                                             items:#("Model", "Cube", "Sphere","ParticleEffect")  \ 
                                             selection:1
  checkbox Visibility "Visible" pos:[13,64] width:133 height:15 checked:true
  checkbox DepthTest "Depth test" pos:[13,82] width:133 height:15 checked:true
  checkbox AlphaTest "Alpha test" pos:[13,100] width:133 height:15 checked:false
  dropDownList Culling "Backface culling:" pos:[13,118] \ 
                                width:132 height:40 enabled:true  \ 
                                items:#("No", "Back", "Front") selection:1
  editText FileName "Name of file:" pos:[14,161] width:127 height:19 enabled: true
  button LoadFile "Load" pos:[95,183] width:47 height:22
  button Apply "Apply" pos:[60,208] width:47 height:22
  button Refresh "Refresh" pos:[13,208] width:47 height:22

-- НОВЫЙ КОД
-- добавляем кнопку Merge
-- КОНЕЦ НОВОГО КОДА

  button Merge "Merge" pos:[107,208] width:47 height:22
  )
  on ObjectType selected sel do
    if (ObjectType.Selection == 1) or (ObjectType.Selection == 4) then
    (
      FileName.Enabled = true
      LoadFile.Enabled = true
    )
    else
    (
      FileName.Enabled = false
      LoadFile.Enabled = false    
    )
  on Refresh pressed  do
    ReadProperties $
  on Apply pressed  do
    WriteProperties $

-- НОВЫЙ КОД
-- обрабатываем нажатие кнопки Merge
  on Merge pressed do
  (
-- создаем переменную для хранения пути к файлу и вызываем диалог
    newMAXfilename=getopenfilename caption:"MAX" \
      types:"max (*.max)|*.max|All Files (*.*)|*.*|"
    if newMAXfilename!=undefined do 
    (    
      clearSelection()    -- снимаем текущее выделение
      -- совмещаем файлы, причем указываем, что
      -- необходимо уведомлять о дубликатах и
      -- выделить вновь внедренные объекты по завершении
      mergeMAXFile newMAXfilename #promptDups #select
      -- если сейчас в редакторе объектов указан тип = Модель
      if (ObjectType.Selection == 1) then
      (
      -- изымаем имя файла и присваеиваем стандартное расширение
      -- на тот случай если файл .mdl одноименный файлу .max
        FileName.Text = (getFilenameFile newMAXfilename) + ".mdl"
      )
      -- пишем свойства добавленному объекту
      WriteProperties $
      clearSelection() -- снимаем текущее выделение
    )    
  )
-- КОНЕЦ НОВОГО КОДА

  on LoadFile pressed  do
  (
    sFilename=getopenfilename caption:"File" \
      types:"All Files (*.*)|*.*|"
    if sFilename!=undefined do 
    (        
      FileName.Text = FileNameFromPath sFilename
    )  
  )    
) 

Как пользоваться
Открываете редактор объектов, указываете некоторые свойства объекта в соответствующих полях,
нажимаете кнопку Merge. В итоге на сцену импортируется объект из .max файла с уже назначенными
свойствами.

Полную версию скриптов можно скачать здесь
http://myfolder.ru/3351831

Примечание: К сожалению 3D Studio MAX «не дружит» с русскими комментариями в скриптах.
Из соображений совместимости они удалены из кода

#3D Studio MAX, #editor, #level, #MAX Script, #конкурс

9 августа 2007 (Обновление: 15 сен. 2007)

Комментарии [6]