Обработка массива объектов (20 мин)
В предыдущих программах уже создавались множества однотипных объектов, но дальше в программе с ними не происходило никаких изменений. Адрес этих объектов терялся, так как мы, создавая новый объект в цикле, присваивали его адрес одной и той же переменной. Для сохранения этих адресов в памяти воспользуемся массивами.
Напишем программу, которая перемещает в пространстве 100 звезд по разным траекториям. Сначала – заголовок. Здесь создается камера и загружается спрайт:
GRAPHICS3D 640,480
cam = CREATECAMERA()
POSITIONENTITY cam, 0, 0, -20
star = LOADSPRITE("C:\MEDIA\STAR.JPG")
Теперь необходимо разобраться с физической моделью программы. Изначально, 100 звезд размещаются в пространстве случайным образом. Каждая звезда имеет приращения по каждой из координатных осей, которые сначала равняются нулю, но изменяются, в зависимости от положения звезды относительно начала координат. То есть, если какая-либо координата положительна, то приращение уменьшается, если отрицательна – увеличивается. Это приводит к тому, что звезда будет кружиться вокруг начала координат по изогнутой траектории, которую называют кривой Лиссажу.
Создадим три массива. Первый будет содержать адреса спрайтов, второй – их координаты, третий – приращения. Так как координат всего три, а звезд – 100, то второй и третий массивы будут иметь размерность 100 x 3. Звезда n будет иметь адрес addr(n), располагаться в точке с координатами x = c#(n, 1), y = c#(n, 2), z = c#(n, 3) и иметь приращения dx = dc#(n, 1), dy = dc#(n, 2), dz = dc#(n, 3)
DIM addr(100)
DIM c#(100, 3)
DIM dc#(100, 3)
В следующем цикле создается 100 звезд
FOR n
= 1 TO 100
addr(n) = COPYENTITY(star)
FOR nn = 1 TO 3
Каждая из трех координат приравнивается к случайному значению от –8 до 8.
C#(n, nn) = RND(-8, 8)
NEXT
NEXT
Далее следует бесконечный цикл, в котором для каждой из 100 звезд изменяются координаты и приращения, а также происходит визуализация трехмерной сцены:
REPEAT
В двух вложенных циклах к каждой координате каждой звезды прибавляется ее приращение. Затем в зависимости от знака координаты, приращение изменяется (если с#(n, nn) < 0, то SGN(с#(n, nn)) = -1 и приращение увеличивается на 0.005 и наоборот). Затем спрайт звезды помещается в точку, заданную координатами.
FOR n = 1 TO 100
FOR nn = 1 TO 3
c#(n, nn) = c#(n, nn) + dc#(n, nn)
dc#(n, nn) = dc#(n, nn) - 0.005 * SGN(c#(n, nn))
NEXT
POSITIONENTITY addr(n), c#(n,1), c#(n,2), c#(n,3)
NEXT
IF KEYDOWN(1) THEN EXIT
RENDERWORLD
FLIP
FOREVER