Заморочился
Обработка спрайта
Код
//Работа с мульти-изображением
//Чистка лога
log clear
//Установка константных значений
//Ширина одного спрайта в писклелах:
set #sprite_size_x 5
//Высота одного спрайта в пикселах:
set #sprite_size_y 5
//Имя файла
set $filename sprite.bmp
//Рабочая часть
//Загрузка изображения
set %sprite[1] LoadImage($filename)
if (size(%sprite) = 0)
log Ошибка загрузки файла $filename
end_if
//Если ширина загруженного изображения не кратна #sprite_size_x
if (mod(%sprite[1 2] #sprite_size_x) > 0)
log Изображение имеет некорректную ширину.
set $rf DeleteImage(%sprite[1 1])
//обработка ошибок
if ($rf < 0)
log Ошибка освобождения ресурсов.
end_if
end_if
//Таже проверка для высоты
if (mod(%sprite[1 3] #sprite_size_y) > 0)
log Изображение имеет некорректную высоту.
set $rf DeleteImage(%sprite[1 1])
//обработка ошибок
if ($rf < 0)
log Ошибка освобождения ресурсов.
end_if
end_if
//Изображение загружено, теперь нужно вычислить длину строки спрайта в байтах
set #sprite_raw_size #sprite_size_x * 3
//Получили размер строки спрайта, теперь остается разбить исходную картинку на зоны спрайтов
//Картинка по сути похожа на массив :
//[1][2][3][4][5]
//[6][7][8][9][10]
//и тд.
//Только вместо индексов лежат мини-картинки.
//LoadImage дает нам адрес всей картинки, начиная с 1 байта, т.е. адрес указывает на первый спрайт.
//Для расчета адресов всех спрайтов у нас есть все что нужно : размеры спрайта, размер строки байт спрайта и начальный адрес
//Кол-во индексов X
set #sprite_cnt_x %sprite[1 2] / #sprite_size_x
//Кол-во индексов Y
set #sprite_cnt_y %sprite[1 3] / #sprite_size_y
//Последний рассчитанный адрес, начальное значение адрес, вернувшийся из LoadImage
set #last_sprite_addr %sprite[1 1]
//Формируем спрайты
//Спрайты расположены в виде матрицы, как описано выше
//Запускаем перебор всей матрицы с шагами раными размерам одного спрайта
for #y 1 #sprite_cnt_y #sprite_size_y
for #x 1 #sprite_cnt_x #sprite_size_x
//рассчитаем индекс(для массива с результатом) обрабатываемого спрайта
set #array_index #sprite_cnt_x * (#y - 1) + #x
//Заполним его
//ТУТ Я ЗАПУТАЛСЯ, НАДО ГДЕ-ТО ИСПРАВИТЬ
//(#SPRITE_RAW_SIZE * #sprite_cnt_x) * (#y - 1) + ((#x - 1) * #sprite_raw_size)
//set #last_sprite_addr #last_sprite_addr + (#sprite_raw_size * #sprite_cnt_x) * (#y - 1) + (((#x - 1) * #sprite_raw_size) * #sprite_size_y)
set #last_sprite_addr #last_sprite_addr + ((#y - 1) * #sprite_size_y) * (#sprite_raw_size * #sprite_cnt_x) + (#x - 1) + #sprite_raw_size
set %sprites[#array_index 1] #last_sprite_addr
set %sprites[#array_index 2] #sprite_size_x
set %sprites[#array_index 3] #sprite_size_y
set %sprites[#array_index 4] #sprite_raw_size
end_for
end_for
//Теперь %sprites содержит список всех загруженных спрайтов (в изображении-примере их 2601)
//Получить доступ к конкретному спрайту можно через индекс, расчитывается так :
//<кол-во столбцов массива> * (#y - 1) + #x
//#x, #y - начальные координаты нужного спрайта
end_script
Идея в том, чтобы все искомые картинки слепить в один bmp, дальше их раздербанить и использовать.
В одном изображении 255х255 содержится 2601 спрайт размером 5х5, если я правильно посчитал.
Работу не тестил, кто сможет - отпишитесь. Так же там я поставил небольшую пометку что я ошибся в формуле, правильный вариант написан (вроде), но я не помню какой.
Не знаю, сколько времени займет вызов 2600 LoadImage, но такой скрипт отрабатывает за пару секунд без оптимизаций.