Показать сообщение отдельно
Старый 20.09.2007, 20:15   #1
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Сообщение Редактор карт

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

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

(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
Android (15.12.2009), Blender (24.01.2010), EvilChaotic (22.07.2009), Gide_ (22.02.2009), Ziro(AL) (09.03.2010)