Как и обещал в прошлой части, здесь я расскажу об обработке нажатий кнопок. А также немного расскажу о цикле "while"
Что нам понадобится?
1. Редактор текста
2. SDK
3. MakefileEditor
4. Прямые руки и кривые извилины
Если у кого-то чего-то нет, то советую прочитать мою первую сатью
Программирование для PSPНу что же, начнём!
Чтобы мы смоги считывать нажатия надо подключить библиотеку(Заголовочный файл) под названием "pspctrl.h".
Открываем нашу папку с проектами"C:/projects/psp" в ней создадим папку с именем "TestCtrl"
Запускаем MakefileEditor и заполняем поля. В 1-е и 4-е напишем "TestCtrl", а остальное заполним, как в первом уроке
Программирование для PSPТеперь в папку с нашим проектом надо скопировать два файла это "main.c" и "pspSetup.h". Их можно скопировать из прошлого нашего поекта "HelloWorld".
И теперь добавим следующие строчки кода:
В pspSetup.h
#include <pspctrl.h>//библиотека обработки нажатий на кнопки PSP
Вставляем эту строчку после строчки
#include <pspdisplay.h>
Всё библиотека подключена!
Для тех у кого нет pspSetup.h
#include <pspkernel.h>// это самый главный заголовочный файл без него ничего работать не будет
#include <pspdebug.h>// это заголовочный файл для вывода на экран
#include <pspdisplay.h>// это заголовочный файл для работы экрана нашеё PSP
#include <pspctrl.h>//библиотека обработки нажатий на кнопки PSP
#define printf pspDebugScreenPrintf//чтобы не тащить за собой много кода сделаем
определение printf будет обладать всеми теми же свойствами как и pspDebugScreenPrintf
просто имя мы укоротили...
PSP_MODULE_INFO("TestCtrl", 1, 2, 2);//эта строчка тоже обязательна! В кавычках мы пишем название программы. В нашем случае "TestCtrl"
int ExitCallback(int Arg1, int Arg2, void *Common)
{
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize Args, void *Argp)
{
int CallbackId;
CallbackId = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL);
sceKernelRegisterExitCallback(CallbackId);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void)
{
int ThreadId = 0;
ThreadId = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if (ThreadId >= 0)
{
sceKernelStartThread(ThreadId, 0, 0);
}
return ThreadId;
//весь выше перечисленный код до PSP_MODULE_INFO нужен для выхода из программы
}
В main.c
#include "pspSetup.h"
int main()
{
pspDebugScreenInit();
SetupCallbacks();//Инициализация колбеков
SceCtrlData pad;//Переменная для чтения показаний с кнопок
sceCtrlSetSamplingCycle(0);// Для чтения показаний со стика
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);//Режим аналоговый, есть и цифровой только в цифровом джойстик не работает
sceCtrlReadBufferPositive(&pad, 1);//Считываем положительные значения
while(1)//Цикл while 1 обозначает, что цикл выполняется пока он правдив
{
sceCtrlReadBufferPositive(&pad, 1);//Считываем положительные значения обязательно добавлять в цикл while, чтобы считывались значения во время цикла
if(pad.Buttons & PSP_CTRL_UP)// Ставим условие if (если) нажат вверх
{
printf("\nUP pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);
}
if(pad.Buttons & PSP_CTRL_RIGHT)// Ставим условие if (если) нажат вправо
{
printf("\nRIGHT pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);
}
if(pad.Buttons & PSP_CTRL_DOWN)// Ставим условие if (если) нажат вниз
{
printf("\nDOWN pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_LEFT)// Ставим условие if (если) нажат влево
{
printf("\nLEFT pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_TRIANGLE)// Ставим условие if (если) нажат треугольник
{
printf("\nTRINGLE pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_CIRCLE)// Ставим условие if (если) нажат кружок
{
printf("\nCIRCLE pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_CROSS)// Ставим условие if (если) нажат крестик
{
printf("\nCROSS pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_SQUARE)// Ставим условие if (если) нажат квадрат
{
printf("\nSQUARE pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_START)// Ставим условие if (если) нажат START
{
printf("\nSTART pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_SELECT)// Ставим условие if (если) нажат SELECT
{
printf("\nSELECT pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_HOME)// Ставим условие if (если) нажат HOME
{
printf("\nHOME pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);// Так же поставим задержку после нажатия кнопки, чтобы на однократное нажатие срабатывало один раз, а не несколько
}
if(pad.Buttons & PSP_CTRL_LTRIGGER)// Ставим условие if (если) нажат левый триггер
{
printf("\nL TRIGGER pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);
}
if(pad.Buttons & PSP_CTRL_RTRIGGER)// Ставим условие if (если) нажат правый триггер
{
printf("\nR TRIGGER pressed!");// То на экран выводится, что эта кнопка нажата
sceKernelDelayThread(200000);
}
pspDebugScreenPrintf("\t\t\t\t\t\t\t\rJOYSTICK X:%i, Y:%i", pad.Lx, pad.Ly);// Так же выведем показания наклона джойстика по оси X и Y
}
sceKernelExitGame();// выход из программы
return 0;
}
В коде я немного написал про использование джойстика..
Сохраняйте оба файла и компилируйте с помощью make.bat , котрый лежит в папке с Вашим проектом. Потом закиньте полученную программу "EBOOT.PBP" на свою PSP. В папку"TestCtrl", которуюнадо создать в папке "PSP\GAME"
Запустите програму и опробуйте все кнопки!
Вот и подошёл к концe наш урок.
Вам домашнее задание!!!
Взяв за снову код, который я Вам предоставил(main.c) напишите программу:
Чтобы при нажатии двух кнопок, например X и O на экране писалось"X and O Pressed!"Всем пока, всем удачи!
Ваш,
MALEXKIY
Сообщение отредактировано 10 ноября 2012 13:57. Редактировалось 3 раз(а)