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

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

}{@KeR 27.02.2011 23:08

Ответ: Как взаимодействовать с миром?
 
Ну да кажись лучше создать уровень отдельно......двери отдельно с анимацией и это всё с компоновать

Alex_Noc 28.02.2011 00:18

Ответ: Как взаимодействовать с миром?
 
ПРОВЕРЬ КОЛИЗИИИ НА ТВОИХ ДВЕРЯХ ВО ВРЕМЯ ОТКРЫВАНИЯ И ЗАКАРЫВАНИЯ!!!!!

Program23 28.02.2011 17:20

Ответ: Как взаимодействовать с миром?
 
Лучше найди платные уроки с http://www.blitz-school.info/ ,по Blitz3d.Там все эти вопросы подробно описываются.

Drayfer 12.03.2011 21:35

Ответ: Как взаимодействовать с миром?
 
Вложений: 1
Цитата:

Сообщение от Program23 (Сообщение 180916)
Лучше найди платные уроки с http://www.blitz-school.info/ ,по Blitz3d.Там все эти вопросы подробно описываются.

Да уроки эти у меня есть. Но там открытие двери - на основе программного вращения объекта происходит, а не на основе анимации.

А вот как это сделать именно на основе анимации, так и не понял.

Вот например, если в максе делать... нужно использовать именно костную анимацию? т.е. привязывать саму дверь к кости или как?
Допустим я так делаю для ол=дной двери, остальные двери просто копирую... Но ведь при проигрывании анимации потом в игре - будет проигрываться анимация для всех дверей на уровне или как?

Так и не понял как это реализовать? может будет у кого-то время - покажете как это делается на конкретной сценке....
Вот например на этой во вложении (там стена в которой есть двери), может подстроете сцену так как нужно и напишите работающей код, например - подходишь к конкретной двери и она открывается.

Заранее огромное спасибо! т.к. сам я не могу понять как и что там делается с это анимацией. Сейчас проблема именно в этих дверях и хотелось бы открывание сделать именно на основе анимации, а не программного вращения двери....

maxturbo 12.03.2011 22:35

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

Сообщение от Drayfer (Сообщение 182547)
Да уроки эти у меня есть. Но там открытие двери - на основе программного вращения объекта происходит, а не на основе анимации.

А вот как это сделать именно на основе анимации, так и не понял.

Вот например, если в максе делать... нужно использовать именно костную анимацию? т.е. привязывать саму дверь к кости или как?
Допустим я так делаю для ол=дной двери, остальные двери просто копирую... Но ведь при проигрывании анимации потом в игре - будет проигрываться анимация для всех дверей на уровне или как?

Так и не понял как это реализовать? может будет у кого-то время - покажете как это делается на конкретной сценке....
Вот например на этой во вложении (там стена в которой есть двери), может подстроете сцену так как нужно и напишите работающей код, например - подходишь к конкретной двери и она открывается.

Заранее огромное спасибо! т.к. сам я не могу понять как и что там делается с это анимацией. Сейчас проблема именно в этих дверях и хотелось бы открывание сделать именно на основе анимации, а не программного вращения двери....

В помощь тебе справка Blitz3D и функции такие как FindChild, LoadAnimMesh...
Вот тебе урок как надо экспортировать с 3D Max'a
А вот тебе Все хорошие уроки и примеры на Blitz3D
Заливал я их давно, но уроков там достаточно+примеры имеются...
Дерзай :)

maxturbo 12.03.2011 22:56

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

Сообщение от Drayfer (Сообщение 182547)
Вот например на этой во вложении (там стена в которой есть двери), может подстроете сцену так как нужно и напишите работающей код, например - подходишь к конкретной двери и она открывается.

Чего там понимать то особо?? :)
Blitz3D работает можно сказать весь на условиях, подошел взорвался, подошел открылась. Больше фантазии надо иметь :)
С примером и с дверью, напишу как можно меньше и попытаюсь втолковать :)
Обойтись можно и без анимации если это двери....
Когда в 3D Max создаешь комнату, а по середине стены будет проем и дверь, то пивота двери смещаешь к краю двери. Блин как объяснить даже не знаю...Короче почитаешь про макс поймешь о чем я, если ты это сделал то получается когда ты в максе будешь ее вращать то видно будет уже что она открывается как дверь, далее експортируешь модель, получаем два дочерных объекта у модели это дверь пусть будет (door) и комната (komnata)
Далее загружаем это все в Blitz3D
И пишем
Код:

Graphics3D 640,480,32,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,0,0

model=LoadAnimMesh("model.b3d")
door_=FindChild (madel,"door")

While Not KeyDown(1)

;Дальше тут пишешь условия на то чтоб когда объект близко то открыть дверь
;Как ее открыть думаю догадаешься, просто ее надо будет поворачивать

UpdateWorld
RenderWorld
Flip

Wend
End

Времени нет, так бы накатал пример, да и Blitz3D уже не пользуюсь :)

Drayfer 13.03.2011 00:30

Ответ: Как взаимодействовать с миром?
 
народ, спасибо конечно за примеры, но как открывать дверь с помощью поворота ее вокруг пивота - это я знаю. Мне бы хотелось с помощью анимации это осуществить.
Я просто не пойму как проиграть анимацию именно одной конкретной двери на уровне. Ведь если я ночную проигрывать анимацию, то будут открываться все двери...
И насколько я понял, то анимацию нужно делать используя кости? так? а не просто поворот мешает по оси... потому как в последнем случае у меня ничего не получилось - пишет ошибку, что в сцене нет анимации.

почему я не хочу с помощью поворота кодом это ркализовать - потому что двери у меня открываются и наружу,и внутрь, а также петли как слева, так и справа могут стоять. или кто подскажет как в этом случае реализовать то,что мне нужно...

Черный крыс 13.03.2011 01:25

Ответ: Как взаимодействовать с миром?
 
Ты хочешь чтобы твои двери открывались на основе анимации??? O_o это полный бред. Хотя конечно есть исключения - но они редки. Похоже вы вообще не понимаете игровую механику, да-да в 98% случаях двери вертятся\поднимаются\опускаются\раздвигаются програмно, и даже ролики на движке выполняются в большинстве случаев програмно (ракурсы камер, управление анимацией персов, звуки). А как вы хотели? другое дело что этим занимается не движок, а скрипт, отсюда и терминология "скриптовые сценки". Открой любую игру на базе Quake 3 (в этом двиге очень наглядная скриптовая система) и погляди на тамошние скрипты, ты удивишся, даже в Star trek : Elite Force 2 все сделано на скриптах. Вот так вот. =)

Hurrit 13.03.2011 03:04

Ответ: Как взаимодействовать с миром?
 
на, держи, может поможет тыкай. алсо, не воспринимай как саморекламу.

RegIon 13.03.2011 09:50

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

народ, спасибо конечно за примеры, но как открывать дверь с помощью поворота ее вокруг пивота - это я знаю. Мне бы хотелось с помощью анимации это осуществить.
Я просто не пойму как проиграть анимацию именно одной конкретной двери на уровне. Ведь если я ночную проигрывать анимацию, то будут открываться все двери...
И насколько я понял, то анимацию нужно делать используя кости? так? а не просто поворот мешает по оси... потому как в последнем случае у меня ничего не получилось - пишет ошибку, что в сцене нет анимации.

почему я не хочу с помощью поворота кодом это ркализовать - потому что двери у меня открываются и наружу,и внутрь, а также петли как слева, так и справа могут стоять. или кто подскажет как в этом случае реализовать то,что мне нужно...
ну раз так,то:
в максе анимируем Дверь...
ищем её Блитцом
Animate Дверь,Скорость...

IGR 13.03.2011 12:56

Ответ: Как взаимодействовать с миром?
 
програмное открытие/закрытие двери реализовать намного проще, а ты пытаешся через )!(0пу зуб вырвать !!
Напиши одну функу в которую будешь подавать хендл меша двери, скорость поворота и т.д. И эта функа будет поварачивать нужную дверь !!

Alex_Noc 18.03.2011 16:06

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

Сообщение от IGR (Сообщение 182615)
програмное открытие/закрытие двери реализовать намного проще, а ты пытаешся через )!(0пу зуб вырвать !!
Напиши одну функу в которую будешь подавать хендл меша двери, скорость поворота и т.д. И эта функа будет поварачивать нужную дверь !!

Ну тут спорный вопрос что проще реализовать . я реализовывал и через анимацию - в коде намного меньше строк чем программно , но программно гибче будет :rolleyes:

impersonalis 18.03.2011 16:10

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

Drayfer 24.03.2011 20:35

Ответ: Как взаимодействовать с миром?
 
Появился еще один вопрос, относительно поведения персонажа...

В игре вид от первого лица. Создаю персонаж так и привязываю камеру:

Код:

Global player=CreateSphere()
PositionEntity player,0,80,0
EntityRadius player, 19,30
EntityType player, TypePlayer

camera=CreateCamera(player)
CameraRange camera,0.1,4000
PositionEntity camera,0,100,0

Управление клавиатурой и мышей, как обычно.
PositionEntity camera,0,100,0 - камеру поднял, чтоб сделать определенный рост персонажу. Но теперь, когда я двигаю мышей и смотрю например вниз или вверх - голова тилипается нереально, то приближаясь к полу прям лицм, то затылком.... Потому как вращается то сама сфера....

Как сделать рост персонажа правильно?

mr.DIMAS 24.03.2011 21:57

Ответ: Как взаимодействовать с миром?
 
по-моему нужно так:
TurnEntity player, 0, MouseXSpeed(), 0
TurnEntity camera, MouseYSpeed(), 0, 0

Drayfer 24.03.2011 23:20

Ответ: Как взаимодействовать с миром?
 
mr.DIMAS, спасибо, помогло!


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

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