Мастер
Регистрация: 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_object, id_child1, id_child2 End Type
Примечание: Учитывая советы форумчан и некоторые перемены в карте, мне пришлось изменить функцию UpdatePlayer():
Function UpdatePlayer() mxspd#=xMouseXSpeed()*0.05 ; Получаем координаты передвижения мышки по Х myspd#=xMouseYSpeed()*0.05 ; Получаем координаты передвижения мышки по Y xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2 ; Передвигаем мышку в центр окна If xEntityPitch(camera)+myspd<-89 xRotateEntity camera,-89,0,0 ; Проверяем угол поворота камеры по X If xEntityPitch(camera)+myspd>89 xRotateEntity camera,89,0,0 ; Проверяем угол поворота камеры по X xRotateEntity camera,xEntityPitch(camera)+myspd,0,0 ; Поворачиваем камеру по X xRotateEntity player,0,xEntityYaw(player)-mxspd,0 ; Поворачиваем камеру по Y If xKeyDown(KEY_W) xMoveEntity player,0,0,0.5 If xKeyDown(KEY_S) xMoveEntity player,0,0,-0.5 If xKeyDown(KEY_A) xMoveEntity player,-0.5,0,0 If xKeyDown(KEY_D) xMoveEntity 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
|