Как стать автором
Обновить

Программируем для PSP: Часть II. Тотальный контроль

Время на прочтение 3 мин
Количество просмотров 5.4K
В прошлом туториале мы разобрались с «хелловорлдом», теперь пришло время к следующей, не менее важной вещи: вводе информации. Умея выводить что-то на экран и узнавать, что нажал пользователь, уже можно сделать полезную программу. Фактически, после этого урока уже можно будет начинать что-то свое, однако я бы посоветовал дождаться, хотя бы, спрайтов.

Ура! Подписывайтесь на мой PSP-программирования блог.

Ну и еще, это уже отдельным манифестом: если вы нашли в топике ошибку, можете покричать «ура» или гордиться этим. Лучшее, что вы можете сделать — написать мне об этом в личку (это можно легко сделать, нажав «добавить пользователя в друзья» и написав об ошибке в поле «представиться». если вам противно видеть меня в списке друзей, так и напишите, и я не буду жать на кнопку «разрешить добавить»). Самоутверждаться найденными ошибками в комментариях, пожалуйста, не надо, потому что пользы от этого абсолютно никакой, а прокручивать такие комментарии в поисках реально чего-то интересного — раздражает.

Создадим проект по шаблону, описанному в первой части. Найдем в фаиле функцию main() — основную функцию программы, а в ней главный цикл ( while(1) {… } ). Кстати, насчет while(1): в программировании для psp не считается дурным тоном делать бесконечные циклы внутри программы, т.к. выход все равно осуществляется по кнопке HOME, и только так.

Сделаем стандартный цикл обработки сообщений: получение и переваривание. Первое, что нужно сделать — определить переменную, в которой будет хранится состояние клавиатуры:
SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).

Структура SceCtrlData хранит в себе TimeStamp — количество фреймов, похоже, от запуска программы (надо уточнить!), Buttons — битовую маску состояния кнопок (учитываются кнопки Select, Start, крестик, треугольник, квадрат, шифты, стрелки, состояние Hold и Home. Все остальное учитывается только в Kernel Mode, за подробностями смотрите фаил devkitPSP\psp\sdk\include\pspctrl.h) и координаты стика Lx и Ly. Поскольку она определена только в pspctrl.h, придется добавить в начало фаила
#include [pspctrl.h]

(Вместо [] поставьте угловые скобки. Хабр зачем-то преобразовывает &lt и &gt в угловые скобки, чем вводит браузер в недоумение)

Итак, стираем все внутренности while'ла, и пишем
sceCtrlReadBufferPositive(&pad, 1); // читаем содержимое буфера э-э клавиатуры

Эта функция заполняет структуру pad текущими значениями состояния кнопок и стика. Кстати, чтобы получить координаты стика удавалось, надо перед while'ом впихнуть 2 строки:
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика

Иначе джойстик так и застынет на положении (128:128) (это — середина, сами координаты меняются от 0 до 255).
Итак, мы считали информацию, теперь нужно ее вывести. Вот что получилось у меня:
pspDebugScreenPrintf(«TimeStamp %i | Pressed: », pad.TimeStamp); // выводим TimeStamp
if (pad.Buttons == 0) // ничего не нажато
{
    pspDebugScreenPrintf(«NONE „);
} else {
    if (pad.Buttons & PSP_CTRL_TRIANGLE) pspDebugScreenPrintf(“TRIANGLE „);
    if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf(“CIRCLE „);
    if (pad.Buttons & PSP_CTRL_CROSS) pspDebugScreenPrintf(“CROSS „);
    if (pad.Buttons & PSP_CTRL_SQUARE) pspDebugScreenPrintf(“SQUARE „);
    // какие кнопки нажаты?
}
pspDebugScreenPrintf(“(%i) | Stick: %i:%i\n», pad.Buttons, pad.Lx, pad.Ly);
// выводим координаты стика


Как видите, я учитываю только состояние кнопок с картинками (ну, треугольника, круга, квадрата и крестика), дописать поддержку остальных легко, за константами обращайтесь к devkitPSP\psp\sdk\include\pspctrl.h. Код в цикле будет выводить нечто такое:
TimeStamp 68832112 | Pressed NONE (0) | Stick: 126:150
TimeStamp 72317982 | Pressed TRIANGLE CIRCLE (12288) | Stick: 119:167



Итак, компилируйте весь полученный код (пароль — хабрахабр), преобразовывайте в EBOOT, закидывайте на приставку и наслаждайтесь. Как домашнее задание можно попробовать сделать бродилку, или еще какую-нибудь невероятно полезную штуку; я думаю, что посвящу третюю часть всяким прочим фичам text mode, а потом перейду к графике. Удачи!
Теги:
Хабы:
+22
Комментарии 25
Комментарии Комментарии 25

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн