Программирование

индекс
178,71

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

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

Ура! Подписывайтесь на мой 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]

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


Итак, стираем все внутренности 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
6 апреля 2008, 16:39
15

комментарии (25)

0
va1en0k #
Да, и вот еще, я думаю завести отдельный блог (не на хабре), или даже целый сайт по программированию для PSP; на русском языке такого почти нет. Тогда сюда будут попадать кросспосты или даже анонсы. Я правда еще не решил, и пишу вот здесь эту идею, чтобы послушать вашу критику )
0
Ex3NDR #
было бы классно)
0
va1en0k #
0
Anatoly_Piskunov #
У меня есть отличный домен для любой деятельности связанной с игровой.
Думаю через 3-4 дня решу, как его использовать и отпишусь в личку ;)
0
va1en0k #
ну если даже домен жалко, можно поддомен подарить ;)
я пока у себя сделаю на сайте где-нибудь, а то денег на лишние поддомены и хостинги сейчас нету (
0
lambda #
Если один не потянете, то зовите :) Есть опыт в программировании и интерес к тематике. Мог бы рассказывать людям о программировании на скриптах для PSP. Не подумайте, что уже этим занимался. Нет, всё будет в таком же режиме, что и у вас: Live Programming.
0
va1en0k #
на скриптах - в смысле, Lua? :)
давай. тогда я тебя запихну в список авторов и создам для тебя категорию

есть идея сначала ты напишешь статью на хабре в этот блок, а потом мы ее перенесем туда, если все будет хорошо :)
0
lambda #
Отлично! Не обязательно Lua. Можно и Python. Что ж осталось решить несколько проблем. Первая. У меня нету PSP. Есть какой нибудь эмулятор что ли? Или обязательно нужна она? И второе - найти время. Но это уже моя проблема.
0
Kaberc #
Круто, спасибо за статью, наконецто мне будет с чем поиграться, а моему брату во что поиграть. :)
0
HabraCurillo #
Во время отладки довольно неудобно каждый раз переключать PSP в режим usb, копировать скомпиленный файл, потом запускать его.
Я себе в батник дописал копирование в нужное место, стало чуть-чуть удобнее.

Еще для наглядности полезно чистить экран, а не выводить в цикле простыню. Для этого добавляем в конце главного цикла что-то вроде:

for(i=0; i i< 5; i++) {
sceDisplayWaitVblankStart();
}
pspDebugScreenClear();

Еще немного удивил джойстик: он очень чувствительный, поэтому не возвращается в четко нейтральное положение (127/127). У меня после отпускания зависает в промежутке от 115 до 136 примерно. Отсюда вывод: при написании игрушек это надо будет учитывать и не полагаться на "нулевые координаты". Скорее всего придется обрабатывать отсутствие изменений координат за некий промежуток времени.
0
va1en0k #
не отсутствие изменений, а маленькие изменения :)
а остальное — ага, спасибо, в 3ью часть впишу )
0
HabraCurillo #
Ну да, можно просто выделить некоторую "мертвую зону", которую считать нулем.

А есть какая-нибудь инфа по работе в простом графическом режиме? Ну там точки и линии порисовать хочется :) Пока не нагуглил.
0
va1en0k #
http://www.psp-programming.com/ посмотри туториалс (там их мало :( ) и форум
+1
elmortem #
Есть такая замечательная штука - PSPLink. Эта штука позволяет запускать на PSP программы, физически располагающиеся на компе. Но эта штука, как мне известно, сугубо программерского свойства, поэтому просто так пользоваться ей не получится. Есть 2 способа избавить себя от лишних сложностей:
1. Пользоваться PSPxIDE, несколько глючная софтина, однако если привыкнуть вполне пойдёт для разработки небольших проектов под PSP. Имеет 2 режима дебагинга (в том числе Delphi-like), запускает программу на PSP без всяких перезапусков (через PSPLink), умеет показывать слайдшоу на компе (можно делать скриншоты) и т.д.
2. Использовать сторонний софт для игры на PSP в игры, находящиеся на компе. В этом случае будет несколько лишних телодвижений, но несколько меньше, чем при обычном рекопировании на флешку. Конкретные названия можно поискать по PSP-форумам.

Оба этих метода хороши тем, что не убивают за зря ваше драгоценную непременно лицензионную флешку.
Сам предпочитаю первый вариант, чем и всем советую. (:
0
jenyav #
А случайно не получилось скрестить PSPxIDE с третьим PSPLink-ом из комплекта PSP Devkit 0.6?
Дело в том, что PSPxIDE для общения с PSPLink использует pcterm.exe, а в PSPLink 3.0 для этого используется pspsh.exe. Если подсунуть pcterm.exe из старого pspdev (в котором PSPLink версии 2.0) в bin - то PSPxIDE пытается соединятся, но безуспешно
Почему не пользую PSPLink 2.0? Потому-что psp slim. А svn репозиторий PSPLink не работает, чтоб вытащить оттуда 2.0 и скомпилить его в prx.
Gодведу итоги: есть PSPLink 2.0 скомпиленный под слим?
Буду премного благодарен.
0
elmortem #
Я давно уже не брался за PSP-программинг и тем более давно не слежу за всякими обновлениями. PSPdevKit вообще не щупал. Работал со сборкой PSPSDK от wSlava (автор PSPxIDE), жаль, что он завязал с PSP-девелопментом. Собственно после написания фреймворка и портирования QSP я ни за что не брался. Так что ничем не могу помоч. ):
P.S. Планирую после релиза новой версии QSP вновь взяться за программинг, если разберусь с новыми приблудами - отпишусь где-нибудь.
0
HabraCurillo #
В общем, есть библиотека Graphics.h (качается по ссылке), в ней есть все необходимые функции для работы в графическом режиме.

Только вот не пойму, как ее правильно залинковать при билде. Все туториалы основываются на использовании cygwin, поэтому предлагают просто поправить в Makefile опцию OBJS. У нас, я так понимаю, makefile нет, поэтому в каком месте указать, что нужно заюзать еще "graphics.o framebuffer.o" я пока не нашел, хотя излазил все Build Options и Compiler Settings.

Наверно я туплю, просто никогда раньше не занимался C, тем более под win :)
0
va1en0k #
без дополнительных не собирается?
буду думать
0
HabraCurillo #
Ну да, без них просто ругается на "undefined reference to `initGraphics'".
0
va1en0k #
http://community.hackingpsp.com/forums/2… вот посмотри
если влом разбираться, скоро я опишу это, если у мя получится с этим ;)
0
hoglet #
на слове "приставка" все равно глаз спотыкается( "игровая консоль" было бы более корректно
0
bolk #
В Хабре используется HTML, поэтому используйте &lt; и &gt; вместо угловых скобок.
0
va1en0k #
вы сомневаетесь, что я так и делаю?
0
bolk #
Давайте я в коментарии попробую, получится или нет:

#include <pspctrl.h>
0
va1en0k #
во время редактирования хабр зачем-то заменяет сущности на сами скобки

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.