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: Редактор карт
 
Просьба: если и пишеш туториал по редакторам, то пытайся учить тому как сделать нормальный редактор (например управление при помощи клавиш как то странно, мне оно кажется скорее дублирующим. Лучше использовать для маштабирования, перемещения и тп мышку).


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

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