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
一旦你完成了这些操作,并且一切都正常工作,你就可以继续进行下一个教程。