输入事件处理:如果保持,则触发器不会触发C中的SDL2

问题描述

我正在制作类似坦克的游戏,我尝试使扳机激活时移动坦克。为此,我检查了类似的事件(我认为这是问题的根源):

 SDL_Event event;
    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                proper_shutdown();
                exit(0);
                break;
            case SDL_CONTROLLERAXISMOTION:
            process_caxis(stick,event,player);        
            break;
         }

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);
                        }
                    }
                }
}

如您所见,它需要move_forward();函数,该函数本身的构造如下:

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_CONTROLLER_AXIS_MAX为6,而不是32767。但这对于当前的问题并不重要。 我从此功能中想要得到的是速度乘以一个与拉动扳机的力度有关的因子。现实情况是,您必须向触发器发送垃圾邮件以使其移动。我认为这是由于case SDL_CONTROLLERAXISMOTION仅在触发值更改时才为true。我试图找到一种在move_forward返回true时调用我的函数if (event.caxis.value > JOYSTICK_DEAD_ZONE))的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)