Программируем для 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, а потом перейду к графике. Удачи!
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 25

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

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

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

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

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

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

              Оба этих метода хороши тем, что не убивают за зря ваше драгоценную непременно лицензионную флешку.
              Сам предпочитаю первый вариант, чем и всем советую. (:
                0
                А случайно не получилось скрестить 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
                  Я давно уже не брался за PSP-программинг и тем более давно не слежу за всякими обновлениями. PSPdevKit вообще не щупал. Работал со сборкой PSPSDK от wSlava (автор PSPxIDE), жаль, что он завязал с PSP-девелопментом. Собственно после написания фреймворка и портирования QSP я ни за что не брался. Так что ничем не могу помоч. ):
                  P.S. Планирую после релиза новой версии QSP вновь взяться за программинг, если разберусь с новыми приблудами - отпишусь где-нибудь.
              0
              В общем, есть библиотека Graphics.h (качается по ссылке), в ней есть все необходимые функции для работы в графическом режиме.

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

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

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

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

                Самое читаемое