среда, 20 июля 2011 г.

Второй урок - кнопки!

В этом уроке я расскажу ,как же работать с кнопками на псп на примере приложения Таймер. Для начала (для облегчения работы) я создал класс таймер,с помощью которого можно засекать время вплоть до тысячных секунды!Скачать его можно здесь - ЛетитбитДепозит.(надо же тоже на чем-то зарабатывать=)
Что же дальше спросите вы ?
Создаем новый проект и копируем 1 урок и вставляем
в начало  три новых хедера!
  1. #include <pspdisplay.h> //тоже нужно для вывода на экран
  2. #include <pspctrl.h> //нужно для управления кнопками
  3. #include "Timer.h" //Мой класс
Теперь создаем обьект класса таймера до функции exit_callback 

Timer time(0.1);//Цифра значит, например, если 0.1 то мы можем получить 0.3 десятые секунды или 0.2 ну и так далее любое число которое больше 0.1 ,но такое число как 0.12 не возможно получить!!!

Так же добавляем  переменную
  1. SceCtrlData pad;//Структура хранящая информацию о нажатых кнопках!

Удаляем строку  
 printf ("Hello world!!!n");
и заменяем на

  1. while(1) {
  2.       printf ("Press [X] To Start the Timer!!!n");
  3.       printf ("Press O To Restart the Timer!!!n");
  4.       printf ("Press [ ] To break the Timer!!!n");
  5.       sceCtrlReadBufferPositive(&pad, 1);
  6.       if(pad.Buttons & PSP_CTRL_CROSS) {
  7.                 time.startTimer();//Cтартанули таймер             
  8.       }
  9.       if(pad.Buttons & PSP_CTRL_CIRCLE) {
  10.                 time.resetTimer();//Cтартанули таймер 
  11.        }
  12.        if(pad.Buttons & PSP_CTRL_SQUARE) {
  13.                 break;//вышли из цикла 
  14.        }
  15.        printf ("%d",time.getTimer());//Получаем текущее время

  16.        pspDebugScreenClear();
  17. }
Теперь обьясняю  sceCtrlReadBufferPositive(&pad, 1); записывает в пед информацию о нажатиях!
  1. pad.Buttons & PSP_CTRL_CROSS
  2. pad.Buttons & PSP_CTRL_CIRCLE
  3. pad.Buttons & PSP_CTRL_SQUARE
Мы видим побитовое сравнение, логическое не пойдет(сделаю специальную статью о побитовом сравнение и чем оно отличается от логического)!
Понимаем по названию функции ,что она очищает экран pspDebugScreenClear(); 

Что же мы получили в итоге

  1. #include <pspdisplay.h> //тоже нужно для вывода на экран
  2. #include <pspctrl.h> //нужно для управления кнопками
  3. #include "Timer.h" //Мой класс
  4. PSP_MODULE_INFO("Hello", 0, 1, 0);
  5. PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
  6. Timer time(0.1);//Цифра значит, например, если 0.1 то мы можем получить 0.3 десятые секунды или 0.2 ну и так далее любое число которое больше 0.1 ,но такое число как 0.12 не возможно получить!!!
  7. SceCtrlData pad;//Структура хранящая информацию о нажатых кнопках!
  8. #define printf    pspDebugScreenPrintf
  9. int exit_callback(int arg1, int arg2, void *common)
  10. {
  11.     sceKernelExitGame();

  12.     return 0;
  13. }

  14. int CallbackThread(SceSize args, void *argp)
  15. {
  16.     int cbid;

  17.     cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
  18.     sceKernelRegisterExitCallback(cbid);

  19.     sceKernelSleepThreadCB();

  20.     return 0;
  21. }

  22. int SetupCallbacks(void)
  23. {
  24.     int thid = 0;

  25.     thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
  26.     if(thid >= 0)
  27.     {
  28.         sceKernelStartThread(thid, 0, 0);
  29.     }

  30.     return thid;
  31. }

  32. int main(void)
  33. {
  34.     SetupCallbacks(); //Устанавливаем колбеки
  35.     pspDebugScreenInit(); //Инициализируем экран для вывода текста
  36.     while(1) {
  37.       pspDebugScreenClear();     
  38.       printf ("Press [X] To Start the Timer!!!n");
  39.       printf ("Press O To Restart the Timer!!!n");
  40.       printf ("Press [ ] To break the Timer!!!n");
  41.       sceCtrlReadBufferPositive(&pad, 1);
  42.       if(pad.Buttons & PSP_CTRL_CROSS) {
  43.                 time.startTimer();//Cтартанули таймер             
  44.       }
  45.       if(pad.Buttons & PSP_CTRL_CIRCLE) {
  46.                 time.resetTimer();//Cтартанули таймер 
  47.        }
  48.        if(pad.Buttons & PSP_CTRL_SQUARE) {
  49.                 break;//вышли из цикла 
  50.        }
  51.        printf ("%d",time.getTimer());//Получаем текущее время

  52.      
  53.     }
  54.     sceKernelDelayThread (1000*100); //Насколько мы задержали текущий поток! (1сек)
  55.     sceKernelExitGame();        //Завершаем работу программы.
  56.     return 0;              //Ретурн)
  57. }
И конечно же мейкфайл .
Во вторую строчку добавляем новый обьект Timer.o.
  1. TARGET=Hello_World
  2. OBJS=main.o Timer.o
  3. INCDIR =
  4. CFLAGS=-G0  -O2
  5. CXXFLAGS=$(CFLAGS) -fno-exceptions -fno-rtti
  6. ASFLAGS=$(CFLAGS)
  7. BUILD_PRX=1
  8. LIBDIR=
  9. LDFLAGS=
  10. LIBS=
  11. EXTRA_TARGETS=EBOOT.PBP
  12. PSP_EBOOT_TITLE=HW
  13. PSPSDK=$(shell psp-config --pspsdk-path)
  14. include $(PSPSDK)/lib/build.mak





Комментариев нет:

Отправить комментарий