14 февраля 2010 в 15:27
Blitz3d уроки - 8. Родительская зависимость, часть 2
А вот что можно сделать, если правильно использовать технологию привязок:
Алгоритм галактики:
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
Если вы запустите этот код, то увидите как шарики делают поступательное движение (летают) вокруг куба по кругу. На самом деле всё проще! Эти шары просто находятся в родительской зависимости от куба, и остаются на месте, а поворачивается только куб – ну, а они вместе с ним! Так, допустим, что нам этот алгоритм понравился, и мы захотели всунуть его в нашу игру, но нас немного смущает этот куб в середине. Конечно, можно его как подобает затекстурировать, и сказать, мол, это наш антигравитационный голографический транс-хренолятор, или сделать сферу, и сказать, что это чёрная дырища (и такое в нашей практике бывает, когда лень чего-нить исправлять), но здесь мы поступим по-другому.
Помните, в самом начале я перечислял какими бывают объекты, и упомянул о Пивотах. Так вот – пивот – это просто точка в пространстве, она невидимая, но у неё есть (как и всех остальных объектов) своя система координат, а значит – своё направление. Пивоты – это очень полезные объект, когда дело касается всяких там привязок. Уже догадались, что мы собираемся сделать? Неправильно – мы собираемся заменить этот куб в середине на пивот… А, вы так и подумали? Ну, тогда, заменим команду сами знаете чего на команду создания пивота:
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 (ноль, если кто не понял) – и это «отвяжет» заданный объект от родителя, каким бы страшным этот родитель ни был
Ну, и напоследок – то, что можно сделать, изучив технологию привязок:
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 – посмотрите в хелпе, потому что, даже если вы совершенно ничего не знаете в английском – в хелп придётся обращаться очень часто, поэтому, лучше учиться сейчас.
комментарии отсутствуют
авторизуйтесь