forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Редактор карт (http://forum.boolean.name/showthread.php?t=4506)

mr.DIMAS 20.09.2007 20:15

Редактор карт
 
Создание редактора карт(для новичков).
Сейчас я вас научю как создать простой но вполне многофункциональный редактор карт.
Соственно начнем с азов. Напишем инициализацию главного окна:

;Сдесь находятся все глобальные переменные
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
Продолжение завтра

Данил 20.09.2007 20:22

Re: Редактор карт
 
Нехватает функции управления объектом.. ну разместил ты объект - кубик ... а как повернуть его, растянуть, сжать... удалить, в конце концов...

Кстати, делал уже на подобие редактор свой. если кому надо, могу дать исходник.

dimanche13 20.09.2007 20:37

Re: Редактор карт
 
Мне новичку - ни фига не понятно... я опомниться не успел и вникнуть что к чему, а уже сохранение и загрузка... "помедленней пжлста, я записываю"

moka 20.09.2007 20:51

Re: Редактор карт
 
Имхо хорошая тема, но не расскрыл ты темы редактора.
Во первыйх как уже сказали нету модифицирования (редактор - тот что изменяет).
Далее как тоже подметили, нехватка комментов. Т.к. тема для новичков, относительно помменть участки кода.
А вообще нужно развить будет Очень полезно.

mr.DIMAS 20.09.2007 22:17

Re: Редактор карт
 
Цитата:

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

Данил 20.09.2007 22:19

Re: Редактор карт
 
а...а.а...А при чем тут мой редактор???

mr.DIMAS 20.09.2007 22:24

Re: Редактор карт
 
НЕ прычем. просто случайно не ту цитату выбрал

NitE 20.09.2007 23:46

Re: Редактор карт
 
тема прикольеная прочитал статью ради интереса и ... ну и все, мне понравилось )) думаю всем кто неумеет будет очень интересно и позновательно ))))

mr.DIMAS 21.09.2007 20:53

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:

mr.DIMAS 21.09.2007 20:54

Re: Редактор карт
 
Млин тупой смайл 8) кусочек кода испортил

Trilliput 21.09.2007 21:05

Re: Редактор карт
 
Ммм.. Выкладывай в конце целый код.

Данил 21.09.2007 21:14

Re: Редактор карт
 
1. как уже сказали, полный код
2. Продолжение будет????

dimanche13 21.09.2007 21:14

Re: Редактор карт
 
Не плохо было б объяснять что мы делаем,и как делаем, а то "напишите так и будет вам счастье"...

alcoSHoLiK 21.09.2007 21:18

Re: Редактор карт
 
mr.DIMAS
Обрамляй код тегом [ code ] [ /code]. Он смайлы режет.

Trilliput 21.09.2007 21:26

Re: Редактор карт
 
Просьба: если и пишеш туториал по редакторам, то пытайся учить тому как сделать нормальный редактор (например управление при помощи клавиш как то странно, мне оно кажется скорее дублирующим. Лучше использовать для маштабирования, перемещения и тп мышку).

Horror 21.09.2007 21:33

Re: Редактор карт
 
да былобы здорово если это было выделено как алкоголик сказал
лучше в тег Коде
ну и как сказали весь код в конце было норм!

в целом все нормально!
только не оч понятно зачем полный перебор
можно через оюъект-хандел сделать!

Данил 21.09.2007 21:39

Re: Редактор карт
 
в целом, чисто туториал для копипастеров...

Глянь мой тутор, там йа чуть ли не каждую команду расписал )

И орфография с пунктуацией. 8)

mr.DIMAS 23.09.2007 19:03

Re: Редактор карт
 
Это весь код:

Код:


Type MObject
Field Entity
Field SX#,SY#,SZ#
Field X#,Y#,Z#
Field Picked
End Type
 
 
;Сдесь находятся все глобальные переменные
Global camera
Global world
 
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
 
camera=CreateCamera()
PositionEntity camera,0,5,0
 
world=CreatePlane()
EntityPickMode world,2
 
Repeat
For m.mobject = Each Mobject
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
 
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
If KeyHit(64) Then WriteMap("map.shm") ;F6
If KeyHit(65) Then LoadMap("map.shm") ;F7
Next
RenderWorld
Text MouseX(),MouseY(),"^"
Flip
Until KeyHit(1)
End
 
 
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
 
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
 
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


magpro 23.09.2007 19:35

Re: Редактор карт
 
Кое что новое узнал для себя. спс.

mr.DIMAS 24.09.2007 16:57

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

mr.DIMAS 24.09.2007 17:13

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, и собсно, киньте их в папку с редактором.

dimanche13 24.09.2007 17:18

Re: Редактор карт
 
Я бы например сделал массив текстур, а tn был бы его индексом... впрочем у автора другой подход

mr.DIMAS 24.09.2007 17:28

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:

moka 24.09.2007 19:05

Re: Редактор карт
 
Не хочу быть навязчивым, но воизбежании дальнейших вопросов "А почему я жму а нифега не происходит, или происходит но не так?".
А это т.к. проверка на нажатие кнопок у тебя происходит по пути, mr.DIMAS, Пожалуста! Присваивай в начале цикла все нажатия кнопок к переменным, и только потом юзай переменные, так ты избежишь много недочётов, увеличишь динамику в коде и новички будут учиться хорошему стилю. Спасибо!

kortesfil 24.09.2007 22:02

Re: Редактор карт
 
а у меня вообще не запускается, ошибки пигет, вот кен ай ду?????

Nex 20.01.2009 12:25

Ответ: Редактор карт
 
Исправив пару ошибок в коде я смог запустить. Вот только че то ничего не работает... Даже не сохраняет.

mumo1991 25.01.2009 23:55

Ответ: Редактор карт
 
было бы не плохо если бы автор скинул исходник !!)

mr.DIMAS 31.01.2009 19:12

Re: Редактор карт
 
изыни но исходник я потерял :( после очередной скриптовой чистки копма

Gide_ 22.02.2009 08:45

Ответ: Редактор карт
 
Код кривой и не рабочий. Ужас просто.

Nuprahtor 22.02.2009 13:21

Ответ: Редактор карт
 
Хороший код, позволяющий понять, как вообще можно написать примитивный редактор карт.
Цитата:

Исправив пару ошибок в коде я смог запустить. Вот только че то ничего не работает... Даже не сохраняет.
Хмм, после исправления всех ошибок программа стала нормально работать и все записывать.
К слову, на этом редакторе карт основан мой редактор для игры, только сильно переделанный.
Спасибо автору за старания.

Gide_ 23.02.2009 06:54

Ответ: Редактор карт
 
Код НЕ работает. Я тоже все ошибки исправил и программа запустилась, но она никаких объектов не расставляет.

mr.DIMAS 23.02.2009 10:25

Re: Редактор карт
 
Цитата:

Код кривой и не рабочий. Ужас просто.
Сейчас все изменилось - теперь пишу правильно и красиво

is.SarCasm 12.08.2009 11:22

Ответ: Редактор карт
 
выложите кто то тутор в рабочим и расписанным кодом, самому нужно научится сохранение и загрузку делать, а тут ниче не понятно.

IGR 12.08.2009 14:17

Ответ: Редактор карт
 
Цитата:

самому нужно научится сохранение и загрузку делать, а тут ниче не понятно.
давай я поищу за тебя на булке !!
ПОИСК


Часовой пояс GMT +4, время: 19:07.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot