C++ SDL事件-can';不要让精灵向下或向右移动

C++ SDL事件-can';不要让精灵向下或向右移动,c++,events,sdl,C++,Events,Sdl,我偶然发现了一个问题,当我使用箭头键移动我的精灵时,它只会向上或向左移动,但当我尝试在屏幕上向右或向下移动它时,它根本不会移动 我尝试在事件循环中替换:“SDLK_RIGHT:”与SDLK_LEFT的情况相同,当它确实工作并且工作完美时,移动仍然向左移动,因为代码显示了它,但只要我尝试删除负数,它就不会移动 据我所知,浮动也应接受正值:/ 方法代码: // Updates the sprites position in the game void Sprite::tick( SDL_Ev

我偶然发现了一个问题,当我使用箭头键移动我的精灵时,它只会向上或向左移动,但当我尝试在屏幕上向右或向下移动它时,它根本不会移动

我尝试在事件循环中替换:“SDLK_RIGHT:”与SDLK_LEFT的情况相同,当它确实工作并且工作完美时,移动仍然向左移动,因为代码显示了它,但只要我尝试删除负数,它就不会移动

据我所知,浮动也应接受正值:/

方法代码:

    // Updates the sprites position in the game
void Sprite::tick( SDL_Event event )
{       

        if( event.type == SDL_KEYDOWN )
        {
            switch( event.key.keysym.sym )
            {
            case SDLK_LEFT:
                {
                    velocityX = -0.1f;
                    break;
                }
            case SDLK_RIGHT:
                {
                    velocityX = 0.5f;
                    break;
                }
            case SDLK_UP:
                {
                    velocityY = -0.1f;
                    break;
                }
            case SDLK_DOWN:
                {
                    velocityY = 0.5f;
                    break;
                }
            }
        }
        else if( event.type == SDL_KEYUP )
        {
            switch (event.key.keysym.sym)
            {
            case SDLK_LEFT: velocityX = 0.0f; break;
            case SDLK_RIGHT: velocityX = 0.0f; break;
            case SDLK_UP: velocityY = 0.0f; break;
            case SDLK_DOWN: velocityY = 0.0f; break;
            default: break;
            }
        }


    if(alive)
    {
        setBoundingbox(x_pos, y_pos, width, height);

//      if( inMidAir )
    //  {
        //  velocityX += 0.1f;
        //}


        x_pos += velocityX;

        if( ( x_pos < 0 ) || ( x_pos + width > 870 ))
        {
            x_pos -= velocityX;
        }

        y_pos += velocityY;

        if( ( y_pos < 0 ) || ( y_pos + height > 480 ) )
        {
            y_pos -= velocityY;
        }

    }// End of alive statement

}

我希望有人能明白为什么我不能随心所欲地移动

如果你的
x_pos
y_pos
是整数,那么从中减去一个小的
浮点(甚至
0.1f
)大致相当于减去1,因为截断后的
int
实际上是四舍五入

也就是说,如果
x_pos
等于100,那么
100-0.1f
将计算为
99.9f
,但会被截断为
99
,作为
int

但是,当您尝试向右移动时,会出现
100+0.5f
,其计算结果为
100.5f
,但会被截断回
100
,作为
int

这就是为什么您可以向上和向左移动(都是递减坐标),但不能向下或向右移动(递增坐标)


您需要使您的类型保持一致。

1。您是否检查了
如果。。。(x_位置+宽度>870)
不触发?2.你能给出
x_pos
y_pos
velocityX
velocityY
get_xpos()
get_ypos()
的定义吗?多谢了,我觉得很愚蠢,我没有看到那个简单的数学错误。。。但是它一次只移动一步有什么原因吗?例如,如果我向上按,它会向上移动一步,然后什么也没有,我必须重复向上按,它才会移动:/@sandmaster:你应该在每一帧的玩家位置上加上速度值。在向上键事件中,应使用向下键事件的反转值更改速度。确保以某种方式将其与帧时间相乘,以使移动速度独立于帧速率。@Skalli:非常感谢,我将该方法分成两个方法,一个用于处理事件,另一个用于更新位置,现在我真的需要一个fps限制hehe走得很快:)@sandmaster:这就是为什么你必须测量帧时间的原因。如果有类似于PositionX+=VelocityX*FrametimeInSeconds的内容,则对象以恒定速度移动,与帧速率无关。一个常见的陷阱是很多FPS(导致FrameTimeInSeconds变为0,这意味着没有移动)。这可以通过使用高精度定时器和小数来避免。顺便说一句:通常有一种渲染方法和一种移动方法,所以你的思路是正确的。我现在实现了一个fps计时器来阻止精灵移动太快,我发现问题是它在一段时间后“跳跃”,似乎没有加速,这很好,但当我按下键时,精灵会慢慢移动,然后立即移动屏幕的70%。我找不到代码会在哪里执行类似的操作,尝试将fps降低到1,这就是我看到它的地方。
// Game loop
while( quit == false )
{
    while( SDL_PollEvent( &event ))
    {
        player.tick( event );
if( event.type == SDL_QUIT )
        {
            quit = true;
        }

    }

    applySurface(0, 0, background, screen);
    applySurface(player.get_xpos(), player.get_ypos(), 
        player.get_Surface(), screen);
    SDL_Flip(screen);
}