Может поможет.

//для удобства зададим числа для размера массива в начале
const
min_bullets=1; //минимальное количество пуль
max_bullets=20;//максимальное кол-во пуль
//создадим тип данных типа record, те "название типа" bulletType, в нем содержаться переменные x,y и скорости пули, картинка пули
type bulletType = record
bullet_x,bullet_y,bullet_speed: integer;
bullet_img:image;
end;
//переменные
var
game:boolean;//используется для того что бы определять выполняется главный цикл игры или нет
bullets_arr:array[min_bullets..max_bullets] of bulletType;//массив пуль типа bulletType, размером от min_bullets до max_bullets,
//в каждой ячейке массива содержиться запись с полями x,y, скорости и картинки пули.
bullet_img:image;//картинка пули для массива
i,lastBulletUpdate:integer;//i - вспомогательная переменная, lastBulletUpdate - относительное время в миллисекундах
//Начало самой программы, начинаем назначать переменные, заполнять массив, вобщем подготавливаем данные для игры
begin
LastBulletUpdate := GetRelativeTimeMs; // запоминаем время (значенеи представляет из себя просто число в целом (integer) формате
game:=true; // это нужно для того что бы заработалглавный цикл
bullet_img:=loadImage('/icon.png');//загрузка картинки пули, используется стандартный значек в midletpascal, для совместимости
//начинаем запонять массив данными
for i:=min_bullets to max_bullets do //начинается цикл который выполниться от min_bullets До max_bullets (те 20 раз, мы установили значение этой константы в начале) раз
begin
//принцип заполнение массива типа record такой: имя_массива[номер ячейки].переменная_которая_есть_в_данном_типе:=значение;
bullets_arr[i].bullet_x:=random(getWidth);//ставим положение по x (ширина) случайным (при помощи random()) значение которого от 0 до getWidth (функция возвращает ширину экрана телефона, те x)
bullets_arr[i].bullet_y:=0;//ставим y=0, тк пуля должна по задумке падать :) те ставим на самый верх экрана. Y - высота
bullets_arr[i].bullet_img:=bullet_img; //назначаем ячейке под номером i и полю которая в нем содержиться рисунок который мы ранее загрузили в переменную bullet_img
bullets_arr[i].bullet_speed:=random(3)+1;//ставим случайно скорость пули от 1 до 4, "+1" нужно для того, что бы скорость не была равна 0 (random возвращает значение от 0)
end;
//главный цикл(цыкл) :))
while (game=true) do //"пока game=true выполнять следующий код"
begin
while isMidletPaused do//смысл в следующем:"если мидлет приостоновлен (свернули, приостоновили - те например вышли на главный экран у мобилы)
begin // то выполнять следующий код - "задержка 100 мсек". Все это нужно что бы в свернутом состоянии мидлет не грузил телефон - становился на "паузу"
delay(100);
end;
if getKeyClicked = KE_KEY1 then //"если нажать 1 то game станет равно false" и мидлет завершит свою работу
begin
game:=false;
end;
setColor(0, 0, 0);//ставим цвет рисования rgb как черный
fillRect(0, 0, getwidth, getheight); //рисуем черный квадрат во весь экран, это нжно для того что бы за объектами не оставался шлейф
//смысл в следующем: в самом начале кода мы запомнили значение LastBulletUpdate, теперь вычитая из текушего значения времени (GetRelativeTimeMs) ранее запомненое значение LastBulletUpdate мы получим сколько прошло с того момента,
//если значение >100 (те 0.1 сек(1000=1сек)) выполняется нижеследующий код.
if ((GetRelativeTimeMs - LastBulletUpdate) > 100) then
begin
LastBulletUpdate := GetRelativeTimeMs;//снова запоминаем текущее время, оно нам понадобиться для того что бы узнать что снова прошло еще 0.1сек
//начинаем перебор массива
for i:=min_bullets to max_bullets do
begin
bullets_arr[i].bullet_y:=bullets_arr[i].bullet_y+bullets_arr[i].bullet_speed;//увеличиваем y (высоту) положения пули на скоростьс которой она литит
//проверяем если пуля ушла ли пуля за экран (те опустилась ниже высоты экрана)
if bullets_arr[i].bullet_y>=getheight then
begin
//если условие выполняется, те пуля ниже высоты экрана
bullets_arr[i].bullet_y:=0;//поднимает пулю опять на верх
bullets_arr[i].bullet_speed:=random(3)+1;//снова случайно назначаем скорость пули
bullets_arr[i].bullet_x:=random(getwidth);//и случайно ставим по ширине экрана
end;
end;
end;
//теперь снова перебирая массив пуль отрисовываем каждую пулю в определенной точке экрана, этот перебор нужен потому,что если поствить его в предыдущий (где изменяется координаты пули) пуля будет отрисовывать только раз в секунду.
for i:=min_bullets to max_bullets do
begin
drawImage(bullets_arr[i].bullet_img, bullets_arr[i].bullet_x, bullets_arr[i].bullet_y);
end;
//обновляем экран
repaint;
end;
end.