Графика (ЧАСТЬ 3 - FPS)
Выпала минутка, и вот я уже за версткой новой страницы. Надеюсь вы довольны выходом нового, пускай и запоздалого урока :3 Я кст все ещё не перестаю удивляться тому, что на свете остались такие патриоты этой давно уже умершей консоли, готовые под неё программировать. Вечная Слава нам!. Я даже скажу вам большее - PSP мне до сих пор заменяет по функционалу всякие недо Android-ы и Ios-ы, которые не более чем маркетинговый ход современного рынка - особенно это касается огрызка идиотов. ^^ Ну да не будем разводить холивар, приступим к уроку.
Сегодня я в первой части покажу вам как поворачивать картинку вокруг собственной оси, по средствам "пиксельной" частичной выборки из исходника, а во второй вы научитесь выводить на экран такое системное значение, как FPS (Frames Per Second), или же по русски - частота смены кадров на экране. Согласитесь немаловажная вещь при написании глобальных проектов, требующих объективной оценки продуктивности написанного кода.
Сегодня я в первой части покажу вам как поворачивать картинку вокруг собственной оси, по средствам "пиксельной" частичной выборки из исходника, а во второй вы научитесь выводить на экран такое системное значение, как FPS (Frames Per Second), или же по русски - частота смены кадров на экране. Согласитесь немаловажная вещь при написании глобальных проектов, требующих объективной оценки продуктивности написанного кода.
I) "Пиксельная" выборка:
Достаточно простая и интересная функция, позволяющая вам избавиться от повторяющихся картинок, отличающихся лишь поворотом вокруг собственной оси.
Код:
img1=Image.load("img.png")--загрузка первичной картинки, которую мы хотим развернуть
img2=Image.createEmpty(img1:width(),img1:height())--создание пустого шаблона исходного размера, который мы потом заполним нужными "пикселями" на нужном месте
--сердце проекта,заполнение шаблона нужными "пикселями" из исходной картинки
for i=0,img1:width() do
for j=0,img1:height() do
img2:blit(i,j,img1,img1:width()-i,j,1,1)--это уже давно вам знакомая функция впечатывания картинки в картинку
end
end
img2=Image.createEmpty(img1:width(),img1:height())--создание пустого шаблона исходного размера, который мы потом заполним нужными "пикселями" на нужном месте
--сердце проекта,заполнение шаблона нужными "пикселями" из исходной картинки
for i=0,img1:width() do
for j=0,img1:height() do
img2:blit(i,j,img1,img1:width()-i,j,1,1)--это уже давно вам знакомая функция впечатывания картинки в картинку
end
end
Как видите я впечатывал циклами лишь участок исходной картинки img1 а точнее это был постоянно меняющийся участок размером 1x1 и позициями i и j
while true do
screen:clear()
pad=Controls.read()
screen:blit(0,0,img1)
screen:blit(100,0,img2)
if pad:start() then break end
screen:flip()
end
В качестве brain faq вот вам задачка - напишите алгоритм зеркального отображения картинки относительно диагонали
II) FPS:
Без лишних слов сразу к коду)
Скажу лишь только то, что работает код благодаря использованию системного таймера PSP.
Код:
last_time=0--обнуление предыдущее время
loop=0--обнуляю счетчик частоты смены числа FPS на экране
time_FPS=Timer.new()--инициализирую таймер time_FPS
time_FPS:reset(0)--обнуляю таймер time_FPS
time_FPS:start()--запускаю таймер time_FPS
current_time=0--обнуляю текущее время
FPS=0--и онуляю текущее FPS
loop=0--обнуляю счетчик частоты смены числа FPS на экране
time_FPS=Timer.new()--инициализирую таймер time_FPS
time_FPS:reset(0)--обнуляю таймер time_FPS
time_FPS:start()--запускаю таймер time_FPS
current_time=0--обнуляю текущее время
FPS=0--и онуляю текущее FPS
while true do
screen:clear()
pad=Controls.read()
if loop<2 then--частота обновления экрана
last_time=current_time--предыдущее время приравниваю к текущему
current_time=time_FPS:time()--а текущее время заменяю на время полученное от таймера time_FPS
FPS=1000/(current_time-last_time)--А вот тут самый смак - математическое вычисление FPS путем деления 1000мс (1 сек.) на разность времен текущего и предыдущего. То есть определение провисания процессора при обработке кода.
end
if loop>50 then loop=0 else loop=loop+1 end--накручиваю счетчик обновления экрана до 50, чтобы не так уж сильно мельтешил экран :3
screen:print(1,1,"FPS = "..math.floor(FPS),Color.new(255,255,255))--где math.floor() - это округление в меньшую сторону
if pad:start() then break end
screen:flip()
end
screen:clear()
pad=Controls.read()
if loop<2 then--частота обновления экрана
last_time=current_time--предыдущее время приравниваю к текущему
current_time=time_FPS:time()--а текущее время заменяю на время полученное от таймера time_FPS
FPS=1000/(current_time-last_time)--А вот тут самый смак - математическое вычисление FPS путем деления 1000мс (1 сек.) на разность времен текущего и предыдущего. То есть определение провисания процессора при обработке кода.
end
if loop>50 then loop=0 else loop=loop+1 end--накручиваю счетчик обновления экрана до 50, чтобы не так уж сильно мельтешил экран :3
screen:print(1,1,"FPS = "..math.floor(FPS),Color.new(255,255,255))--где math.floor() - это округление в меньшую сторону
if pad:start() then break end
screen:flip()
end
Ну вот и все пожалуй на сегодня - верстку быть может ещё завтра подправлю, а пока желаю вам приятных выходных и грядущих каникул.