forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Как взаимодействовать с миром? (http://forum.boolean.name/showthread.php?t=14311)

Drayfer 27.02.2011 15:32

Как взаимодействовать с миром?
 
Сделал я карту в 3Ds max 9, через пипелайн экспортировал в блитз, загрузил.
Так как первый раз делаю игру, то много еще не знаю. Кто может объяснить - как взаимодействовать с миром? Интересуют конкретно такие вопросы:

1. Как сделать так, чтобы подходишь к двери и она открывалась? Эти двери нужно сразу в максе на карте размещать? Как к ним обратиться?
2. Как сделать задания - типа нуно дойти до какой-то точки, если дошел, то появляется следующее такое задание? Как эти точки обозначать на карте в максе и как к ним в блитце обращаться?

Буду раз за подробные ответы! Хотелось, бы чтоб кто-то мне как нубу объяснил:) И еще желательно с примерами какими-то, или ссылками на конкретные уроки, если есть. Потому что на этом сейчас как раз заступорился....

Заранее огромное спасибо!;)

}{@KeR 27.02.2011 15:46

Ответ: Как взаимодействовать с миром?
 
1.Да эти двери надо размещать в этом твоём мире и в максе делать для них анимацию.....Например:
PHP код:

player=LoadMesh("Player.B3D")
dver=LoadAnimMesh("Dver.B3d")
...............
repeat
If EntityDistance(player,dver)<=100 Then
Animate dver
,.4
EndIf  
........
end 

И убирать коллизию с этой дверью...иначе непройдёт)))
2.Задания также через EntityDistance
Создаёшь Pivot (CreatePivot)
IF EntityDistance(player,pivot)<=100 then
Здесь задания
EndIF

Задания можно делать через команду Select(Про команду почитать в Blitze если ввести и нажать(F1))

Drayfer 27.02.2011 17:27

Ответ: Как взаимодействовать с миром?
 
Цитата:

Сообщение от }{@KeR (Сообщение 180769)
1.Да эти двери надо размещать в этом твоём мире и в максе делать для них анимацию.....Например:
PHP код:

player=LoadMesh("Player.B3D")
dver=LoadAnimMesh("Dver.B3d")
...............
repeat
If EntityDistance(player,dver)<=100 Then
Animate dver
,.4
EndIf  
........
end 

И убирать коллизию с этой дверью...иначе непройдёт)))

Что касается одной двери, то понял.
А если у меня на уровне этих дверей много, штук 50. Это что создавать файлы .b3d с анимацией для каждой двери? Или как делать?
Или как мне в программе обратиться именно к конкретной двери? чтоб только для нее убрать коллизию?

Цитата:

Сообщение от }{@KeR (Сообщение 180769)
2.Задания также через EntityDistance
Создаёшь Pivot (CreatePivot)
IF EntityDistance(player,pivot)<=100 then
Здесь задания
EndIF

Задания можно делать через команду Select(Про команду почитать в Blitze если ввести и нажать(F1))

А Pivot нужно будет создавать именно кодом? Нельзя ли как-то именно в максе расставить пивоты и потом в программе обращатся к ним?
Как это сделать? Если можно пример?

Nex 27.02.2011 18:02

Ответ: Как взаимодействовать с миром?
 
Цитата:

А если у меня на уровне этих дверей много, штук 50. Это что создавать файлы .b3d с анимацией для каждой двери? Или как делать?
Создаешь карту в 3дмаксе с расставленными объектами и загружаешь через LoadAnimMesh. Потом ищешь эти объекты через FindChild и далее допустим записываешь в тип и потом когда надо проигрываешь анимацию объекта.
Цитата:

А Pivot нужно будет создавать именно кодом?
В максе создаешь "Dummy" и его уже в блитзе ищешь.

FireOwl 27.02.2011 18:11

Ответ: Как взаимодействовать с миром?
 
1) Почитай про типы (type) - полезная штука. Создавай двери типами, в процессе загрузки уровня, а потом проверяй на расстояние каждую.
2) Я Point'ы тыкаю, но думаю разницы нет.
Вот приблизительно так:
Код:

Type door
        Field mesh
        Field state
End Type

door=LoadAnimMesh("door.b3d")
ExtractAnimSeq( mesh,0,50 )  ; sequence 1: дверь открылась   
ExtractAnimSeq( mesh,50,100 ) ; sequence 2: дверь закрылась  (числа зависят от анимации двери)
    ; меш уровня для разбиения на child'ы нужно загружать как animmesh
levelmesh=LoadAnimMesh("level1.b3d")

c=2              ; нужно пропустить первые два child'а, это что-то служебное
While c<CountChildren(levelmesh)
        child=GetChild(levelmesh,c)
        name$=EntityName(child)
        If Left$(name$,4)="Door" Then    ; проверка имени объекта данного в максе
                d.door=new door
                d\mesh=CopyEntity door
                d\state=1                    ; дверь закрыта, ввел на всякий аварийный
        EndIf
        c=c+1
Wend

; ; ; ; ;

Function UpdateDoors(player)        ; можно и в основной цикл влепить, разницы нет
        for d.door=each door
                if EntityDistance(player,d\mesh)<100 then
                        if d\state=1
                                Animate d\mesh,3,.4,1    ; открыть если игрок подошел
                                d\state=2
                        endif
                else
                        if d\state=2 then
                                Animate d\mesh,3,.4,2    ; закрыть если игрок отошел
                                d\state=1
                        endif
                EndIf
        Next
End Function

Код конечно не безгрешен и в нем наверняка куча мелких ошибок и его можно как то усовершенствовать.

Alex_Noc 27.02.2011 18:42

Ответ: Как взаимодействовать с миром?
 
херня все выше описанное - делаешь 1 дверь , делаешь текстовик с коордами . копируешь дверь и ставишь по точкам - прирост 300% производительности.
Анимацию двери лучше сделать в проге - по углам , пивот не забудь сместить к положению петель, на двери ставишь тип и пикмоде , если дистанция < 10 напрмиер то пикмоде на дверь включаем иначе убираем. если ткнули мышь - опредедлить тип в какой попали . если это дверь то если угол такой то тогда открыть или закрыть в зависимости от угла.(наращиваешь или делишь угол), таким образом ты опишешь сразу все двери в твоем мире а не каждую в отдельности - смотри в сторону систематизации

}{@KeR 27.02.2011 18:53

Ответ: Как взаимодействовать с миром?
 
Цитата:

Нельзя ли как-то именно в максе расставить пивоты и потом в программе обращатся к ним?
Как это сделать? Если можно пример?
Можно.....Создаёшь также в максе pivot....Даёшь каждому имена а потом их ищешь через FindChild


А что ты хочешь чтобы у тя было в примере?????

FireOwl 27.02.2011 19:05

Ответ: Как взаимодействовать с миром?
 
Alex_Noc, зато в моем примере можно наделать уникальных дверей с уникальными анимациями, не обязательно связанными с кручением. =)
Что касается пикмодов, я согласен.

Drayfer 27.02.2011 19:18

Ответ: Как взаимодействовать с миром?
 
FireOwl, то есть я так понимаю исходя из твоего примера:
Сначала создаем в максе и загружаем отдельно дверь:
door=LoadAnimMesh("door.b3d")
Потом создаем и загружаем уровень с уже установлеными дверями, такими же как door.b3d - так? или уровень должен быть без установленных дверей?
levelmesh=LoadAnimMesh("level1.b3d")

Потом в цикле проверяем уровень level1.b3d на чайлды по имени - door, если найден, то заменяем его на нашу анимированную дверь door.b3d. А дальше уже будем проигрывать анимацию при приближении игрока.
Так или я что-то не правильно понял?
Объясни, плиз, если не так....


P.S. чайлды - это имена объектов нашей сцены?

}{@KeR 27.02.2011 19:32

Ответ: Как взаимодействовать с миром?
 
Загрузи уровень с анимациями дверей
levelmesh=LoadAnimMesh("level1.b3d")
А потом в этом меше ищи чайлды и воиспроизводи анимацию когда тебе надо

Так делать не неадо
Цитата:

Сначала создаем в максе и загружаем отдельно дверь:
door=LoadAnimMesh("door.b3d")

Drayfer 27.02.2011 19:41

Ответ: Как взаимодействовать с миром?
 
Цитата:

Сообщение от }{@KeR (Сообщение 180806)
Загрузи уровень с анимациями дверей
levelmesh=LoadAnimMesh("level1.b3d")
А потом в этом меше ищи чайлды и воиспроизводи анимацию когда тебе надо

1.То есть и двери и сам уровень должны быть в одном файле?
И это получается для каждой сделанной двери на уровне нужно делать анимацию? или для какой-то одной? как это сделать - просто не в курсе

2. когда будет воспроизводиться анимация - будет открываться только одна дверь или все на уровне?

Alex_Noc 27.02.2011 19:54

Ответ: Как взаимодействовать с миром?
 
что тебе в моем случае мешает сделать уникальность ?))

}{@KeR 27.02.2011 19:58

Ответ: Как взаимодействовать с миром?
 
Цитата:

1.То есть и двери и сам уровень должны быть в одном файле?
И это получается для каждой сделанной двери на уровне нужно делать анимацию? или для какой-то одной? как это сделать - просто не в курсе

2. когда будет воспроизводиться анимация - будет открываться только одна дверь или все на уровне?
если одним файлом...время на размещение дверей мало уйдёт, зато писонины много будет

1.Смотри создаёшь уровень со своими дверями
Делаешь анимацию для каждой двери
Эту каждую дверь Именуешь
2.Потом через FindChild ищешь эти двери в своём уровне

Например:
PHP код:

level_1=LoadAnimMesh("Test.B3D")
............
IF 
child=FindChild(level_1,"Dver_1"Then
    
IF EntityDistance(player,child)<=100 then
        animate child
,.4
    
EndIF
EndIF 

P.S. Примерно вот так

}{@KeR 27.02.2011 21:02

Ответ: Как взаимодействовать с миром?
 
Вот тебе пример радара

PHP код:

Graphics3D 800,600
SetBuffer BackBuffer
()


Global 
camera CreateCamera()
CameraRange camera,0.1,1000

Global light CreateLight()

Global 
radar CreateSphere(5)
EntityParent radar,camera
ScaleEntity radar
,0.2,0.2,0.01
PositionEntity radar
,0.7,-0.3,1
EntityFX radar
,1
EntityColor radar
,100,100,255

Global player_radar_ent CreateSphere()
EntityParent player_radar_ent,radar
ScaleEntity player_radar_ent
,0.05,0.05,0.05
PositionEntity player_radar_ent
,0,0,-2
EntityFX player_radar_ent
,1

Type entity
    Field ent
    Field radar_ent
    Field e_type 
playerenemy
End Type


For loop 1 To 20
    e
.entity = New entity
    e
\ent CreateCube()
    
e\radar_ent CreateCube()
    
EntityParent e\radar_ent,radar
    EntityFX e
\radar_ent,1
    ScaleEntity e
\radar_ent,0.05,0.05,0.05
    PositionEntity e
\ent,Rnd(-20,20),0,Rnd(-20,20)
    
HideEntity e\radar_ent
Next



While Not KeyHit(1)



    If 
KeyDown(200Then MoveEntity camera,0,0,0.1
    
If KeyDown(208Then MoveEntity camera,0,0,-0.1
    
If KeyDown(203Then TurnEntity camera,0,1,0
    
If KeyDown(205Then TurnEntity camera,0,-1,0
    
    updateradar
()
    
UpdateWorld
    RenderWorld
    Flip
Wend
End

Function updateradar()

    For 
e.entity Each entity
        
If EntityDistance#(e\ent,camera) < 10 Then
            
ShowEntity e\radar_ent
            x_dif
# = EntityX(e\ent,True) - EntityX(camera,True)
            
z_dif# = EntityZ(e\ent,True) - EntityZ(camera,True)
            
PositionEntity e\radar_ent,x_dif/10,z_dif/10,-1
        
Else
            
HideEntity e\radar_ent
        End 
If
    
Next
    
End 
Function 


Alex_Noc 27.02.2011 23:04

Ответ: Как взаимодействовать с миром?
 
а коолизии будут работать? с таким методом дверей)))) ВРЯДЛЕ


Часовой пояс GMT +4, время: 21:41.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot