PSP 程式設計/基礎/按鈕輸入
在本教程中,我們將學習如何處理使用者輸入。讓我們從包含一些標頭檔案開始。你應該已經知道前兩個的作用,第三個用於獲取控制器輸入。和之前一樣,我們也會包含回撥標頭檔案。
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include "../common/callback.h"
我們將提升版本,使我們的程式現在處於版本 1.1。這是假設每個教程的進展都應該提升版本。除了 psp 模組資訊中的名稱更改之外,其餘程式碼相同。
#define VERS 1
#define REVS 1
PSP_MODULE_INFO("Button Input", PSP_MODULE_USER, VERS, REVS);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_HEAP_THRESHOLD_SIZE_KB(0);
#define printf pspDebugScreenPrintf
在我們的主函式中,我們進行通常的操作,但這次建立一個“running”變數,以便在退出回調發生或使用者按下“start”按鈕時(稍後會詳細說明)進行更新。然後我們建立按鈕輸入物件並將取樣率設定為 0,並允許模擬模式,以便我們可以讀取模擬墊的位置。
int main()
{
pspDebugScreenInit();
setupExitCallback();
int running = isRunning();
SceCtrlData buttonInput;
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
現在我們開始 while 迴圈,從退出回撥中更新我們的變數,告訴我們是否應該退出。我們重置列印位置,並打印出模擬墊的位置。透過將變數傳遞給第二個引數並使用 '%d' 作為佔位符來完成變數的列印。
需要注意的是,當使用“Lx”和“Ly”屬性獲取模擬搖桿的位置時,你會得到一個從 0 到 255 的值。你可以從該值中減去 128,這樣中心就是 0。不幸的是,存在一個叫做“死區”的東西,這意味著使用者可能甚至沒有觸控模擬搖桿,但它可能仍然檢測到一個介於 -30 到 30 之間的值。我們將在後面的教程中學習如何解決這個問題。
while(running)
{
running = isRunning();
pspDebugScreenSetXY(0, 0);
printf("Analog X = %d ", buttonInput.Lx);
printf("Analog Y = %d \n", buttonInput.Ly);
要使用按鈕資訊更新我們的按鈕輸入變數,我們呼叫“sceCtrlPeekBufferPositive”並將我們的變數引用傳遞給它。當我們想要檢查哪些按鈕被按下時,首先檢查是否按下了任何按鈕。如果“start”按鈕被按下,我們將打印出來,然後透過使“running”等於零來關閉程式。
sceCtrlPeekBufferPositive(&buttonInput, 1);
if(buttonInput.Buttons != 0)
{
if(buttonInput.Buttons & PSP_CTRL_START){
printf("Start");
running = 0;
}
if(buttonInput.Buttons & PSP_CTRL_SELECT) printf("Select");
我們對其他按鈕做同樣的事情,但我們不會關閉程式,只是打印出按鈕的名稱。
if(buttonInput.Buttons & PSP_CTRL_UP) printf("Up");
if(buttonInput.Buttons & PSP_CTRL_DOWN) printf("Down");
if(buttonInput.Buttons & PSP_CTRL_RIGHT) printf("Right");
if(buttonInput.Buttons & PSP_CTRL_LEFT) printf("Left");
if(buttonInput.Buttons & PSP_CTRL_CROSS) printf("Cross");
if(buttonInput.Buttons & PSP_CTRL_CIRCLE) printf("Circle");
if(buttonInput.Buttons & PSP_CTRL_SQUARE) printf("Square");
if(buttonInput.Buttons & PSP_CTRL_TRIANGLE) printf("Triangle");
if(buttonInput.Buttons & PSP_CTRL_RTRIGGER) printf("R-Trigger");
if(buttonInput.Buttons & PSP_CTRL_LTRIGGER) printf("L-Trigger");
}
}
sceKernelExitGame();
return 0;
}
最後,我們關閉程式。你可能注意到我們沒有檢查所有按鈕,這是因為我們需要核心控制才能檢查這些按鈕。有關詳細資訊,請參閱後面的教程,或者如果你想檢視如何在你的程式中獲取核心控制,你可以直接跳過。
再次建立“Makefile”檔案,並像這樣建立它,唯一的區別是名稱又變了。
TARGET = ButtonInput
OBJS = main.o ../common/callback.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
BUILD_PRX = 1
LIBDIR = ./
LIBS = -lm
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = ButtonInput
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
一旦你完成了這些操作,並且一切都正常工作,你就可以繼續進行下一個教程。