Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 27.02.2011, 15:32   #1
Drayfer
Нуждающийся
 
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений
(для 0 пользователей)
Как взаимодействовать с миром?

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

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

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

Заранее огромное спасибо!
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 15:46   #2
}{@KeR
ПроЭктировщик
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Drayfer (27.02.2011)
Старый 27.02.2011, 17:27   #3
Drayfer
Нуждающийся
 
Регистрация: 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
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Как взаимодействовать с миром?

А если у меня на уровне этих дверей много, штук 50. Это что создавать файлы .b3d с анимацией для каждой двери? Или как делать?
Создаешь карту в 3дмаксе с расставленными объектами и загружаешь через LoadAnimMesh. Потом ищешь эти объекты через FindChild и далее допустим записываешь в тип и потом когда надо проигрываешь анимацию объекта.
А Pivot нужно будет создавать именно кодом?
В максе создаешь "Dummy" и его уже в блитзе ищешь.
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 18:11   #5
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 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
Код конечно не безгрешен и в нем наверняка куча мелких ошибок и его можно как то усовершенствовать.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 18:42   #6
Alex_Noc
Разработчик
 
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений
(для 289 пользователей)
Ответ: Как взаимодействовать с миром?

херня все выше описанное - делаешь 1 дверь , делаешь текстовик с коордами . копируешь дверь и ставишь по точкам - прирост 300% производительности.
Анимацию двери лучше сделать в проге - по углам , пивот не забудь сместить к положению петель, на двери ставишь тип и пикмоде , если дистанция < 10 напрмиер то пикмоде на дверь включаем иначе убираем. если ткнули мышь - опредедлить тип в какой попали . если это дверь то если угол такой то тогда открыть или закрыть в зависимости от угла.(наращиваешь или делишь угол), таким образом ты опишешь сразу все двери в твоем мире а не каждую в отдельности - смотри в сторону систематизации
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FireOwl (27.02.2011)
Старый 27.02.2011, 18:53   #7
}{@KeR
ПроЭктировщик
 
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений
(для 8 пользователей)
Ответ: Как взаимодействовать с миром?

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


А что ты хочешь чтобы у тя было в примере?????
__________________
Ученье свет, а не ученье тень!
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 19:05   #8
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: Как взаимодействовать с миром?

Alex_Noc, зато в моем примере можно наделать уникальных дверей с уникальными анимациями, не обязательно связанными с кручением. =)
Что касается пикмодов, я согласен.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 19:18   #9
Drayfer
Нуждающийся
 
Регистрация: 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
}{@KeR
ПроЭктировщик
 
Регистрация: 01.02.2011
Сообщений: 148
Написано 7 полезных сообщений
(для 8 пользователей)
Ответ: Как взаимодействовать с миром?

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

Так делать не неадо
Сначала создаем в максе и загружаем отдельно дверь:
door=LoadAnimMesh("door.b3d")
__________________
Ученье свет, а не ученье тень!
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 19:41   #11
Drayfer
Нуждающийся
 
Регистрация: 14.02.2011
Адрес: Украина, Луганск
Сообщений: 67
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Как взаимодействовать с миром?

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

2. когда будет воспроизводиться анимация - будет открываться только одна дверь или все на уровне?
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 19:54   #12
Alex_Noc
Разработчик
 
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений
(для 289 пользователей)
Ответ: Как взаимодействовать с миром?

что тебе в моем случае мешает сделать уникальность ?))
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 19:58   #13
}{@KeR
ПроЭктировщик
 
Регистрация: 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
}{@KeR
ПроЭктировщик
 
Регистрация: 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 
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 
__________________
Ученье свет, а не ученье тень!
(Offline)
 
Ответить с цитированием
Старый 27.02.2011, 23:04   #15
Alex_Noc
Разработчик
 
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений
(для 289 пользователей)
Ответ: Как взаимодействовать с миром?

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com