Программируем для PSP: Часть IIa. Комментарии к пройденному

Весь код, написанный ранее, но с подробными комментариями. Если вам есть, что предложить (не по коду, а по комментариям) - пишите. Если хотите, чтобы я на чем-то остановился поподробнее - тоже пишите, допишу в комментарии или даже отдельной статьей.

/*
    © va1en0k, 2008
    enjoy ;)
*/
// каллбеки и прочие необходимые для работы программы вещи
// нечто вроде windows.h ;-)
#include <pspkernel .h>


// как ни странно, почти все функции для работы в текстовом режиме находятся именно там
#include <pspdebug .h>


// получение информации о состоянии кнопок и положении джойстика
#include <pspctrl .h>


// некий код на ассемблере, необходимый для индентификации программы или модуля системой
PSP_MODULE_INFO("Hello World", 0, 1, 1);

// будет вызываться при закрытии программы, смотри функцию CallbackThread
int ExitCallback(int Arg1, int Arg2, void *Common)
{
    // "уходя - уходи"
    // ну, то есть закрывает программу
    // если не вставить эту строку, то при попытке закрыть игру через кнопку HOME
    // система зависнет на надписи "Пожалуйста, подождите..."
    // если решили попробовать ее не вставить, резет девайса произоводится
    // путем перевода штуки справа в положение "Power" на несколько (около 7) секунд
    // (пока лампочка не перестанет гореть). потом можно включать
    sceKernelExitGame();
    return 0;
}

// специальный поток
int CallbackThread(SceSize Args, void *Argp)
{
    // тут будет храниться ID нашего каллбэка
    // доступ к ним, значить, не по указателям всяким, а по номерам
    int CallbackId;

    // создаем некий каллбэк
    // система еще не знает, что он для закрытия, название (первый аргумент) нужно,
    // похоже, для статистики :)

    CallbackId = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL);

    // регистрируем наш каллбэк как каллбэк для закрытия
    sceKernelRegisterExitCallback(CallbackId);

    // поток больше не нужем, ложимся спать
    sceKernelSleepThreadCB();

    return 0;
}

// вопреки названию, в этой функции не создаются каллбэки, а создается поток,
// выполняющий эту черную работу
int SetupCallbacks(void)
{
    // опять же, доступ к потокам осуществляется по ID
    int ThreadId = 0;

    // Создаем поток. На имя всем наплевать, второй аргумент это функция
    // выполняемая потоком, третий - приоритет (меньше - приоритетнее),
    // четвертый - изначальный размер стека, потом идут аттрибуты и опции
    // на них нам плевать пока что, это вообще для отдельного туториала тема :)
    ThreadId = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
    if (ThreadId >= 0) // если создался, то запускаем
    {
        sceKernelStartThread(ThreadId, 0, 0);
        // первый параметр - ID потока, второй - размер передаваемых функции аргументов,
        // указатель на которые содержится в третьем аргументе
    }

    return ThreadId;
}

SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).

int main(int argc, char ** argv)
{
    // текстовый режим 34*68
    pspDebugScreenInit();

    // устанавливаем каллбеки
    // пока еще - только один (закрывания)
    SetupCallbacks();

    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика

    while(1) // главный цикл программы
    {
        pspDebugScreenClear(); // чистим экран
        sceCtrlReadBufferPositive(&amp;pad, 1); // читаем содержимое буфера э-э клавиатуры
        pspDebugScreenPrintf("TimeStamp %i | Pressed: ", pad.TimeStamp); // выводим TimeStamp
        if (pad.Buttons == 0) // ничего не нажато
        {
                pspDebugScreenPrintf("NONE ");
        } else {
                if (pad.Buttons &amp; PSP_CTRL_TRIANGLE) pspDebugScreenPrintf("TRIANGLE ");
                if (pad.Buttons &amp; PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE ");
                if (pad.Buttons &amp; PSP_CTRL_CROSS) pspDebugScreenPrintf("CROSS ");
                if (pad.Buttons &amp; PSP_CTRL_SQUARE) pspDebugScreenPrintf("SQUARE ");
                // какие кнопки нажаты?
        }
        pspDebugScreenPrintf("(%i) | Stick: %i:%in", pad.Buttons, pad.Lx, pad.Ly);
        // выводим координаты стика
    }

    sceKernelSleepThread();
    // поток засыпает
    // если уснули все потоки, то единственное, что может случиться - это каллбек
    // в этой программе эта строчка никогда не выполнится ;)

    return 0;


Источник: http://psp.va1en0k.net/



Опубликовал admin
16 Апр, Среда 2008г.



Программирование для чайников.