Редактор карт
Создание редактора карт(для новичков). Сейчас я вас научю как создать простой но вполне многофункциональный редактор карт. Соственно начнем с азов. Напишем инициализацию главного окна: ;Сдесь находятся все глобальные переменные Global camera Global world Graphics3D 1024,768,32,1 SetBuffer BackBuffer() camera=CreateCamera() PositionEntity camera,0,5,0 world=CreatePlane() EntityPickMode world,2 Repeat RenderWorld Flip Until KeyHit(1) End Это так сказать заготовка нашего редактора. Сдесь глобально объявлены переменные camera(для камеры соответственно), world(естественно для мира). Наш редактор будет создавать все объекты на плоскости. У мира я поставил EntityPickMode равным 2 это для того чтобы Pick осуществлялся посредством полигонов. Поехали дальше. Дальше надо создать тип для объектов на карте, он у нас будет называться MObject. Вот его объявление: Type MObject Field Stena End Type Этот тип содержит пока единственный параметр - Stena. Дальше напишем ф-цию создания той самой стены. Вот ее объявление: Function CreateStena(X#,Y#,Z#,P#,YA#,R#,SX#,SY#,SZ#) o.MObject=New MObject o\entity=CreateCube() PositionEntity o\entity,X#,Y#,Z# ScaleEntity o\entity,SX#,SY#,SZ# RotateEntity o\entity,P#,YA#,R# EntityPickMode o\entity,2 End Function Эта ф-ция создает новый объект MObject который в свою очередь заполняется, нужными параметрами. У-У-У-Ф... А у функции то параметров не мало. Первые три это координаты в простанстве, вторые три угол наклона по осям XYZ, и последние три это размер стены по XYZ. А теперь в главном цикле пропишем следующее: pik=CameraPick(camera,MouseX(),Mouse()) If pik = world Then If MouseHit(1) Then CreateStena(PickedX(),PickedY(),PickedZ(),0,0,0,0. 5,2,2) End If End If Этот кусок кода выполняет функцию создания новой стены. Ее позиция будет такой куда вы ткнули мышкой по плоскости. Ой чуть не забыл. Надо просписать четыре строчки коды для управления движением камеры(эти строчки прописываем в главном цикле): If KeyDown(200) Then MoveEntity camera,0,0,.1 If KeyDown(208) Then MoveEntity camera,0,0,-.1 If KeyDown(203) Then MoveEntity camera,.1,0,0 If KeyDown(205) Then MoveEntity camera,-.1,0,0 Далее надо еще кое-что ниписать в главном цикле - движение указателя мыши. Естественно пишем(После RenderWorld, но перед Flip): Text MouseX(),MouseY(),"^" Вот теперь указатель мыши готов к употреблению :-D . Дальше самое интересное... ЗАГРУЗКА И СОХРАНЕНИЕ КАРТЫ. Ну а теперь напишем две функции - одну для загрузки другую для сохрания. Сохрание: Function WriteMap(Path$) file=WriteFile(Path$) For m.MObject = Each MObject WriteFloat file,EntityX(m\entity) WriteFloat file,EntityY(m\entity) WriteFloat file,EntityZ(m\entity) WriteFloat file,EntityPitch(m\entity) WriteFloat file,EntityYaw(m\entity) WriteFloat file,EntityRoll(m\entity) WriteFloat file,MeshWidth(m\entity) WriteFloat file,MeshHeight(m\entity) WriteFloat file,MeshDepth(m\entity) Next End Function Загрузки: Function LoadMap(Path$) fil=ReadFile(Path$) ;Удаляем старые стены For m.MObject = each MObject Next While Not Eof(file) X#=ReadFloat(File) Y#=ReadFloat(File) Z#=ReadFloat(File) P#=ReadFloat(File) YA#=ReadFloat(File) R#=ReadFloat(File) SX#=ReadFloat(File) SY#=ReadFloat(File) SZ#=ReadFloat(File) CreateStena(X#,Y#,Z#,P#,YA#,R#,SX#,SY#,SZ#) Wend End Function Ну а затем в цикле пропишем следующие строки кода для загрузки и сохранения карты. If KeyHit(64) Then WriteMap("map.shm") ;F6 If KeyHit(65) Then LoadMap("map.shm") ;F7 Продолжение завтра |
Re: Редактор карт
Нехватает функции управления объектом.. ну разместил ты объект - кубик ... а как повернуть его, растянуть, сжать... удалить, в конце концов...
Кстати, делал уже на подобие редактор свой. если кому надо, могу дать исходник. |
Re: Редактор карт
Мне новичку - ни фига не понятно... я опомниться не успел и вникнуть что к чему, а уже сохранение и загрузка... "помедленней пжлста, я записываю"
|
Re: Редактор карт
Имхо хорошая тема, но не расскрыл ты темы редактора.
Во первыйх как уже сказали нету модифицирования (редактор - тот что изменяет). Далее как тоже подметили, нехватка комментов. Т.к. тема для новичков, относительно помменть участки кода. А вообще нужно развить будет Очень полезно. |
Re: Редактор карт
Цитата:
|
Re: Редактор карт
|
Re: Редактор карт
НЕ прычем. просто случайно не ту цитату выбрал
|
Re: Редактор карт
тема прикольеная прочитал статью ради интереса и ... ну и все, мне понравилось )) думаю всем кто неумеет будет очень интересно и позновательно ))))
|
Re: Редактор карт
Идем дальше. Сосбсно сейчас мы научимся масштабировать, двигать объекты.
Для этого всего расширяем тип MObject. Type MObject Field Entity Field SX#,SY#,SZ# Field X#,Y#,Z# Field Picked End Type Все эти обновления нужны для того что я выше перечислил, а параметр Picked нужен для того чтобы проверять выбран ли объект или нет. Едем далее. Создаем ф-цию масштабирования и движения. Function Deformation() For m.mobject=Each Mobject If m\picked=1 Then If KeyDown(2) Then ScaleEntity m\entity,MeshWidth(m\entity)+0.01,MeshHeight(m\ent ity),MeshDepth(m\entity) End If If KeyDown(3) Then ScaleEntity m\entity,MeshWidth(m\entity)-0.01,MeshHeight(m\entity),MeshDepth(m\entity) End If If KeyDown(4) Then ScaleEntity m\entity,MeshWidth(m\entity),MeshHeight(m\entity)+ .01,MeshDepth(m\entity) End If If KeyDown(5) Then ScaleEntity m\entity,MeshWidth(m\entity),MeshHeight(m\entity)-.01,MeshDepth(m\entity) End If If KeyDown(6) Then ScaleEntity m\entity,MeshWidth(m\entity),MeshHeight(m\entity), MeshDepth(m\entity)+.01 End If If KeyDown(7) Then ScaleEntity m\entity,MeshWidth(m\entity),MeshHeight(m\entity)-.01,MeshDepth(m\entity)-0.01 End If If KeyDown(8) Then PositionEntity m\entity,EntityX(m\entity)+0.01,EntityY(m\entity), EntityZ(m\entity) End If If KeyDown(9) Then PositionEntity m\entity,EntityX(m\entity)-0.01,EntityY(m\entity),EntityZ(m\entity) End If If KeyDown(10) Then PositionEntity m\entity,EntityX(m\entity),EntityY(m\entity)+0.01, EntityZ(m\entity) End If If KeyDown(11) Then PositionEntity m\entity,EntityX(m\entity),EntityY(m\entity)-0.01,EntityZ(m\entity) End If If KeyDown(12) Then PositionEntity m\entity,EntityX(m\entity),EntityY(m\entity),Entit yZ(m\entity)-.01 End If If KeyDown(13) Then PositionEntity m\entity,EntityX(m\entity),EntityY(m\entity),Entit yZ(m\entity)+.01 End If End If Next End Function Вот. Млин правда управление кривее не придумаешь... ну да ладно... сейчас я разъясню усё... короче клавиши наверху(те что от 1-7) управляют масштабированием объекта, а от 7 до = (включительно) передвижение. Ой ёмаё. Чуть не забыл надо подправить коечто в главном цикле. Вот после этого pik=CameraPick(camera,MouseX(),Mouse()) If pik = world Then If MouseHit(1) Then CreateStena(PickedX(),PickedY(),PickedZ(),0,0,0,0. 5,2,2) End If End If Пишем вот это: If pik=m\entity then m\picked=1-m\picked End if И в начале цикла пишем: For m.mobject = Each Mobject И в конце перед RenderWorld: Next Ну вот редактор у нас расширился. :super: |
Re: Редактор карт
Млин тупой смайл 8) кусочек кода испортил
|
Re: Редактор карт
Ммм.. Выкладывай в конце целый код.
|
Re: Редактор карт
1. как уже сказали, полный код
2. Продолжение будет???? |
Re: Редактор карт
Не плохо было б объяснять что мы делаем,и как делаем, а то "напишите так и будет вам счастье"...
|
Re: Редактор карт
mr.DIMAS
Обрамляй код тегом [ code ] [ /code]. Он смайлы режет. |
Re: Редактор карт
Просьба: если и пишеш туториал по редакторам, то пытайся учить тому как сделать нормальный редактор (например управление при помощи клавиш как то странно, мне оно кажется скорее дублирующим. Лучше использовать для маштабирования, перемещения и тп мышку).
|
Часовой пояс GMT +4, время: 07:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot