People Soft Понедельник, 29.04.2024, 18:02
Меню сайта
Категории каталога
Blitz3D [3]
Delphi [0]
Pascal [5]
Главная » Статьи » Blitz3D

Курс молодого бойца, Ч.3
Статья взята с сайта blitzetc.boolean.name
Курс молодого бойца, Ч.3
Поразмыслив, я понял, банальный ФПС - это фигня для создателя Мега-игры. Раздобыв Диздок самой успешной MMORPG в мире, я решил, основываясь на нем, попытаться рассказать, как делаются мега игры. Конечно, сразу все не получится, многие вопросы придется прорабатывать отдельно, но задача будет интересной. Запасаемся терпением, и приступаем к с созданию нашего мира. Чтобы внести ясность: все примеры это только примеры, всегда есть более другой и красивый способ сделать что-либо. Я буду всегда выбирать тот, в котором можно задействовать минимум Медиа и приложить минимум труда, основной упор на прозрачность принципа создания: Поэтому очень извиняюсь за неподходящие модели, текстуры и т.д. С другой стороны это вполне отражает ситуацию, с которой сталкивается настоящий создатель Мега-игры. (Тащат к себе все, до чего могут дотянуться.) Картинка пока будет получаться не очень, но постепенно все проработаем до удовлетворительного результата: Особенно если найдется добрый самаритянин, готовый пожертвовать свое время и медиа, на благое дело...

Бытие
1.В начале сотворил Бог небо и землю.
2.Земля же была безвидна и пуста, и тьма над бездною, и Дух Божий носился над водою.
3.И сказал Бог: да будет свет. И стал свет.
4.И увидел Бог свет, что он хорош, и отделил Бог свет от тьмы.
5.И назвал Бог свет днем, а тьму ночью. И был вечер, и было утро: день один.

Для работы программ нужно скачать директорию с изображениями.


;day1.bb
Graphics3D 640, 480, 32
SetBuffer BackBuffer()
HidePointer

Global God = CreateCamera()

MoveEntity god,0,2,0

Global Red=0 ; Составляющие
Global Green=150 ; цвета
Global Blue=200 ; Неба

Global Day=1.0 ; Значит у нас кончилась ночь
CameraClsColor God,red,green,Blue; Небо

Global DayTime=10000 ; скорость смены
Global DayBegin=0 ; когда произошла смена дня и ночи


Pl= CreatePlane() ;Земля, которая вода
tx=LoadTexture("media\water.jpg") ;
EntityTexture Pl,tx ;

AmbientLight 50,50,50 ; как освещены предметы ночью
Global l = CreateLight() ; Свет, который хорошо
TurnEntity l,30,20,0

While Not KeyDown(1)

GodMovement() ; носится над водой и под ней

DayControl() ;смена дня и ночи

RenderWorld
Flip

Wend

End

Function GodMovement()
TurnEntity God,MouseYSpeed(),-MouseXSpeed(),0 ; поворот камеры мышкой аля FPS
TurnEntity god,0,0,-EntityRoll(god) ; чтобы не переворачивалась камера
MoveEntity God,KeyDown(32)-KeyDown(30),0,KeyDown(17)-KeyDown(31) ; Движение камеры wasd
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 ; Это нужно чтобы машка не уходила за экран
End Function

Function DayControl()
If DayBegin=0 Then DayBegin=MilliSecs() ; день первый начался
delta#=Float(MilliSecs()-DayBegin)/DayTime ; Какая часть дня прошла?
If delta>=1 ; День/ночь кончился
delta=1
DayBegin=MilliSecs() ;Начался новый день/ночь
EndIf
If day=-1 ;Ночью света становится меньше
delta=1-delta
EndIf
LightColor l,255*delta,255*delta,255*delta
CameraClsColor God,red*delta,green*delta,Blue*delta ; цвет неба зависит от времени суток
If delta=1 Or delta=0 Then day=-day ; в полдень/полночь сменяем признак половины дня
End Function

Рассмотрим чего я наворотил:

Налицо локация (Типа море), персонаж (Мы - камера). Есть блок управления персонажем и камерой GodMovement(). Есть блок игровой логики DayControl(). День и ночь в данном примере равны и цвет неба изменяется в линейной зависимости синхронно с освещенностью. В жизни все происходит иначе. Цвет изменяется быстрее, чем падает освещенность. Вернее неравномерно. Сначала небо темнеет, освещенность падает медленнее, затем освещенность начинает быстро падать (солнце заходит) и "догоняет" цвет неба, затем небо начинает светлеть, но освещенность отстает и когда солнце восходит, освещенность "догоняет" цвет неба: Подобрать зависимость изменения цвета неба и цвета света я завещаю вам. Принципиально возможно сделать, чтобы вечером все предметы освещались красноватым цветом. Кстати непонятно почему бог сотворил землю, а его дух носился над водой:
6.И сказал Бог: да будет твердь посреди воды, и да отделяет она воду от воды. [И стало так.]
7.И создал Бог твердь, и отделил воду, которая под твердью, от воды, которая над твердью. И стало так.
8.И назвал Бог твердь небом. [И увидел Бог, что это хорошо.] И был вечер, и было утро: день второй.
9.И сказал Бог: да соберется вода, которая под небом, в одно место, и да явится суша. И стало так. [И собралась вода под небом в свои места, и явилась суша.]
10.И назвал Бог сушу землею, а собрание вод назвал морями. И увидел Бог, что это хорошо.

Если воду (текстуру) для первого дня, я нагло спер у кого-то (прошу у него прощения за это), то для того чтобы сказать: "да будет твердь посреди воды", потребуется спереть(Купить) что либо покрупнее например Terragen (www.planetside.co.uk) c eго помощью можно генерировать карты высот, или Total terrain - можно редактировать и создавать карты высот. Если вы думаете, что сейчас скачаете программу, ткнете кнопку и получите результат, то вы ошибаетесь. Результат, то вы получите, но не такой, какой хотите. Рандом - он и есть рандом. С ним или мирятся, или исправляют руками, или делают руками сразу: Я сгенерил в Терагене карту высот, которая при опускании в воду должна стать архипелагом, и опустил края в PaintBrush (Очень полезная программка - входящая в состав Виндовс). Я схалтурил, ясен пень, каждый остров архипелага нужно было генерить/создавать отдельно и расставлять ручками, но пока и так сойдет: Непонятные промежуточные этапы с созданием тверди отделяющей воду от воды я пропустил. Бог наверное сначала создал океан как и мы, только сферой, затем сделал дно (литосферу) , которое разделило воду, а затем скалил литосферу таким образом, чтобы неровности литосферы вышли на поверхность, и вода образовала моря и океаны. В общем, ему с движком повезло. И полигонов он держит, не меряно, и размер возможной вселенной впечатляет. Нам придется много изворачиваться:

;day2.bb
Graphics3D 640, 480, 32
SetBuffer BackBuffer()
HidePointer

Global God = CreateCamera()

MoveEntity god,0,2,0

Global Red=0 ; Составляющие
Global Green=150 ; цвета
Global Blue=200 ; Неба

Global Day=1.0 ; Значит у нас кончилась ночь
CameraClsColor God,red,green,Blue; Небо

Global DayTime=10000 ; скорость смены
Global DayBegin=0 ; когда произошла смена дня и ночи


Pl= CreatePlane() ;Земля, которая вода
EntityAlpha Pl,0.4
tx=LoadTexture("media\water.jpg") ;
EntityTexture Pl,tx ;
FreeTexture tx

sh= CreatePlane() ; дно - шельф

Land=LoadTerrain("media\land.png") ; Острова
tx=LoadTexture("media\dirt001.jpg") ;
ScaleTexture tx,0.2,0.2
EntityTexture sh,tx ;
EntityTexture land,tx ;
FreeTexture tx


ScaleEntity sh,5,1,5
ScaleEntity Land,5,80,5
MoveEntity Land,-256*5,-20,-256*5
MoveEntity sh,0,-20.001,0

AmbientLight 100,100,100 ; как освещены предметы ночью
Global l = CreateLight() ; Свет, который хорошо
TurnEntity l,30,20,0

While Not KeyDown(1)

GodMovement() ; носится над водой и под ней

DayControl() ;смена дня и ночи

RenderWorld
Flip

Wend

End

Function GodMovement()
TurnEntity God,MouseYSpeed(),-MouseXSpeed(),0 ; поворот камеры мышкой аля FPS
TurnEntity god,0,0,-EntityRoll(god) ; чтобы не переворачивалась камера
MoveEntity God,KeyDown(32)-KeyDown(30),0,KeyDown(17)-KeyDown(31) ; Движение камеры wasd
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 ; Это нужно чтобы машка не уходила за экран
End Function

Function DayControl()
If DayBegin=0 Then DayBegin=MilliSecs() ; день первый начался
delta#=Float(MilliSecs()-DayBegin)/DayTime ; Какая часть дня прошла?
If delta>=1 ; День/ночь кончился
delta=1
DayBegin=MilliSecs() ;Начался новый день/ночь
EndIf
If day=-1 ;Ночью света становится меньше
delta=1-delta
EndIf
LightColor l,255*delta,255*delta,255*delta
CameraClsColor God,red*delta,green*delta,Blue*delta ; цвет неба зависит от времени суток
If delta=1 Or delta=0 Then day=-day ; в полдень/полночь сменяем признак половины дня
End Function

Получилось что-то похожее. Суши маловато, но нужно же с чего-то начать? Мы еще пока не опытные боги: Кстати, как я писал выше внешний вид игры - это 90% медиа. Найти тайловую (на противоположных краях "переходит" сама в себя), равномерно освещенную текстуру очень сложно. Взять цифровик, нащелкать траву, землю и использовать в игре можно, но на открытых пространствах будут видны стыки текстур из-за их не тайловости, что можно убрать при некоторой сноровке, а главное, от неравномерного освещения, что невозможно убрать. Такие текстуры образуют на поверхности ощутимые квадраты как, это получается в нашем случае. Для того чтобы сгладить эффект необходимо или раздобыть тайловую текстуру, или применять мультитекстурирование. Чтобы заретушировать стыки, можно взять почти любую текстуру, изменить ее пропорции (ScaleTexture) и наложить на поверхность сверху, если сможете создать текстуру с неравномерной прозрачностью будет еще круче, нужно будет с TextureBlend экспериментировать: Нафоткать текстур получится для игровых объектов, на которых текстура не тайлится (текстура помещается на объекте один раз). И это имеет смысл. Только без фанатизма! А то, как сфоткаете 2700х1900 и начнете на модели прилаживать, так делать ненужно, нужно помучиться и подобрать минимальное разрешение текстуры, при котором получается приличный внешний вид. Например, натягивать на ландшафт текстуру 256х256 - расточительство, замена ее на текстуру 64х64 не очень влияет на внешний вид. Если, конечно, вы не собираетесь эту текстуру увеличивать:

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

  1. И сказал Бог: да произрастит земля зелень, траву, сеющую семя [по роду и по подобию ее, и] дерево плодовитое, приносящее по роду своему плод, в котором семя его на земле. И стало так.
  2. И произвела земля зелень, траву, сеющую семя по роду [и по подобию] ее, и дерево [плодовитое], приносящее плод, в котором семя его по роду его [на земле]. И увидел Бог, что это хорошо.
  3. И был вечер, и было утро: день третий.

Вот и начинаются грабли. Замете, а мы даже еще не дошли до физических взаимодействий! Деревья мы раздобудем, сделать чтобы они росли, размножались и приносили плоды - проблема: Пока. Сейчас просто рассадим деревья по островам. Для создания деревьев использовали программу Tree[d] и экспортер созданный Barlok'ом на основе функций Progs'а. (Правда, нужно его немного подкрутить, флаги текстур неправильно экспортятся)


;day3.bb
Graphics3D 640, 480, 32
SetBuffer BackBuffer()
HidePointer

Global God = CreateCamera()

MoveEntity god,0,2,0

Global Red=0 ; Составляющие
Global Green=150 ; цвета
Global Blue=200 ; Неба

Global Day=1.0 ; Значит у нас кончилась ночь
CameraClsColor God,red,green,Blue; Небо

Global DayTime=10000 ; скорость смены
Global DayBegin=0 ; когда произошла смена дня и ночи


Pl= CreatePlane() ;Земля, которая вода
EntityAlpha Pl,0.4
tx=LoadTexture("media\water.jpg") ;
EntityTexture Pl,tx ;
FreeTexture tx
EntityPickMode pl,2
NameEntity pl,"Water"

sh= CreatePlane() ; дно - шельф

Land=LoadTerrain("media\land.png") ; Острова

EntityPickMode Land,2
NameEntity Land,"Land"

tx=LoadTexture("media\dirt001.jpg") ;
ScaleTexture tx,0.2,0.2
EntityTexture sh,tx ;
EntityTexture land,tx ;
FreeTexture tx


ScaleEntity sh,5,1,5
ScaleEntity Land,5,80,5
MoveEntity Land,-256*5,-20,-256*5
MoveEntity sh,0,-20.001,0

AmbientLight 100,100,100 ; как освещены предметы ночью
Global l = CreateLight() ; Свет, который хорошо
TurnEntity l,30,20,0


Dim Flora(2)

Flora(1)=LoadMesh("media\tree\tree01.b3d")
HideEntity Flora(1)
Flora(2)=LoadMesh("media\tree\tree01.b3d")
ScaleEntity Flora(2),1,0.5,1
HideEntity Flora(2)

For i=1 To 3000 ; количество растений
en=0
While en=0
x#=Rnd(-2500,2500)
z#=Rnd(-2500,2500)
LinePick x,200,z,0,-200,0
en=PickedEntity()
If en
If EntityName(en)="Land" ; В воду растения не сажаем.
tr=CopyEntity(flora(Rnd(1,2)))
PositionEntity tr,x,PickedY#(),z
Else
en=0
EndIf
EndIf
Wend
Next

While Not KeyDown(1)

GodMovement() ; носится над водой и под ней

DayControl() ;смена дня и ночи

RenderWorld
Flip

Wend

End

Function GodMovement()
TurnEntity God,MouseYSpeed(),-MouseXSpeed(),0 ; поворот камеры мышкой аля FPS
TurnEntity god,0,0,-EntityRoll(god) ; чтобы не переворачивалась камера
MoveEntity God,KeyDown(32)-KeyDown(30),0,KeyDown(17)-KeyDown(31) ; Движение камеры wasd
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 ; Это нужно чтобы машка не уходила за экран
End Function

Function DayControl()
If DayBegin=0 Then DayBegin=MilliSecs() ; день первый начался
delta#=Float(MilliSecs()-DayBegin)/DayTime ; Какая часть дня прошла?
If delta>=1 ; День/ночь кончился
delta=1
DayBegin=MilliSecs() ;Начался новый день/ночь
EndIf
If day=-1 ;Ночью света становится меньше
delta=1-delta
EndIf
LightColor l,255*delta,255*delta,255*delta
CameraClsColor God,red*delta,green*delta,Blue*delta ; цвет неба зависит от времени суток
If delta=1 Or delta=0 Then day=-day ; в полдень/полночь сменяем признак половины дня
End
Function

Для осуществления задуманного, вводим первые {физические} параметры - PickMode и NameEntity чтобы знать, куда попало растение в воду или на благодатную почву. Для рассады райских садов, используем генератор псевдослучайных чисел (это занимает какое-то время и чем больше деревьев тем дольше). Наш "Райский" сад состоит из двух типов деревьев. Но все готово чтобы работать с произвольным набором флоры: В данном случае деревья и "кусты" - это спецэффекты, впрочем как и весь мир: Изменив количество растений, можете дойти до такого количества, что все начнет тормозить по полной, ну и придется подождать пока засадятся острова: Значительно увеличить количество деревьев при котором ФПС не падает на ногу можно объединив флору в несколько мешей. Подобными штуками занимается библиотека Single Surface, рекомендую. Ну или сделать самим.

  1. И сказал Бог: да будут светила на тверди небесной [для освещения земли и] для отделения дня от ночи, и для знамений, и времен, и дней, и годов;
  2. и да будут они светильниками на тверди небесной, чтобы светить на землю. И стало так.
  3. И создал Бог два светила великие: светило большее, для управления днем, и светило меньшее, для управления ночью, и звезды;
  4. и поставил их Бог на тверди небесной, чтобы светить на землю,
  5. и управлять днем и ночью, и отделять свет от тьмы. И увидел Бог, что это хорошо.
  6. И был вечер, и было утро: день четвёртый.

Просто поразительно, как сильно изменилась самая популярная ММОРПГ вселенная со времен диздока. Если Бету делали по нему, то до релиза кто-то впахивал как проклятый: В первый день у нас был свет-день и тьма-ночь, и только на четвертый Бог сделал Солнце, Луну и звезды: Я то, наивный полагал, что свет от солнца идет, а оказывается наоборот! Если есть свет - значит день и Солнце. Что вроде и неплохо для нас:

;day4.bb
Graphics3D 640, 480, 32
SetBuffer BackBuffer()
HidePointer

Global God = CreateCamera()

MoveEntity god,0,2,0

Global Red=0 ; Составляющие
Global Green=150 ; цвета
Global Blue=200 ; Неба

Global Day=1.0 ; Значит у нас кончилась ночь
CameraClsColor God,red,green,Blue; Небо

Global DayTime=100000 ; скорость смены
Global DayBegin=0 ; когда произошла смена дня и ночи


Pl= CreatePlane() ;Земля, которая вода
EntityAlpha Pl,0.5
tx=LoadTexture("media\water.jpg") ;
EntityTexture Pl,tx ;
FreeTexture tx
EntityPickMode pl,2
NameEntity pl,"Water"

sh= CreatePlane() ; дно - шельф

Land=LoadTerrain("media\land.png") ; Острова

EntityPickMode Land,2
NameEntity Land,"Land"

tx=LoadTexture("media\dirt001.jpg") ;

ScaleTexture tx,0.2,0.2
EntityTexture sh,tx ;
EntityTexture land,tx ;
FreeTexture tx

ScaleEntity sh,5,1,5
ScaleEntity Land,5,80,5
MoveEntity Land,-256*5,-20,-256*5
MoveEntity sh,0,-20.001,0

AmbientLight 100,100,100 ; как освещены предметы ночью
Global l = CreateLight() ; Свет, который хорошо
TurnEntity l,30,20,0

Dim Flora(2)

Flora(1)=LoadMesh("media\tree\tree01.b3d")
HideEntity Flora(1)
Flora(2)=LoadMesh("media\tree\tree01.b3d")
ScaleEntity Flora(2),1,0.5,1
HideEntity Flora(2)

For i=1 To 3000 ; количество растений
en=0
While en=0
x#=Rnd(-2500,2500)
z#=Rnd(-2500,2500)
LinePick x,200,z,0,-200,0
en=PickedEntity()
If en
If EntityName(en)="Land" ; В воду растения не сажаем.
tr=CopyEntity(flora(Rnd(1,2)))
PositionEntity tr,x,PickedY#(),z
Else
en=0
EndIf
EndIf
Wend
Next

Global Center=CreatePivot() ; центр системы, его постоянно совмещаем с камерой (с нами т.е.)
Global star=CreateSphere(8,center) ; ЗВЕЗДЫ
EntityFX star,1
ScaleEntity star,50,50,50
FlipMesh star
tx=LoadTexture("Media\space\stars.png",4)
EntityTexture star,tx
FreeTexture tx
EntityOrder star,1.0
Global solCen=CreatePivot(Center) ; центр вокруг которого вращается Солнце
sol=LoadSprite("Media\space\sol.png",1,SolCen); Солнце
MoveEntity sol,0,0,15
EntityOrder sol,0.9

Global MoonCen=CreatePivot(Center) ; центр вокруг которого вращается Луна
Moon=LoadSprite("Media\space\moon.png",1,MoonCen); Луна
MoveEntity moon,0,0,-15
EntityOrder moon,0.8



While Not KeyDown(1)

GodMovement() ; носится над водой и под ней

DayControl() ;смена дня и ночи

RenderWorld
Flip

Wend

End

Function SpaceControl(fase#,day)
PositionEntity center,EntityX(god),EntityY(god),EntityZ(god)
If day=-1
RotateEntity SolCen,90-(180*fase),0,0
RotateEntity MoonCen,90-(180*fase),0,0
Else
RotateEntity SolCen,(180*fase)+90,0,0
RotateEntity MoonCen,(180*fase)+90,0,0
EndIf
End Function

Function GodMovement()
TurnEntity God,MouseYSpeed(),-MouseXSpeed(),0 ; поворот камеры мышкой аля FPS
TurnEntity god,0,0,-EntityRoll(god) ; чтобы не переворачивалась камера
MoveEntity God,KeyDown(32)-KeyDown(30),0,KeyDown(17)-KeyDown(31) ; Движение камеры wasd
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 ; Это нужно чтобы машка не уходила за экран
End Function

Function DayControl()
If DayBegin=0 Then DayBegin=MilliSecs() ; день первый начался
delta#=Float(MilliSecs()-DayBegin)/DayTime ; Какая часть дня прошла?
If delta>=1 ; День/ночь кончился
delta=1
DayBegin=MilliSecs() ;Начался новый день/ночь
EndIf
If day=-1 ;Ночью света становится меньше
delta=1-delta
EndIf
LightColor l,255*delta,255*delta,255*delta
CameraClsColor God,red*delta,green*delta,Blue*delta ; цвет неба зависит от времени суток
EntityAlpha star,1-delta
SpaceControl(delta,day)
If delta=1 Or delta=0 Then day=-day ; в полдень/полночь сменяем признак половины дня
End
Function

Досконально переводим в код то, что записано в диздоке. Само собой, что твердь небесная это сфера, на которой мы намалевали звезды. (я там созвездие большой медведицы намалевал) Солнышко и Луну запустили по круговой орбите: Теперь ясно почему Джордано Бруно сожгли! Движок пропачили, но что пропачили не сказали: Джордано фишку просек, о чем и сказал, но если он был прав, у клириков заклинание "Майнд контрол" обламывалось и они его на респ отправили, принеся в жертву.

Как вы знаете Солнце, Луна и звезды находятся на большом расстоянии от нас, и находились на большом расстоянии даже при Геоцентрической системе мира. Но формально - далеко значит, рисуется первым. Для создания небесных сфер, использован контроль над Z-буфером. Первой выводятся звезды, которые днем становятся прозрачными, потом солнце, потом луна. Сделано это из-за того, что нужно одновременно противоположного. Сферы должны быть такими большими, чтобы все предмеры в радиусе видимости были внутри нее, а это возможно только если сфера больше радиуса видимости. Если сферы будут меньше, то будет видно как предметы проходят сквозь них: А слабо вам сделать солнечное затменье? Подсказка: для более наглядного и понятного обращения с планетами имеет смысл сделать свой календарь и время, которые будут привязаны к миллисекундам. Так как это сделал я сейчас - быстро, требует минимум квалификации, но несколько натянуто и не гибко. Помучавшись со своими часами и календарем, вы сможете легко управлять периодом обращения небесных тел.

  1. И сказал Бог: да произведет вода пресмыкающихся, душу живую; и птицы да полетят над землею, по тверди небесной. [И стало так.]
  2. И сотворил Бог рыб больших и всякую душу животных пресмыкающихся, которых произвела вода, по роду их, и всякую птицу пернатую по роду ее. И увидел Бог, что это хорошо.
  3. И благословил их Бог, говоря: плодитесь и размножайтесь, и наполняйте воды в морях, и птицы да размножаются на земле.
  4. И был вечер, и было утро: день пятый.

Позволю себе заметить, сначала появилась земля, потом растения - стоят на месте и без анимации, потом звезды и планеты и потом пресмыкающиеся и птицы. Т.е. целый день Бог собирался с силами для того, что бы ввести в свой мир анимированные, перемещающиеся модели. И не зря. Для того чтобы сделать возможным их перемещение придется сделать гравитацию. (Может, поэтому он сделал планеты и звезды сначала? ;)) Естественно делаем себе послабление - птиц не будет, животные ходить не будут. Почему? Потому что для того чтобы ходить, животным нужны мозги (АИ), а птицы - летают, зависшие птицы никуда не годятся, а вот стоящие на месте животные - это нормально. Животное я сделал с помощью Wings3D. Хто это? Сказать сложно, но то что это животное - однозначно.

;day5.bb
Graphics3D 640, 480, 32
SetBuffer BackBuffer()
HidePointer


Global God = CreateCamera()

MoveEntity god,0,2,0

Global Red=0 ; Составляющие
Global Green=150 ; цвета
Global Blue=200 ; Неба

Global Day=1.0 ; Значит у нас кончилась ночь
CameraClsColor God,red,green,Blue; Небо

Global DayTime=100000 ; скорость смены
Global DayBegin=0 ; когда произошла смена дня и ночи


Pl= CreatePlane() ;Земля, которая вода
EntityAlpha Pl,0.5
tx=LoadTexture("media\water.jpg") ;
EntityTexture Pl,tx ;
FreeTexture tx
EntityPickMode pl,2
NameEntity pl,"Water"

sh= CreatePlane() ; дно - шельф

Land=LoadTerrain("media\Land.png") ; Острова

EntityPickMode Land,2
NameEntity Land,"Land"

tx=LoadTexture("media\dirt001.jpg") ;

ScaleTexture tx,0.2,0.2
EntityTexture sh,tx ;
EntityTexture land,tx ;
FreeTexture tx

ScaleEntity sh,5,1,5
ScaleEntity Land,5,80,5
MoveEntity Land,-256*5,-20,-256*5
MoveEntity sh,0,-20.001,0

AmbientLight 100,100,100 ; как освещены предметы ночью
Global l = CreateLight() ; Свет, который хорошо
TurnEntity l,30,20,0


; Зеленые насаждения
Dim Flora(2)

Flora(1)=LoadMesh("media\tree\tree01.b3d")
HideEntity Flora(1)
Flora(2)=LoadMesh("media\tree\tree01.b3d")
ScaleEntity Flora(2),1,0.5,1
HideEntity Flora(2)

For i=1 To 1000 ; количество растений
en=0
While en=0
x#=Rnd(-2500,2500)
z#=Rnd(-2500,2500)
LinePick x,500,z,0,-500,0
en=PickedEntity()
If en
If EntityName(en)="Land" ; В воду растения не сажаем.
tr=CopyEntity(flora(Rnd(1,2)))
PositionEntity tr,x,PickedY#(),z
Else
en=0
EndIf
EndIf
Wend
Next

;Космические тела
Global Center=CreatePivot() ; центр системы, его постоянно совмещаем с камерой (с нами т.е.)
Global star=CreateSphere(8,center) ; ЗВЕЗДЫ
EntityFX star,1
ScaleEntity star,50,50,50
FlipMesh star
tx=LoadTexture("Media\space\stars.png",4)
EntityTexture star,tx
FreeTexture tx
EntityOrder star,1.0
Global solCen=CreatePivot(Center) ; центр вокруг которого вращается Солнце
sol=LoadSprite("Media\space\sol.png",1,SolCen); Солнце
MoveEntity sol,0,0,15
EntityOrder sol,0.9

Global MoonCen=CreatePivot(Center) ; центр вокруг которого вращается Луна
Moon=LoadSprite("Media\space\moon.png",1,MoonCen); Луна
MoveEntity moon,0,0,-15
EntityOrder moon,0.8

; гравитация

Const Terrain_type=1
Const Object_type=2
Const Water_type=3
Collisions Object_type,Terrain_type,2,2
Collisions Object_type,Water_type,2,3
Const gravity#=0.1


EntityType Land,Terrain_Type
EntityType Pl,Water_Type

Type Grav
Field Ent
Field Vy#
End Type

; фауна
Monstr=LoadMesh("Media\Animal\dog.3ds")
EntityType Monstr,Object_Type
EntityRadius Monstr,0.1
HideEntity Monstr

For i=1 To 200 ; количество зверей
en=0
While en=0
x#=Rnd(-2500,2500)
z#=Rnd(-2500,2500)
LinePick x,500,z,0,-500,0
en=PickedEntity()
If en
If EntityName(en)="Land" ; В воду зверюшек не кидаем.
G.Grav=New grav
g\ent=CopyEntity(Monstr)
PositionEntity g\ent,x,PickedY#()+2,z
tr=g\ent
Else
en=0
EndIf
EndIf
Wend
Next


Global jamp=MilliSecs()

While Not KeyDown(1)

GodMovement() ; носится над водой и под ней

DayControl() ;смена дня и ночи

GravityControl() ; Обработка воздействия гравитации на объекты

UpdateWorld
RenderWorld
Flip
Wend

End

Function GravityControl()
TekMillisecs=MilliSecs()
For t.grav= Each grav
If EntityCollided(t\ent,Terrain_type)>0
AlignToVectorCollisionNX(t\ent,1),CollisionNY(t\ent,1),CollisionNZ(t\ent,1),2,0.2
t\Vy=0
If TekMillisecs>=Jamp+2000 ; Раз в 2 секундs зверь прыгает, Для этого должен был-бы использоваться модуль АИ, но пока и так хорошо.
t\Vy=1
EndIf
EndIf
t\Vy= t\Vy-gravity
TranslateEntity t\ent,0,t\vy,0,1
Next
If TekMillisecs>=Jamp+2000 ; Раз в 2 секундs зверь прыгает, Для этого должен был-бы использоваться модуль АИ, но пока и так хорошо.
jamp=TekMillisecs
EndIf
End Function


Function SpaceControl(fase#,day)
PositionEntity center,EntityX(god),EntityY(god),EntityZ(god)
If day=-1
RotateEntity SolCen,90-(180*fase),0,0
RotateEntity MoonCen,90-(180*fase),0,0
Else
RotateEntity SolCen,(180*fase)+90,0,0
RotateEntity MoonCen,(180*fase)+90,0,0
EndIf
End Function

Function GodMovement()
TurnEntity God,MouseYSpeed(),-MouseXSpeed(),0 ; поворот камеры мышкой аля FPS
TurnEntity god,0,0,-EntityRoll(god) ; чтобы не переворачивалась камера
MoveEntity God,KeyDown(32)-KeyDown(30),0,KeyDown(17)-KeyDown(31) ; Движение камеры wasd
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 ; Это нужно чтобы машка не уходила за экран
End Function

Function DayControl()
If DayBegin=0 Then DayBegin=MilliSecs() ; день первый начался
delta#=Float(MilliSecs()-DayBegin)/DayTime ; Какая часть дня прошла?
If delta>=1 ; День/ночь кончился
delta=1
DayBegin=MilliSecs() ;Начался новый день/ночь
EndIf
If day=-1 ;Ночью света становится меньше
delta=1-delta
EndIf
LightColor l,255*delta,255*delta,255*delta
CameraClsColor God,red*delta,green*delta,Blue*delta ; цвет неба зависит от времени суток
EntityAlpha star,1-delta
SpaceControl(delta,day)
If delta=1 Or delta=0 Then day=-day ; в полдень/полночь сменяем признак половины дня
End Function

Хочу отметить одну деталь. Когда предмет лежит на поверхности, на него тоже действует сила тяжести! Она ежесекундно смещает предмет вниз. Именно поэтому наши животины скатываются в воду, что противоречит привычной для нас логике. Исправляется это изменением одной цифры в коде. Когда вы захотите оптимизировать код и начнете писать что-то типа: "если предмет касается земли, то гравитацию не считать", а в результате время от времени быстро движущиеся предметы будут как бы отскакивать назад, вспомните об этой детали. Животные прыгают и радуются жизни, чтобы показать действие гравитации. Данная гравитация очень проста в использовании, достаточно включить гравитацию для 3Д объекта, и правильно установить радиус коллизии (самое сложное): Лучше всего использовать модели в специализированном формате движка, на котором вы создаете свой шедевр, в моем случае это B3D - жалко, что кроме 3D Max с ним нормально никто больше не работает. Кстати, особенно много глюков заложено в последнем дне. Почему, добравшись до воды, животные перестают прыгать? Почему 1000 деревьев стоит на суше, куча зверюшек попала в воду при одинаковом алгоритме расстановки? Намекаю - все дело в настройках коллизии!

  1. И сказал Бог: да произведет земля душу живую по роду ее, скотов, и гадов, и зверей земных по роду их. И стало так.
  2. И создал Бог зверей земных по роду их, и скот по роду его, и всех гадов земных по роду их. И увидел Бог, что это хорошо.

Здесь ничего нового не происходит, просто новые модели в игру ввели.

  1. И сказал Бог: сотворим человека по образу Нашему [и] по подобию Нашему, и да владычествуют они над рыбами морскими, и над птицами небесными, [и над зверями,] и над скотом, и над всею землею, и над всеми гадами, пресмыкающимися по земле.
  2. И сотворил Бог человека по образу Своему, по образу Божию сотворил его; мужчину и женщину сотворил их.
  3. И благословил их Бог, и сказал им Бог: плодитесь и размножайтесь, и наполняйте землю, и обладайте ею, и владычествуйте над рыбами морскими [и над зверями,] и над птицами небесными, [и над всяким скотом, и над всею землею,] и над всяким животным, пресмыкающимся по земле.

Это самого страшного монстра в игру ввел - персонаж. В общем - начиналось все как обычно: Персонаж - папка, а все монстры - сынки, предназначенные исключительно для экспы: Но как все в релизе изменилось!

  1. И сказал Бог: вот, Я дал вам всякую траву, сеющую семя, какая есть на всей земле, и всякое дерево, у которого плод древесный, сеющий семя; -- вам сие будет в пищу;
  2. а всем зверям земным, и всем птицам небесным, и всякому [гаду,] пресмыкающемуся по земле, в котором душа живая, дал Я всю зелень травную в пищу. И стало так.

А это ролевую систему приладил.

  1. И увидел Бог все, что Он создал, и вот, хорошо весьма. И был вечер, и было утро: день шестой.

В общем день шестой Бог занимался левелдизайном и ролевой системой. С этого момента начался закрытый бета-тест двумя бета-тестерами: Адамом и Евой на тестовой локации "Рай".

На данный момент, мы имеем основу мира.(Как скажут некоторые основное уже сделано :)) Исходники нашей вселенной нам все равно не достать. Придется писать свои. На данном этапе мы не готовы вдохнуть жизнь в наш мир, для этого нужна предварительная подготовка. В следующий раз мы заставим зверюшек шляться по островку (как минимум). Если есть вопросы - пишите (roman_tnp@mail.ru), они будут учтены при более тщательной проработке игровых моментов.




Категория: Blitz3D | Добавил: Pupkin (16.09.2007) | Автор: Роман Прядко
Просмотров: 685 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Статистика

    html counter счетчик посетителей сайта


    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Заделано студией People Soft © 2024