Уже более 2 лет являюсь обладателем PSP, внезапно решил попробовать что-нибудь написать для неё. Писать под псп можно либо на с++, либо на lua. C++ был отброшен за неимением linux'a под рукой и проблемами с установкой среды разработки.
Чтобы запускать lua скрипты, потребуется
Основы синтаксиса Lua и функциональные возможности можно посмотреть на сайте разработчика -
Итак, можно приступать к разработке. В качестве примера приведу скрипт, рисующий проекцию куба на плоскость.
Объявим необходимые переменные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
--Обозначим основные цвета white = Color.new(255,255,255) black = Color.new(0,0,0) --Массивы для хранения значений синуса и косинуса --Для ускорения вычислений s = {}; c = {} --Пи pi = math.pi --Координаты центра проекции куба x, y, z = 200, 130, 256 --Углы поворота alpha, beta = 0, 0 alphaR, betaR = 2, 2 -- firstRun = 1 --Массивы для хранения координат ребер куба --old* - координаты для стирания линий после поворота oldX = {}; oldY = {} newX = {}; newY = {} --Массивы для хранения оригинальных координат линий и координат после поворота O = {}; R = {} |
Ускорим смерть аккумулятора PSP:
1 2 |
--Устанавливаем частоту cpu System.setCpuSpeed(333) |
Предварительно вычислим значения синуса, косинуса и сохраним в массив:
1 2 3 4 |
for i=0,360 do s[i] = math.sin(i * (pi / 180)) c[i] = math.cos(i * (pi / 180)) end |
Зададим начальные координаты ребер проекции куба (можно было бы покрасивее оформить, но ...):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
--ZOMG O[0 .. ':' .. 0 .. ':' .. 0] = -50; O[0 .. ':' .. 0 .. ':' .. 1] = 50; O[0 .. ':' .. 0 .. ':' .. 2] = 50; O[0 .. ':' .. 1 .. ':' .. 0] = 50; O[0 .. ':' .. 1 .. ':' .. 1] = 50; O[0 .. ':' .. 1 .. ':' .. 2] = 50; O[1 .. ':' .. 0 .. ':' .. 0] = 50; O[1 .. ':' .. 0 .. ':' .. 1] = -50; O[1 .. ':' .. 0 .. ':' .. 2] = 50; O[1 .. ':' .. 1 .. ':' .. 0] = 50; O[1 .. ':' .. 1 .. ':' .. 1] = 50; O[1 .. ':' .. 1 .. ':' .. 2] = 50; O[2 .. ':' .. 0 .. ':' .. 0] = 50; O[2 .. ':' .. 0 .. ':' .. 1] = 50; O[2 .. ':' .. 0 .. ':' .. 2] = -50; O[2 .. ':' .. 1 .. ':' .. 0] = 50; O[2 .. ':' .. 1 .. ':' .. 1] = 50; O[2 .. ':' .. 1 .. ':' .. 2] = 50; O[3 .. ':' .. 0 .. ':' .. 0] = -50; O[3 .. ':' .. 0 .. ':' .. 1] = -50; O[3 .. ':' .. 0 .. ':' .. 2] = 50; O[3 .. ':' .. 1 .. ':' .. 0] = -50; O[3 .. ':' .. 1 .. ':' .. 1] = 50; O[3 .. ':' .. 1 .. ':' .. 2] = 50; O[4 .. ':' .. 0 .. ':' .. 0] = -50; O[4 .. ':' .. 0 .. ':' .. 1] = 50; O[4 .. ':' .. 0 .. ':' .. 2] = -50; O[4 .. ':' .. 1 .. ':' .. 0] = -50; O[4 .. ':' .. 1 .. ':' .. 1] = 50; O[4 .. ':' .. 1 .. ':' .. 2] = 50; O[5 .. ':' .. 0 .. ':' .. 0] = -50; O[5 .. ':' .. 0 .. ':' .. 1] = -50; O[5 .. ':' .. 0 .. ':' .. 2] = 50; O[5 .. ':' .. 1 .. ':' .. 0] = 50; O[5 .. ':' .. 1 .. ':' .. 1] = -50; O[5 .. ':' .. 1 .. ':' .. 2] = 50; O[6 .. ':' .. 0 .. ':' .. 0] = -50; O[6 .. ':' .. 0 .. ':' .. 1] = 50; O[6 .. ':' .. 0 .. ':' .. 2] = -50; O[6 .. ':' .. 1 .. ':' .. 0] = 50; O[6 .. ':' .. 1 .. ':' .. 1] = 50; O[6 .. ':' .. 1 .. ':' .. 2] = -50; O[7 .. ':' .. 0 .. ':' .. 0] = -50; O[7 .. ':' .. 0 .. ':' .. 1] = -50; O[7 .. ':' .. 0 .. ':' .. 2] = -50; O[7 .. ':' .. 1 .. ':' .. 0] = 50; O[7 .. ':' .. 1 .. ':' .. 1] = -50; O[7 .. ':' .. 1 .. ':' .. 2] = -50; O[8 .. ':' .. 0 .. ':' .. 0] = -50; O[8 .. ':' .. 0 .. ':' .. 1] = -50; O[8 .. ':' .. 0 .. ':' .. 2] = -50; O[8 .. ':' .. 1 .. ':' .. 0] = -50; O[8 .. ':' .. 1 .. ':' .. 1] = 50; O[8 .. ':' .. 1 .. ':' .. 2] = -50; O[9 .. ':' .. 0 .. ':' .. 0] = 50; O[9 .. ':' .. 0 .. ':' .. 1] = -50; O[9 .. ':' .. 0 .. ':' .. 2] = -50; O[9 .. ':' .. 1 .. ':' .. 0] = 50; O[9 .. ':' .. 1 .. ':' .. 1] = -50; O[9 .. ':' .. 1 .. ':' .. 2] = 50; O[10 .. ':' .. 0 .. ':' .. 0] = 50; O[10 .. ':' .. 0 .. ':' .. 1] = -50; O[10 .. ':' .. 0 .. ':' .. 2] = -50; O[10 .. ':' .. 1 .. ':' .. 0] = 50; O[10 .. ':' .. 1 .. ':' .. 1] = 50; O[10 .. ':' .. 1 .. ':' .. 2] = -50; O[11 .. ':' .. 0 .. ':' .. 0] = -50; O[11 .. ':' .. 0 .. ':' .. 1] = -50; O[11 .. ':' .. 0 .. ':' .. 2] = -50; O[11 .. ':' .. 1 .. ':' .. 0] = -50; O[11 .. ':' .. 1 .. ':' .. 1] = -50; O[11 .. ':' .. 1 .. ':' .. 2] = 50; |
Процедура рисования проекции куба:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
--Бесконечный цикл while true do --Цикл по количеству ребер куба for i=0,11 do --Сохраняем старые координаты для последующего стирания oldX[i .. ':' .. 0] = newX[i .. ':' .. 0]; oldY[i .. ':' .. 0] = newY[i .. ':' .. 0] oldX[i .. ':' .. 1] = newX[i .. ':' .. 1]; oldY[i .. ':' .. 1] = newY[i .. ':' .. 1] --Осуществляем поворот R[i .. ':' .. 0 .. ':' .. 0] = -O[i .. ':' .. 0 .. ':' .. 0]*s[alpha] + O[i .. ':' .. 0 .. ':' .. 1]*c[alpha] R[i .. ':' .. 0 .. ':' .. 1] = -O[i .. ':' .. 0 .. ':' .. 0]*c[alpha]*s[beta] - O[i .. ':' .. 0 .. ':' .. 1]*s[alpha]*s[beta] - O[i .. ':' .. 0 .. ':' .. 2]*c[beta]+1 R[i .. ':' .. 0 .. ':' .. 2] = -O[i .. ':' .. 0 .. ':' .. 0]*c[alpha]*c[beta] - O[i .. ':' .. 0 .. ':' .. 1]*s[alpha]*c[beta] + O[i .. ':' .. 0 .. ':' .. 2]*s[beta] R[i .. ':' .. 1 .. ':' .. 0] = -O[i .. ':' .. 1 .. ':' .. 0]*s[alpha] + O[i .. ':' .. 1 .. ':' .. 1]*c[alpha] R[i .. ':' .. 1 .. ':' .. 1] = -O[i .. ':' .. 1 .. ':' .. 0]*c[alpha]*s[beta] - O[i .. ':' .. 1 .. ':' .. 1]*s[alpha]*s[beta] - O[i .. ':' .. 1 .. ':' .. 2]*c[beta]+1 R[i .. ':' .. 1 .. ':' .. 2] = -O[i .. ':' .. 1 .. ':' .. 0]*c[alpha]*c[beta] - O[i .. ':' .. 1 .. ':' .. 1]*s[alpha]*c[beta] + O[i .. ':' .. 1 .. ':' .. 2]*s[beta] --Проецируем координаты на плоскость if R[i .. ':' .. 0 .. ':' .. 2] + z > 0 or R[i .. ':' .. 0 .. ':' .. 2] + z < 0 then newX[i .. ':' .. 0] = 256 * (R[i .. ':' .. 0 .. ':' .. 0] / (R[i .. ':' .. 0 .. ':' .. 2] + z)) + x newY[i .. ':' .. 0] = 256 * (R[i .. ':' .. 0 .. ':' .. 1] / (R[i .. ':' .. 0 .. ':' .. 2] + z)) + y end if R[i .. ':' .. 1 .. ':' .. 2] + z > 0 or R[i .. ':' .. 1 .. ':' .. 2] + z < 0 then newX[i .. ':' .. 1] = 256 * (R[i .. ':' .. 1 .. ':' .. 0] / (R[i .. ':' .. 1 .. ':' .. 2] + z)) + x newY[i .. ':' .. 1] = 256 * (R[i .. ':' .. 1 .. ':' .. 1] / (R[i .. ':' .. 1 .. ':' .. 2] + z)) + y end end --Задержка 5 мс, чтобы программа не вешала PSP при выходе System.sleep(5) --Начинаем рисовать System.draw() --Очищаем экран screen:clear(white) --Стираем старые линии if firstRun == 0 then for i=0,11 do screen:drawLine(oldX[i .. ':' .. 0], oldY[i .. ':' .. 0], oldX[i .. ':' .. 1], oldY[i .. ':' .. 1], white) end end System.endDraw() --Отображаем содержание буфера на экране screen.flip() System.draw() screen:clear(white) --Рисуем новые линии for i=0,11 do screen:drawLine(newX[i .. ':' .. 0], newY[i .. ':' .. 0], newX[i .. ':' .. 1], newY[i .. ':' .. 1], black) end System.endDraw() screen.flip() --Вычисляем углы alpha = math.mod(alpha+alphaR,360) beta = math.mod(beta+betaR,360) firstRun = 0 end |
Конструкции вида var[i .. ':' .. 0] являются следствием специфики реализации многомерных массивов в lua. System.draw() и screen:clear обязательны к использованию (хотя, в некоторых примерах в интернете они не используются), ибо без них будет оставаться шлейф.
Теперь создаем файл index.lua и копируем код в него, далее index.lua нужно поместить в папку с плеером.
В результате получим вот такую вот штуку:
Скрипт одним файлом: скачать
Круто, молодец.
Каими - мастер на все руки ;)
Классно получилось.Вот бы такие уроки по PS3