跳轉到內容

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

一旦你完成了這些操作,並且一切都正常工作,你就可以繼續進行下一個教程

華夏公益教科書