Показать сообщение отдельно
Старый 21.07.2006, 18:43   #5
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Сообщение Туториал "Змейка" (углы)

Посмотрим, что у нас получилось... змея уже умеет ползать, супер! только если бы мы ее сделали из кубиков, то заметили бы, что она не поворачивает голову, и все остальные кольца тоже постоянно находятся в одном положении... это надо исправить... итак к делу!

С углами работа точно такаяже как и с координатами, их надо прописывать голове и потом в процедуру сдвига координат от головы к хвосту добавить сдвиг углов...

итак! возьмем клаву в ежевые рукавицы!!!


добавим в типы поля для сохранения углов объектов:
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 возьмет отсюда эти углы и присвоит их голове а в последствии и всем кольцам тела змеи.


пример рабочего кода на этом шаге лежит в аттаче
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием