Приступим к коду (все что новое, то красным цветом):
новые типы для змейки выглядят так:
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% которая просто так занимала бы место в массиве... кроме этого все стало более приятно глазу и легко в использовании.
пример рабочего кода этого шага лежит в аттаче