Весь код, написанный ранее, но с подробными комментариями. Если вам есть, что предложить (не по коду, а по комментариям) - пишите. Если хотите, чтобы я на чем-то остановился поподробнее - тоже пишите, допишу в комментарии или даже отдельной статьей.
/* © 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(&pad, 1); // читаем содержимое буфера э-э клавиатуры 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:%in", pad.Buttons, pad.Lx, pad.Ly); // выводим координаты стика } sceKernelSleepThread(); // поток засыпает // если уснули все потоки, то единственное, что может случиться - это каллбек // в этой программе эта строчка никогда не выполнится ;) return 0;
Источник: http://psp.va1en0k.net/
|
Программирование для чайников.
|