Ton probleme c'est que tu mets tout dans ton switch d’événements. Il faudrait que tu fasses ce qu'a suggere hyrulink2 " Je te suggère de donner au sprite une vitesse qui mettra sa position a jour a chaque frame ".
Ce que tu as visiblement essayer de faire mais tu t'y es mal pris. Il faudrait un truc comme ça en DEHORS du switch :
Comme cela a chaque frame le personnage se deplacera selon la valeur de vel_x et vel_y que tu augmenteras ou diminueras selon les touches sur lesquelles appuies le joueur.
Par exemple tu peux avoir une variable pour le deplacement horizontale dont la valeur 1 (on peut utiliser des macros ou des enums aussi) correspond au déplacement à droite dans ce cas dans ton switch event.type tu aurais un truc comme ça:
Dans les KEYDOWN:
case SDLK_RIGHT: horizontal = 1; break;
Dans les KEYUP:
case SDLK_RIGHT: horizontal = 0; break;
Puis en dehors de ton switch event.type:
if(horizontal == 1) vel_x += 1;
Bref je t'expliques tout ça vite fait et de façon assez "moche" mais c'est juste pour essayer de te faire comprendre l’idée.