输入事件处理:保持时触发器不会触发(C中的SDL2)
我正在做一个类似坦克的游戏,我试着在触发时让坦克移动。为此,我检查了这样的事件(我认为这是问题的根源): process_caxis函数还用于确定操纵手柄的角度,我将略去此函数,以实现最低限度的示例目的。其结构如下:输入事件处理:保持时触发器不会触发(C中的SDL2),c,input,sdl-2,C,Input,Sdl 2,我正在做一个类似坦克的游戏,我试着在触发时让坦克移动。为此,我检查了这样的事件(我认为这是问题的根源): process_caxis函数还用于确定操纵手柄的角度,我将略去此函数,以实现最低限度的示例目的。其结构如下: void process_caxis(stick *stick, SDL_Event event, tank *player) { if (event.caxis.which == 0)
void process_caxis(stick *stick, SDL_Event event, tank *player)
{
if (event.caxis.which == 0)
{
if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT)
{
if (event.caxis.value > JOYSTICK_DEAD_ZONE)
{
move_forward(player, event);
}
}
}
}
void move_forward(tank *player, SDL_Event event)
{
player->xvel += (int)-(cos(player->body_angle*PI/180)*(1-event.caxis.value/SDL_CONTROLLER_AXIS_MAX)/1000);
player->yvel += (int)-(sin(player->body_angle*PI/180)*(1-event.caxis.value/SDL_CONTROLLER_AXIS_MAX)/1000);
printf("player x: %d \n player y: %d \n", player->x, player->y);
}
如您所见,它调用move_forward()代码>函数,其本身构造如下:
void process_caxis(stick *stick, SDL_Event event, tank *player)
{
if (event.caxis.which == 0)
{
if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT)
{
if (event.caxis.value > JOYSTICK_DEAD_ZONE)
{
move_forward(player, event);
}
}
}
}
void move_forward(tank *player, SDL_Event event)
{
player->xvel += (int)-(cos(player->body_angle*PI/180)*(1-event.caxis.value/SDL_CONTROLLER_AXIS_MAX)/1000);
player->yvel += (int)-(sin(player->body_angle*PI/180)*(1-event.caxis.value/SDL_CONTROLLER_AXIS_MAX)/1000);
printf("player x: %d \n player y: %d \n", player->x, player->y);
}
在制作这篇文章的过程中,我发现SDL_控制器_AXIS_MAX是6,而不是32767。不过,这对眼前的问题不重要。
我想从这个函数得到的是,速度乘以一个与你扣动扳机的力度相关的因子。事实上,你必须发送垃圾邮件才能启动触发器。我认为这是因为只有当触发值改变时,案例SDL\U CONTROLLERAXISMOTION
才为真。当如果(event.caxis.value>操纵杆\u死区)
返回true时,我试图找到一种方法调用我的函数(向前移动
)。是最大轴数,它决不是单个轴的最大值。事件方法是有问题的-和按钮一样,快速垃圾邮件事件将产生更快的移动。在您的情况下,您只对移动每个游戏循环迭代感兴趣,因此在移动之前,您需要通过获取轴值,不涉及任何事件(旁注-您可能希望高频事件重建精确的移动曲线;这不是您的情况)。我找不到“向您致敬”按钮,因此我将这样做。谢谢你有教养的回答,你太棒了,别让别人告诉你别的。