8. Фишки с привязками

 

А вот что можно сделать, если правильно использовать технологию привязок:

 

Алгоритм галактики:

 

SeedRnd MilliSecs()

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

lit=CreateLight()

 

Dim sp(99)

 

center=CreateCube()

 

For i=0 To 99

 sp(i)=CreateSphere(8,center)

 ScaleEntity sp(i),.2,.2,.2

 PositionEntity sp(i),Rnd(-20,20),Rnd(-20,20),Rnd(-20,20)

Next

 

cam=CreateCamera()

PositionEntity cam,0,0,-40

 

 

Repeat

 

 TurnEntity center,.0,.5,.5

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

Если вы запустите этот код, то увидите как шарики делают поступательное движение (летают J) вокруг куба по кругу. На самом деле всё проще! Эти шары просто находятся в родительской зависимости от куба, и остаются на месте, а поворачивается только куб – ну, а они вместе с ним! Так, допустим, что нам этот алгоритм понравился, и мы захотели всунуть его в нашу игру, но нас немного смущает этот куб в середине. Конечно, можно его как подобает затекстурировать, и сказать, мол, это наш антигравитационный голографический транс-хренолятор, или сделать сферу, и сказать, что это чёрная дырища (и такое в нашей практике бывает, когда лень чего-нить исправлять J), но здесь мы поступим по-другому.

Помните, в самом начале я перечислял какими бывают объекты, и упомянул о Пивотах. Так вот – пивот – это просто точка в пространстве, она невидимая, но у неё есть (как и всех остальных объектов) своя система координат, а значит – своё направление. Пивоты – это очень полезные объект, когда дело касается всяких там привязок. Уже догадались, что мы собираемся сделать? Неправильно – мы собираемся заменить этот куб в середине на пивот… А, вы так и подумали?… J Ну, тогда, заменим команду сами знаете чего на команду создания пивота:

 

center=CreatePivot()

 

Всё – теперь мы можем наслаждаться видом крутящегося скопления звёзд без всяких там лишних вещей!

 

Но не обязательно делать такую одинарную привязку - можно привязать один объект к другому, который в свою очередь привязан к третьему – тот к четвёртому, и так далее… Для чего это делать? А вот посмотрите пример:

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

lit=CreateLight()

 

Dim prv(2)

 

prv(0)=CreateCube()

 

prv(1)=CreateCube(prv(0))

PositionEntity prv(1),5,0,0

prv(2)=CreateCube(prv(1))

PositionEntity prv(2),5,0,0

 

obj=CreateSphere(8,prv(2))

PositionEntity obj,5,0,0

 

cam=CreateCamera(0)

PositionEntity cam,0,0,-30

 

 

Repeat

 

 For i=0 To 2

  TurnEntity prv(i),0,0,1

 Next

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

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

Несколько дополнений:

 

1) Помните - синтакс команды создания сферы таков: CreateSphere ( количество сегментов, [родитель] ) – очень частой ошибкой является то, что в поле, где указывается количество сегментов, вместо них указывают родителя…

 

2) Задать привязку можно не только во время создания объекта, но и после этого – командой EntityParent объект, родитель – эта команда привязывает заданный объект к заданному родителю. Вместо родителя можно поставить 0 (ноль, если кто не понял J) – и это «отвяжет» заданный объект от родителя, каким бы страшным этот родитель ни был JJJ

 

Ну, и напоследок – то, что можно сделать, изучив технологию привязок:

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

lit=CreateLight()

 

Dim sp(99)

 

sp(0)=CreateSphere(8)

EntityAlpha sp(0),0

 

For i=1 To 99

 sp(i)=CreateSphere(8,sp(i-1))

 PositionEntity sp(i),1,1,1

 EntityColor sp(i),250,215,i*2

 EntityAlpha sp(i),(100-i)*.01

Next

 

cam=CreateCamera(0)

PositionEntity cam,0,30,0

 

 

Repeat

 

 For i=0 To 99

  TurnEntity sp(i),.1,.2,.3

 Next

 

 PointEntity cam,sp(99)

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

Ну, вы поняли, как это работает? Ну, давайте – подумайте! Вы же всё-таки программеры – даже если вы задумали всю жизнь программировать один, вам всё равно придётся читать чужие коды – чтобы понять как работает та или иная фишка. А про команду EntityAlpha – посмотрите в хелпе, потому что, даже если вы совершенно ничего не знаете в английском – в хелп придётся обращаться очень часто, поэтому, лучше учиться сейчас… J.

 

 

 Оглавление:

 

0.  Введение

1.  В начале была Тьма

2.  Есть ли жизнь в DirectX

3.  Свобода и Власть 3Д (0)

4.  Свобода и Власть 3Д (1)

5.  2Д в 3Д

6.  Трёхмерный курсор

7.  Родительская зависимость или Привязки

8.  Фишки с привязками

9.  Коллизион Детекшн или как устроен мир…

10.     Первая 3Д игра. Часть 0 – основы движка

11.     Первая 3Д игра. Часть 1 – разработка движка

12.     Первая 3Д игра. Часть 2 – устранение багов

13.     Первая 3Д игра. Часть 3 – внешний вид

14.     Первая 3Д игра. Часть 4 – от массива к спискам

15.     Первая 3Д игра. Часть 5 – оптимизация кода

16.     Первая 3Д игра. Часть 6 – завершение

17.     Выведение

 

 

 

 

Используются технологии uCoz