输入事件处理:保持时触发器不会触发(C中的SDL2)

输入事件处理:保持时触发器不会触发(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)

我正在做一个类似坦克的游戏,我试着在触发时让坦克移动。为此,我检查了这样的事件(我认为这是问题的根源):

process_caxis函数还用于确定操纵手柄的角度,我将略去此函数,以实现最低限度的示例目的。其结构如下:

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时,我试图找到一种方法调用我的函数(
向前移动
)。

是最大轴数,它决不是单个轴的最大值。事件方法是有问题的-和按钮一样,快速垃圾邮件事件将产生更快的移动。在您的情况下,您只对移动每个游戏循环迭代感兴趣,因此在移动之前,您需要通过获取轴值,不涉及任何事件(旁注-您可能希望高频事件重建精确的移动曲线;这不是您的情况)。我找不到“向您致敬”按钮,因此我将这样做。谢谢你有教养的回答,你太棒了,别让别人告诉你别的。