SDL事件 - 无法让精灵向下或向右移动

时间:2013-12-18 08:58:31

标签: c++ events sdl

我偶然发现了一个问题,当我通过使用箭头键移动我的精灵时 - 它只会向上或向左移动但是当我试图将他向右或向下移动时,它根本不会移动。

我试过在事件循环中替换:“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

}

和事件循环:

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

我希望有人能够理解为什么我不能按我的意愿移动

1 个答案:

答案 0 :(得分:2)

如果您的x_posy_pos是整数,那么从它们中减去一个小float(偶数0.1f)大致相当于减去1,因为截断为int有效地向下舍入。

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

但是,当您尝试向右移动时,您的100 + 0.5f评估为100.5f,但会被100截断回int。< / p>

这就是为什么你可以向上和向左移动(两个坐标都减少),但不能向下或向右移动(增加坐标)。

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