Давайте продолжим нашу работу. Итак, последний раз мы остановились на управлении. Наш игрок умеет передвигаться, сидеть, вертеться и взаимодействует с предметами. Теперь, начнем работу над уровнем. По сюжету, наш игрок застрял в доме, так что, сделаем дом. При помощи 3ds max'a, я сделал небольшую комнату, при помощи модификатора boolean из compound objects. В редакторе я дал имя этой комнате "map", затем, в комнате я разместил небольшой кубик и дал ему имя "player".
Примечание: Вам необязательно делать комнату самому, внизу я приаттачил все необходимые файлы, однако, лучше будет, если Вы немного попрактикуетесь.
Теперь, экспортируем всё это дело при помощи B3D Pipeline в папку с проектом и называем "map.b3d". Ну, и пожалуй, изменим функцию создания карты следующим образом:
Function InitScene()
map=xLoadAnimMesh("map.b3d")
End Function
Не забудьте добавить map в глобалы, в дальнейшем, нам это понадобится. Запускаем, и видим как наш игрок уходит в тьму. Теперь, мы с Вами приступим к самому вкусному, функции сортировки объектов в карте:
Function SortMapObjects(entity)
name$=xEntityName(entity)
If Instr(name,"player") Then
xPositionEntity player,xEntityX(entity),xEntityY(entity),xEntityZ(entity)
xHideEntity entity
EndIf
For i=0 To xCountChildren(entity)-1
SortMapObjects(xGetChild(entity,i))
Next
End Function
Также, мы немного изменим функцию InitScene():
Function InitScene()
map=xLoadAnimMesh("map.b3d")
SortMapObjects(map)
End Function
Примечание: Друзья, в своих кодах, я использую очень много отступов, дабы было легче в них разбираться, чего и Вам советую. С плохим стилем писания кода, с Вами трудно будет иметь общий проект. А хороший стиль кодирования, только повысит Вас в глазах Ваших одногруппников.
Здесь, мы используем рекурсию, и проверяем имена всех объектов в нашей карте, и если в имени содержится слово "player" (вспоминаем наш куб), то мы позиционируем нашего игрока в точке, где находится объект, и прячем сам объект. Однако, наш игрок продолжает падать. Для предотварщения этого, добавим коллизий в нашу игру. Для этого, мы создадим константы:
Const TypePlayer=1, TypeMap=2
И изменияем функции InitPlayer(), InitScene() и SortMapObjects(), как приведенно ниже:
Function InitPlayer()
player=xCreateSphere()
xEntityAlpha player,0
xEntityAddSphereShape player,10,1
xEntityType player,TypePlayer
camera=xCreateCamera(player)
End Function
Function InitScene()
light=xCreateLight()
map=xLoadAnimMesh("map.b3d")
SortMapObjects(map)
xCollisions TypePlayer,TypeMap,2,2
End Function
Function SortMapObjects(entity)
name$=xEntityName(entity)
If Instr(name,"player") Then
xPositionEntity player,xEntityX(entity),xEntityY(entity),xEntityZ(entity)
xHideEntity entity
EndIf
If Instr(name,"map") Then
xEntityType entity,TypeMap
EndIf
For i=0 To xCountChildren(entity)-1
SortMapObjects(xGetChild(entity,i))
Next
End Function
Примечание: В функции InitScene(), я добавил строчку создания света, чтобы легче было отличать стены.
Так, и что же мы сделали: в функции InitPlayer(), мы присвоили тип TypePlayer объекту player; в функции InitScene(), мы включили коллизию для объектов типа TypePlayer и TypeMap; и наконец-то, в функции SortMapObjects(), при нахождении объекта с именем "map", мы присвоили ему тип TypeMap. Так, теперь запускаем игру, и видим, что игрок не падает сквозь стены. Ждите продолжения!