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

Давайте продолжим нашу работу. Итак, последний раз мы остановились на управлении. Наш игрок умеет передвигаться, сидеть, вертеться и взаимодействует с предметами. Теперь, начнем работу над уровнем. По сюжету, наш игрок застрял в доме, так что, сделаем дом. При помощи 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=1TypeMap=
И изменияем функции 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. Так, теперь запускаем игру, и видим, что игрок не падает сквозь стены. Ждите продолжения!
Вложения
Тип файла: rar Quest.rar (19.0 Кб, 946 просмотров)

Последний раз редактировалось Hurrit, 09.06.2010 в 23:09.
(Offline)
 
Ответить с цитированием
Эти 8 пользователя(ей) сказали Спасибо Hurrit за это полезное сообщение:
baton4ik (08.06.2010), Harter (11.07.2010), Mhyhr (08.06.2010), Nex (14.06.2010), pax (28.07.2010), Randomize (08.06.2010), St_AnGer (08.06.2010), viper86 (21.07.2010)