跳转到内容

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

一旦你完成了这些操作,并且一切都正常工作,你就可以继续进行下一个教程

华夏公益教科书