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

Приступим к коду (все что новое, то красным цветом):

новые типы для змейки выглядят так:
Type sn
 Field id%
 Field h%
 Field x#
 Field y#
 Field z#
End Type 

Type snm
 Field id%
 Field s%
 Field x#
 Field y#
 Field z#
End Type
В нашем предидущем коде можно было создать только одну змейку, чтобы их можно было создавать не одну, а более, их нужно както отделять в общем массиве друг от друга, для этого вводим переменную id% которая будет содержать идентификатор змейки... кроме этого создаем еще один параллельный тип, в котором будем хранить координаты головы змеи, чтобы не прочесывать каждый раз основной массив в поисках головы и перемещения ее на новые координаты.

теперь функции:

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#
 Snake.sn=New sn
 Snake\id%=id%
 Snake\h%=h%
 Snake\x#=x#
 Snake\y#=y#
 Snake\z#=z#
 Return id%
End Function
Создание змеи. Сперва подсчитываем сколько змей уже создано, чтобы новой змее выдать следующий уникальный номер. Здесь создаем голову змеи в основном массиве Snake и во вспомогательном SnakeManager создаем запись с координатами головы змеи. ну и естественно возвращаем номер змеи для последующего использования

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#
 Next 

 For i=1 To s
  Snake.sn = New sn
  Snake\id%=id%
  Snake\x#=x#
  Snake\y#=y#
  Snake\z#=z#
  If i=s Then Snake\h%=h% 
 Next

End Function
Добавление кольца змеи. Здесь немножко видоизменено, теперь нам не надо обращаться к первому элементу массива для получения количества промежуточных хранилищ... теперь эта информация хранится в другом массиве... ищем ее там и если есть змея с таким id%, то сохраним во временную переменную s% количество хранилищ. затем создадим нужное количествохранилищ, и самым последним новое кольцо.

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#
   Exit
  EndIf
 Next


 For Snake.sn=Each sn
  If id%=Snake\id% Then
   x1#=Snake\x
   y1#=Snake\y
   z1#=Snake\z
   Snake\x=x#
   Snake\y=y#
   Snake\z=z#
   x#=x1#
   y#=y1#
   z#=z1#
  EndIf
 Next

End Function
Прермещение змеи. Этот код тоже немного изменен... теперь у нас нет переменных x, y и z которые хранили у нас координаты головы, теперь это все хранится во вспомогательном массиве. Ищем их там по id% и если есть такая змея с таким id% то добавляем к координатам головы координаты поступившие в функцию и сохраняем новые значения координат в переменные x, y и z для следующего цикла... затем выбираем из массива все части змеи с идентификатором текущей и "продвигаем" координаты от головы к хвосту...

Function SnakeUpdate()
 For Snake.sn = Each sn
  If Snake\h<>0 Then PositionEntity Snake\h,Snake\x,Snake\y,Snake\z
 Next
End Function
Обновление позиций объектов колец змеи. Здесь все без изменений...


теперь можно создавать не одну змейку, теперь нет лишней переменной s% которая просто так занимала бы место в массиве... кроме этого все стало более приятно глазу и легко в использовании.

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