Редактор карт
Создание редактора карт(для новичков). Сейчас я вас научю как создать простой но вполне многофункциональный редактор карт. Соственно начнем с азов. Напишем инициализацию главного окна: ;Сдесь находятся все глобальные переменные 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: Редактор карт
Просьба: если и пишеш туториал по редакторам, то пытайся учить тому как сделать нормальный редактор (например управление при помощи клавиш как то странно, мне оно кажется скорее дублирующим. Лучше использовать для маштабирования, перемещения и тп мышку).
|
Re: Редактор карт
да былобы здорово если это было выделено как алкоголик сказал
лучше в тег Коде ну и как сказали весь код в конце было норм! в целом все нормально! только не оч понятно зачем полный перебор можно через оюъект-хандел сделать! |
Re: Редактор карт
в целом, чисто туториал для копипастеров...
Глянь мой тутор, там йа чуть ли не каждую команду расписал ) И орфография с пунктуацией. 8) |
Re: Редактор карт
Это весь код:
Код:
|
Re: Редактор карт
Кое что новое узнал для себя. спс.
|
Re: Редактор карт
Продолжаем модифицировать редактор. Сейчас сделаем переключение текстур на стене. Для этого нам в типе MObject понадобится еще одна переменная в которой будет храниться путь к файлу текстуры. Собсно добавляем в MObject:
Field TP$ И после сих изменений тип MObject будет выглядить так: Type MObject Field Entity Field SX#,SY#,SZ# Field X#,Y#,Z# Field Picked Field TP$ End Type И еще одно в глобалах добавляем переменную для номера текстуры: Global tn Идем далее. Правим функцию деформации объектов(Deformation).Вписываем в эту ф-цию эти строчки кода: If KeyHit(20) Then tn=tn+1 End if |
Re: Редактор карт
Дальше:
If KeyHit(21) Then tn=tn-1 End if Это все нужно для выбора текстуры: нажимаем на T(англ) появляется следующая тектура. На Y предыдущая соответственно. Далее в главном цикле пишем. If m\picked=1 then if tn=1 then m\TP$ = "1.jpg" end if if tn=2 then m\TP$ = "2.jpg" end if entityTexture m\entity,LoadTexture(m\TP$) End if Вот этим куском у нас меняется текстура натянутая на выделенный объект. У нас для примера будет две текстурки. Возьмите любые JPG файлы и переименуйте их в 1 и 2, и собсно, киньте их в папку с редактором. |
Re: Редактор карт
Я бы например сделал массив текстур, а tn был бы его индексом... впрочем у автора другой подход
|
Re: Редактор карт
Дальше мы немного подправим функцию создания стены и функцию загрузки и сохранения карты. Чем мы сейчас и займемся. Для начала подправим ф-цию создания стены:
Function CreateStena(X#,Y#,Z#,P#,YA#,R#,SX#,SY#,SZ#,TP$) o.MObject=New MObject o\entity=CreateCube() o\TP$=TP$ PositionEntity o\entity,X#,Y#,Z# ScaleEntity o\entity,SX#,SY#,SZ# RotateEntity o\entity,P#,YA#,R# EntityPickMode o\entity,2 EntityTexture o\entity,LoadTexture(o\TP$) End Function Надо было лишь всего-то добавить две строчки кода. Первая (o\TP$=TP$) у нас отвечает за имя файла текстуры. Вторая (EntityTexture o\entity,LoadTexture(o\TP$)) отвечает за применение данной текстуры к объекту. А и еще в функции появился новый параметр - TP$ - это путь к файлу текстуры. Идем далее. Модифим сохранение карты: 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) WriteString file,m\TP$ Next Сдесь мы добавили одну строку которая отвечает за сохранение пути к файлу текстуры(TP$). Примечание: загружать данные из файла нужно в такой последовательности как они были записаны в файл( эт наверное применимо только к Блитцу). Далее - модифим загрузку карты: Function LoadMap(Path$) fil=ReadFile(Path$) ;Удаляем старые стены For m.MObject = each MObject FreeEntity m\entity Delete m 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) TP$=ReadString(file) CreateStena(X#,Y#,Z#,P#,YA#,R#,SX#,SY#,SZ#,Tp$) Wend End Function Вот тута тоже мы добавили одну строку которая отвечает за загрузку из файла строковой переменной TP$ куда записан путь к файлу текстуры. И добавили один новый парметр в функцию(CreateStena(X#,Y#,Z#,P#,YA#,R#,SX#,SY#,SZ# ,Tp$)) в данном случае TP$. Вот наш редактор теперь научился менять текстуры у объектов.:ok: |
Re: Редактор карт
Не хочу быть навязчивым, но воизбежании дальнейших вопросов "А почему я жму а нифега не происходит, или происходит но не так?".
А это т.к. проверка на нажатие кнопок у тебя происходит по пути, mr.DIMAS, Пожалуста! Присваивай в начале цикла все нажатия кнопок к переменным, и только потом юзай переменные, так ты избежишь много недочётов, увеличишь динамику в коде и новички будут учиться хорошему стилю. Спасибо! |
Re: Редактор карт
а у меня вообще не запускается, ошибки пигет, вот кен ай ду?????
|
Ответ: Редактор карт
Исправив пару ошибок в коде я смог запустить. Вот только че то ничего не работает... Даже не сохраняет.
|
Ответ: Редактор карт
было бы не плохо если бы автор скинул исходник !!)
|
Re: Редактор карт
изыни но исходник я потерял :( после очередной скриптовой чистки копма
|
Ответ: Редактор карт
Код кривой и не рабочий. Ужас просто.
|
Ответ: Редактор карт
Хороший код, позволяющий понять, как вообще можно написать примитивный редактор карт.
Цитата:
К слову, на этом редакторе карт основан мой редактор для игры, только сильно переделанный. Спасибо автору за старания. |
Ответ: Редактор карт
Код НЕ работает. Я тоже все ошибки исправил и программа запустилась, но она никаких объектов не расставляет.
|
Re: Редактор карт
Цитата:
|
Ответ: Редактор карт
выложите кто то тутор в рабочим и расписанным кодом, самому нужно научится сохранение и загрузку делать, а тут ниче не понятно.
|
Ответ: Редактор карт
Цитата:
ПОИСК |
Часовой пояс GMT +4, время: 08:51. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot