Показать сообщение отдельно
Старый 09.06.2010, 23:08   #5
Hurrit
Мастер
 
Аватар для Hurrit
 
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений
(для 2,207 пользователей)
Ответ: Делаем квест на Xors3D

Итак, продолжим. Теперь, когда "фундамент" игры готов, давайте добавим больше деталей для нашего сюжета. По сюжету, игрок должен выбраться из дома, а теперь как он это будет делать. Во-первых, дом сделаем двухкомнатным. Игрок появляется в первой комнате, в которой будет находится тумбочка с двумя выдвижными полочками. В первом полочке будет лежать ключ от двери, ведущей во вторую комнату. Во второй комнате, на стене будет небольшой двухдверный шкафчик, в котором будет лежат батарейка. На стене, во второй комнате, будет небольшой механизм, в который можно будет вставлять батарейку. Как только батарейка будет вставлена, в первой комнате, у нас будет открываться скрытый сейф в стене, в которой будет лежать ключ от выхода из дома. При выходе, будет появляться надпись "Game Over". Вот и весь сюжетик и квесты. Теперь, приступим к теории, как мы будем воплощать всё это в игру.

Когда я писал свой первый квест, то я много думал о том, как бы избавиться от необходимости прописывать все квесты в коде, и меня осенила прекрасная (на мой взгляд) идея: ведь можно всё прописать в 3ds max, а игру просто научить правильно "читать" карту. Вот как мы поступим: в 3ds max'е, мы в имена будем записывать свойства объекта, а потом уже через код, присваивать эти самые свойства. Вот из чего будут состоять имена:
1 - Первые три буквы будут "obj", чтобы мы знали, что с этим объектом можно работать.
2 - Затем будет идти цифра, которая будет говорить, с каким типом объекта мы имеем дело. Всего таких будет типов будет 5.
3 - Здесь будет хранится ID объекта, для взаимодействия с другими объектами. ID будет состоять из трех цифр, начиная с 001.


Остальные свойства зависят от типа объекта. Давайте, их расмотрим:
Тип 1 - Это будут предметы, к которым ничего не надо применять и которые нельзя брать. В нашем случае, к этим объектам относятся выдвижные полочки и дверцы шкафчика. Дополнительных свойств у этого типа объектов нету.
Тип 2 - Данный тип будет у предметов, которые можно подбирать. В нашем случае - это ключи и батарейка. Дополнительное свойство у этих объектов один: ID родителя. Это нужно для того, чтобы объект двигался вместе с родителем, к примеру выдвигался вместе с полочкой тумбочки.
Тип 3 - Объекты к которым надо применять подобранные предметы. К примеру двери, которые открываются при помощи ключей. Дополнитьное свойство у этих объектов, это ID предмета, который надо к ним применить.
Тип 4 - К этому типу объектов будут относиться те, от которых зависят ещё одни предметы, и к которым надо применять вещи. К примеру, механизм в который надо вставить батарейку, после чего откроется сейф. Дополнительные свойства у этого объекта будут ID предмета, который надо к ним применить, и после него будет идти ID предмета, который надо активировать. Последним свойством будет ID предмета, который надо показать. В нашем случае ID батарейки, которая будет заранее вставлена в механизм и спрятана.
Тип 5 - Предпоследний тип объектов будет относиться к тем предметам, которые зависят от объектов 4 типа. В нашем случае это сейф. Дополнительных свойств нету.
Тип 6 - Вот и добрались мы до последнего типа. Объекты, которые надо показать, в случае активации объектов 4 типа, это тип 6. Дополнительных свойств нету.


Звучит сложно, давайте попытаюсь обяснить на примере: есть у нас на карте ключ и дверь, которая откроется после того, как на ней будет использован ключ. Мы даем имя ключу "obj2001000", где:
obj - обозначение того, что мы работаем с используемым объектом.
2 - тип объекта.
001 - ID объекта.
000 - ID родителя (в данном случае, у объекта нету родителя).

А двери мы даем имя "obj3002001", где:
obj - обозначение того, что мы работаем с используемым объектом.
3 - тип объекта.
002 - ID объекта.
001 - ID объекта, который необходим для открытия двери.


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

Примечание: Запомните, перед экспортом, желательно всегда применять ResetXForm на вкладке Utilities.

Теперь, когда всё готово, давайте изменим функцию SortMapObjects():

Function SortMapObjects(entity)
	name$=xEntityName(entity)
	
	If Instr(name,"player") Then
		xPositionEntity player,xEntityX#(entity),xEntityY#(entity),xEntityZ#(entity)
		xResetEntity player
		xHideEntity entity
	EndIf
	
	If Instr(name,"map") Then
		xEntityType entity,TypeMap
	EndIf
	
	If Instr(name,"obj") Then
		object_type=Int(Mid(name,4,1))
		object_id=Int(Mid(name,5,3))
				obj(object_id)=New properties
				obj(object_id)\entity=entity
		Select object_type ; Здесь, мы получаем тип объекта
			Case 2
				obj(object_id)\id_parent=Int(Mid(name,8,3))
			Case 3
				obj(object_id)\id_object=Int(Mid(name,8,3))	
			Case 4
				obj(object_id)\id_object=Int(Mid(name,8,3))	
				obj(object_id)\id_child1=Int(Mid(name,11,3))	
				obj(object_id)\id_child2=Int(Mid(name,14,3))	
		End Select
	EndIf
	
	For i=0 To xCountChildren(entity)-1
		SortMapObjects(xGetChild(entity,i))
	Next
End Function
И не забудьте добавить массив obj и тип properties, в которых будут хранится все данные об объектах:

Dim obj.properties(999)

Type properties
    Field entity
obj_type
    Field id_parent
id_objectid_child1id_child2
End Type 
Примечание: Учитывая советы форумчан и некоторые перемены в карте, мне пришлось изменить функцию UpdatePlayer():

Function UpdatePlayer()
    
mxspd#=xMouseXSpeed()*0.05 ; Получаем координаты передвижения мышки по Х
    
myspd#=xMouseYSpeed()*0.05 ; Получаем координаты передвижения мышки по Y
    
    
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/Передвигаем мышку в центр окна
    
If xEntityPitch(camera)+myspd<-89 xRotateEntity camera,-89,0,Проверяем угол поворота камеры по X
    
If xEntityPitch(camera)+myspd>89 xRotateEntity camera,89,0,Проверяем угол поворота камеры по X
    xRotateEntity camera
,xEntityPitch(camera)+myspd,0,Поворачиваем камеру по X
    xRotateEntity player
,0,xEntityYaw(player)-mxspd,Поворачиваем камеру по Y
    
    
If xKeyDown(KEY_WxMoveEntity player,0,0,0.5
    
If xKeyDown(KEY_SxMoveEntity player,0,0,-0.5
    
If xKeyDown(KEY_AxMoveEntity player,-0.5,0,0
    
If xKeyDown(KEY_DxMoveEntity player,0.5,0,0
    
    Select xKeyDown
(KEY_LCONTROL)
        Case 
True
            xPositionEntity camera
,0,5,0
            
        
Case False
            xPositionEntity camera
,0,15,0
    End Select
End 
Function 
Вложения
Тип файла: rar Quest.rar (159.7 Кб, 916 просмотров)
(Offline)
 
Ответить с цитированием
Эти 11 пользователя(ей) сказали Спасибо Hurrit за это полезное сообщение:
Артем Валерьевич (08.07.2010), baton4ik (10.06.2010), drave (10.06.2010), Dream (10.06.2010), Gector (29.05.2012), Harter (11.07.2010), Nex (14.06.2010), pax (28.07.2010), Randomize (10.06.2010), St_AnGer (10.06.2010), viper86 (21.07.2010)