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

Приступим к написанию кода:

будем писать используя динамичный массив типов

создадим тип массива для змеи:
Type sn
 Field h%
 Field s%
 Field x#
 Field y#
 Field z#
End Type
значения переменных:
h - будет хранить хендл объекта головы или кольца змеи
s - будет использоваться только в первом элементе массива, и будет задавать количество "хранилищ" координат между кольцами змеи
x, y и z - будут хранить сами координаты кольца, или просто промежуточные координаты.

Создадим саму змею т.е. создадим динамичный массив и заполним его первыми характеристиками:
Snake.sn=New sn

Snake\h%=CreateSphere()
Snake\s%=5
Snake\x#=0
Snake\y#=0
Snake\z#=0
вот мы создали голову змеи, в h занесем сам объект для отображения головы, в s запишем сколько будет хранилищ координат до первого кольца. Присвоим голове змеи изначальные координаты, в этом случае это будут 0,0,0 (середина мира)

создадим одно кольцо для змеи:
Snake.sn=First sn
j=Snake\s%
x=Snake\x#
y=Snake\y#
z=Snake\z#

Snake.sn = Last sn
For i%=1 To j
 Snake.sn=New sn
 Snake\x#=x#
 Snake\y#=y#
 Snake\z#=z#
 If i%=j% Then Snake\h%=CreateSphere()   
 k%=k%+1
Next
для создания кольца, нам нужно "спросить" у головы сколько создавать резервных хранилищ... перемещаем индикатор указателя в массиве в самое начало (Snake.sn=First sn) затем присваиваем какойнить резервной переменной количество хранилищ (j=Snake\s%). Я еще сохранял резервно координаты, чтоб змея появилась в одной точке, это не особо-важно, можно не делать.

далее, переместим индикатор указателя в конец массива и приступим к созданию: запускаем цикл создающий резервные хранилища, и в этом цикле зададим условие (If i%=j%) если цикл идет последний раз, то надо вместо простого хранилища создать само кольцо... на самом деле хранилище отличается от кольца только наличием объекта отображающегося на экране... запишем в s индентификатор какого-нибудь объекта...

теперь уже становится интересней... чтобы отобразить змейку на экране, используется такой код:
 For Snake.sn = Each sn
  If Snake\h<>0 Then PositionEntity Snake\h,Snake\x,Snake\y,Snake\z
 Next
Здесь мы просто запускаем цикл, и если в переменной h что-нибудь записано (какойнибудь объект) то позиционируем его согласно новых позиций.

Ну а теперь самое интересное.. процедура перемещения координат от головы к хвосту... в нормальном случае, используя массив, цикл должен запускаться от конца к началу, чтобы не затирать старые координаты новыми, но за неимением такового цикла в блице, и из-за сложности адресации в типах сделаем все проще и понятней:

x1#=x#
y1#=y#
z1#=z#

If KeyDown(200) Then z=z+0.2
If KeyDown(208) Then z=z-0.2
If KeyDown(203) Then x=x-0.2
If KeyDown(205) Then x=x+0.2

If x1#<>x# Or y1#<>y# Or z1#<>z# Then
; rotate snake

x2#=x#
y2#=y#
z2#=z#

 For Snake.sn=Each sn

   x1#=Snake\x
   y1#=Snake\y
   z1#=Snake\z

   Snake\x=x#
   Snake\y=y#
   Snake\z=z#

   x#=x1#
   y#=y1#
   z#=z1#

 Next

x#=x2#
y#=y2#
z#=z2#
в переменных x, y и z хранятся координаты головы

сначала сохраняем координаты в каких-нибудь резервных переменных, затем спрашиваем игрока не соизволит ли он нажать какуюнибудь клавишу (если соизволит, то изменим соответствующие координаты). после этого проверяем изменилось ли значение переменных координат, путем сравнения их с резервными переменными, в них ведь старые координаты лежат.
Если координаты изменились, то запускаем процедуру перемещения всей змеи:
для выполнения процедуры нам потребуется сохранить переменные координат, поскольку после прохождения цикла в них будет не то, что было раньше. сама процедура состоит из одного цикла, который пройдет по всем ячейкам змеи.
в цикле: временно сохраним координаты (для следующего шага) (x1#=Snake\x), присвоим новые координаты этой ячейке (Snake\x=x#), и затем присвоим временно сохраненные координаты основным переменным для того, чтобы на следующем шаге цикла присвоить их следующей ячейке массива (x#=x1#)...

после прохождения цикла в переменных x, y и z хранятся координаты последнего кольца змеи... восстановим их, чтобы там снова хранились координаты головы змеи (x#=x2#)

вот впринципе и всё! теперь собрав весь код вместе уже можно получить змею, которая будет ползать в зависимости от нажатия клавиш...

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