|
3D-программирование Вопросы, касающиеся программирования 3D мира |
27.02.2011, 15:32
|
#1
|
Нуждающийся
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений (для 0 пользователей)
|
Как взаимодействовать с миром?
Сделал я карту в 3Ds max 9, через пипелайн экспортировал в блитз, загрузил.
Так как первый раз делаю игру, то много еще не знаю. Кто может объяснить - как взаимодействовать с миром? Интересуют конкретно такие вопросы:
1. Как сделать так, чтобы подходишь к двери и она открывалась? Эти двери нужно сразу в максе на карте размещать? Как к ним обратиться?
2. Как сделать задания - типа нуно дойти до какой-то точки, если дошел, то появляется следующее такое задание? Как эти точки обозначать на карте в максе и как к ним в блитце обращаться?
Буду раз за подробные ответы! Хотелось, бы чтоб кто-то мне как нубу объяснил И еще желательно с примерами какими-то, или ссылками на конкретные уроки, если есть. Потому что на этом сейчас как раз заступорился....
Заранее огромное спасибо!
|
(Offline)
|
|
27.02.2011, 15:46
|
#2
|
ПроЭктировщик
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений (для 8 пользователей)
|
Ответ: Как взаимодействовать с миром?
1.Да эти двери надо размещать в этом твоём мире и в максе делать для них анимацию.....Например:
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))
__________________
Ученье свет, а не ученье тень!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.02.2011, 17:27
|
#3
|
Нуждающийся
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как взаимодействовать с миром?
Сообщение от }{@KeR
1.Да эти двери надо размещать в этом твоём мире и в максе делать для них анимацию.....Например:
player=LoadMesh("Player.B3D") dver=LoadAnimMesh("Dver.B3d") ............... repeat If EntityDistance(player,dver)<=100 Then Animate dver,.4 EndIf ........ end
И убирать коллизию с этой дверью...иначе непройдёт)))
|
Что касается одной двери, то понял.
А если у меня на уровне этих дверей много, штук 50. Это что создавать файлы .b3d с анимацией для каждой двери? Или как делать?
Или как мне в программе обратиться именно к конкретной двери? чтоб только для нее убрать коллизию?
Сообщение от }{@KeR
2.Задания также через EntityDistance
Создаёшь Pivot (CreatePivot)
IF EntityDistance(player,pivot)<=100 then
Здесь задания
EndIF
Задания можно делать через команду Select(Про команду почитать в Blitze если ввести и нажать(F1))
|
А Pivot нужно будет создавать именно кодом? Нельзя ли как-то именно в максе расставить пивоты и потом в программе обращатся к ним?
Как это сделать? Если можно пример?
|
(Offline)
|
|
27.02.2011, 18:02
|
#4
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Как взаимодействовать с миром?
А если у меня на уровне этих дверей много, штук 50. Это что создавать файлы .b3d с анимацией для каждой двери? Или как делать?
|
Создаешь карту в 3дмаксе с расставленными объектами и загружаешь через LoadAnimMesh. Потом ищешь эти объекты через FindChild и далее допустим записываешь в тип и потом когда надо проигрываешь анимацию объекта.
А Pivot нужно будет создавать именно кодом?
|
В максе создаешь "Dummy" и его уже в блитзе ищешь.
|
(Offline)
|
|
27.02.2011, 18:11
|
#5
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Как взаимодействовать с миром?
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
Код конечно не безгрешен и в нем наверняка куча мелких ошибок и его можно как то усовершенствовать.
|
(Offline)
|
|
27.02.2011, 18:42
|
#6
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: Как взаимодействовать с миром?
херня все выше описанное - делаешь 1 дверь , делаешь текстовик с коордами . копируешь дверь и ставишь по точкам - прирост 300% производительности.
Анимацию двери лучше сделать в проге - по углам , пивот не забудь сместить к положению петель, на двери ставишь тип и пикмоде , если дистанция < 10 напрмиер то пикмоде на дверь включаем иначе убираем. если ткнули мышь - опредедлить тип в какой попали . если это дверь то если угол такой то тогда открыть или закрыть в зависимости от угла.(наращиваешь или делишь угол), таким образом ты опишешь сразу все двери в твоем мире а не каждую в отдельности - смотри в сторону систематизации
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.02.2011, 18:53
|
#7
|
ПроЭктировщик
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений (для 8 пользователей)
|
Ответ: Как взаимодействовать с миром?
Нельзя ли как-то именно в максе расставить пивоты и потом в программе обращатся к ним?
Как это сделать? Если можно пример?
|
Можно.....Создаёшь также в максе pivot....Даёшь каждому имена а потом их ищешь через FindChild
А что ты хочешь чтобы у тя было в примере?????
__________________
Ученье свет, а не ученье тень!
|
(Offline)
|
|
27.02.2011, 19:05
|
#8
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Как взаимодействовать с миром?
Alex_Noc, зато в моем примере можно наделать уникальных дверей с уникальными анимациями, не обязательно связанными с кручением. =)
Что касается пикмодов, я согласен.
|
(Offline)
|
|
27.02.2011, 19:18
|
#9
|
Нуждающийся
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как взаимодействовать с миром?
FireOwl, то есть я так понимаю исходя из твоего примера:
Сначала создаем в максе и загружаем отдельно дверь:
door=LoadAnimMesh("door.b3d")
Потом создаем и загружаем уровень с уже установлеными дверями, такими же как door.b3d - так? или уровень должен быть без установленных дверей?
levelmesh=LoadAnimMesh("level1.b3d")
Потом в цикле проверяем уровень level1.b3d на чайлды по имени - door, если найден, то заменяем его на нашу анимированную дверь door.b3d. А дальше уже будем проигрывать анимацию при приближении игрока.
Так или я что-то не правильно понял?
Объясни, плиз, если не так....
P.S. чайлды - это имена объектов нашей сцены?
|
(Offline)
|
|
27.02.2011, 19:32
|
#10
|
ПроЭктировщик
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений (для 8 пользователей)
|
Ответ: Как взаимодействовать с миром?
Загрузи уровень с анимациями дверей
levelmesh=LoadAnimMesh("level1.b3d")
А потом в этом меше ищи чайлды и воиспроизводи анимацию когда тебе надо
Так делать не неадо
Сначала создаем в максе и загружаем отдельно дверь:
door=LoadAnimMesh("door.b3d")
|
__________________
Ученье свет, а не ученье тень!
|
(Offline)
|
|
27.02.2011, 19:41
|
#11
|
Нуждающийся
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Как взаимодействовать с миром?
Сообщение от }{@KeR
Загрузи уровень с анимациями дверей
levelmesh=LoadAnimMesh("level1.b3d")
А потом в этом меше ищи чайлды и воиспроизводи анимацию когда тебе надо
|
1.То есть и двери и сам уровень должны быть в одном файле?
И это получается для каждой сделанной двери на уровне нужно делать анимацию? или для какой-то одной? как это сделать - просто не в курсе
2. когда будет воспроизводиться анимация - будет открываться только одна дверь или все на уровне?
|
(Offline)
|
|
27.02.2011, 19:54
|
#12
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: Как взаимодействовать с миром?
что тебе в моем случае мешает сделать уникальность ?))
|
(Offline)
|
|
27.02.2011, 19:58
|
#13
|
ПроЭктировщик
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений (для 8 пользователей)
|
Ответ: Как взаимодействовать с миром?
1.То есть и двери и сам уровень должны быть в одном файле?
И это получается для каждой сделанной двери на уровне нужно делать анимацию? или для какой-то одной? как это сделать - просто не в курсе
2. когда будет воспроизводиться анимация - будет открываться только одна дверь или все на уровне?
|
если одним файлом...время на размещение дверей мало уйдёт, зато писонины много будет
1.Смотри создаёшь уровень со своими дверями
Делаешь анимацию для каждой двери
Эту каждую дверь Именуешь
2.Потом через FindChild ищешь эти двери в своём уровне
Например:
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. Примерно вот так
__________________
Ученье свет, а не ученье тень!
|
(Offline)
|
|
27.02.2011, 21:02
|
#14
|
ПроЭктировщик
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений (для 8 пользователей)
|
Ответ: Как взаимодействовать с миром?
Вот тебе пример радара
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 ; 0 = player, 1 = enemy 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(200) Then MoveEntity camera,0,0,0.1 If KeyDown(208) Then MoveEntity camera,0,0,-0.1 If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(205) Then 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
__________________
Ученье свет, а не ученье тень!
|
(Offline)
|
|
27.02.2011, 23:04
|
#15
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: Как взаимодействовать с миром?
а коолизии будут работать? с таким методом дверей)))) ВРЯДЛЕ
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:36.
|