Создание редактора карт(для новичков).
Сейчас я вас научю как создать простой но вполне многофункциональный редактор карт.
Соственно начнем с азов. Напишем инициализацию главного окна:
;Сдесь находятся все глобальные переменные
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(20
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(),"^"
Вот теперь указатель мыши готов к употреблению
.
Дальше самое интересное...
ЗАГРУЗКА И СОХРАНЕНИЕ КАРТЫ.
Ну а теперь напишем две функции - одну для загрузки другую для сохрания.
Сохрание:
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
Продолжение завтра