Посмотрим, что у нас получилось... змея уже умеет ползать, супер! только если бы мы ее сделали из кубиков, то заметили бы, что она не поворачивает голову, и все остальные кольца тоже постоянно находятся в одном положении... это надо исправить... итак к делу!
С углами работа точно такаяже как и с координатами, их надо прописывать голове и потом в процедуру сдвига координат от головы к хвосту добавить сдвиг углов...
итак! возьмем клаву в ежевые рукавицы!!!
добавим в типы поля для сохранения углов объектов:
Type sn
Field id%
Field h%
Field x#
Field y#
Field z#
Field ax#
Field ay#
Field az#
End Type
Type snm
Field id%
Field s%
Field x#
Field y#
Field z#
Field ax#
Field ay#
Field az#
End Type
В процедуру создания добавим сохранение текущего угла головы змеи в поля для углов, чтобы в последствии двигать его по всему телу.
Function SnakeCreate%(h%,s%,x#,y#,z#)
id%=1
For SnakeManager.snm = Each snm
id%=id%+1
Next
SnakeManager.snm=New snm
SnakeManager\id%=id%
SnakeManager\s%=s%
SnakeManager\x#=x#
SnakeManager\y#=y#
SnakeManager\z#=z#
SnakeManager\ax#=EntityPitch(h%)
SnakeManager\ay#=EntityYaw(h%)
SnakeManager\az#=EntityRoll(h%)
Snake.sn=New sn
Snake\id%=id%
Snake\h%=h%
Snake\x#=x#
Snake\y#=y#
Snake\z#=z#
Snake\ax#=EntityPitch(h%)
Snake\ay#=EntityYaw(h%)
Snake\az#=EntityRoll(h%)
Return id%
End Function
в процедуру создания змеи поступает идентификатор объекта, из него и берем углы функциями EntityPitch(h%), EntityYaw(h%), EntityRoll(h%) и прописываем их как в основной так и во вспомогательный массив, во вспомагательный заносится для последующей ротации, а в основной, чтоб змея появилась нормально, до первого ее движения. Чтоб функция SnakeUpdate могла сразу обработать созданную змею.
Не забудем и процедуру добавления сегмента, туда тоже добавим обработку углов:
Function SnakeAddSegment(id%,h%)
For SnakeManager.snm = Each snm
If id%=SnakeManager\id% Then s%=SnakeManager\s%
x#=SnakeManager\x#
y#=SnakeManager\y#
z#=SnakeManager\z#
ax#=SnakeManager\ax#
ay#=SnakeManager\ay#
az#=SnakeManager\az#
Next
For i=1 To s
Snake.sn = New sn
Snake\id%=id%
Snake\x#=x#
Snake\y#=y#
Snake\z#=z#
Snake\ax#=ax#
Snake\ay#=ay#
Snake\az#=az#
If i=s Then Snake\h%=h%
Next
End Function
Здесь мы берем углы из вспомагательного массива SmakeManager (Угол положения головы) и присваиваем его очередному кольцу
Процедуру обновления обновляем одной командой установления угла очередному кольцу
Function SnakeUpdate()
For Snake.sn = Each sn
If Snake\h<>0 Then
PositionEntity Snake\h%,Snake\x#,Snake\y#,Snake\z#
RotateEntity Snake\h%,Snake\ax#,Snake\ay#,Snake\az#
EndIf
Next
End Function
Ну и наконец процедура сдвига координат... в ней нужно добавить обработку углов... добавляем:
Function SnakeMove(id%,x#,y#,z#)
For SnakeManager.snm = Each snm
If id%=SnakeManager\id% Then
SnakeManager\x#=SnakeManager\x#+x#
SnakeManager\y#=SnakeManager\y#+y#
SnakeManager\z#=SnakeManager\z#+z#
x#=SnakeManager\x#
y#=SnakeManager\y#
z#=SnakeManager\z#
ax#=SnakeManager\ax#
ay#=SnakeManager\ay#
az#=SnakeManager\az#
Exit
EndIf
Next
For Snake.sn=Each sn
If id%=Snake\id% Then
x1#=Snake\x
y1#=Snake\y
z1#=Snake\z
ax1#=Snake\ax
ay1#=Snake\ay
az1#=Snake\az
Snake\x=x#
Snake\y=y#
Snake\z=z#
Snake\ax=ax#
Snake\ay=ay#
Snake\az=az#
x#=x1#
y#=y1#
z#=z1#
ax#=ax1#
ay#=ay1#
az#=az1#
EndIf
Next
End Function
Берем координаты головы из Вспомогательного массива SnakEManager и присваиваем их следующему кольцу (или временному хранилищу)... короче все точно также как и с координатами...
Кроме всего этого добавляем в код функцию поворота головы змеи
Function SnakeSetAngle(id%,ax#,ay#,az#)
For SnakeManager.snm = Each snm
If id=SnakeManager\id% Then
SnakeManager\ax#=ax#
SnakeManager\ay#=ay#
SnakeManager\az#=az#
Exit
EndIf
Next
End Function
здесь все просто... ищем во вспомогательном массиве нужную змею (id%) и прописываем углы... в последующем процедура SnakeMove возьмет отсюда эти углы и присвоит их голове а в последствии и всем кольцам тела змеи.
пример рабочего кода на этом шаге лежит в аттаче