Sign in to follow this  
munchor

Moving diagonally

Recommended Posts

munchor    101
I'm having an issue with moving diagonally. Firstly, I don't want my player to move faster when moving diagonally. Secondly, I want to mimic the movement of most modern video games (think about first person shooters, that is the kind of movement I want, although my game is 2D).

This is my main game loop:

[code]

while (running) {
SDL_PollEvent(&event);
if (event.type == SDL_QUIT) {
SDL_Quit();
return 0;
}

if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_LEFT:
player.vx = -1;
break;
case SDLK_RIGHT:
player.vx = 1;
break;
case SDLK_DOWN:
player.vy = 1;
break;
case SDLK_UP:
player.vy = -1;
break;
case SDLK_ESCAPE:
SDL_Quit();
return 0;
break;
}
}

player.draw(screen);

SDL_Flip(screen);
clear_screen(screen);
}
[/code]

I have that, but I also tried to add a (if event.type == SDL_KEYUP), and then for cases UP and DOWN, set vy = 0, RIGHT and LEFT, set vx = 0. However, that didn't work so well either. I also tried using both SDL_PollEvent(&event); and while (SDL_PollEvent(&event)) {}.

I tried combinations of those too, and I'm updating "player.x += player.vx", and "player.y += player.vy;", but I just can't get proper diagonal movement.

Any idea of what I can try? Thank you in advance!

Share this post


Link to post
Share on other sites
You have to add the events together.

//On SDLK_LEFT key [u]press[/u]
[i]player.vx [color=#ff0000]+=[/color] -1;[/i]

You also need to capture the 'key release', and do the opposite (subtracting instead of adding).

//On SDLK_LEFT key [u]release[/u]
[i]player.vx [color=#FF0000]-=[/color] -1;[/i]

You'll more slightly faster going diagonally than normal. You can fix it quite easily... but it will require changing how you're handling several parts of your other code, and right now, you might not want to bother with it at this point in time (it might disrupt your game development more than benefit it, for such a small issue).
If interested (after having gotten the regular diagonal movement working), respond with your main loop code and we'll walk you through the changes you need to make.

Share this post


Link to post
Share on other sites
Waterlimon    4398
If you want to move at the same speed diagonally, you need to move by sin(45) instead of 1 (thats about 0.707 i think) and that requires you to use floats or something. OR, you could make the player move more slowly diagonally but that would only look not-terrible if your player jumps 1 meter leaps anyways. OR, you could make the scale bigger and instead of 1, move 100, and when moving diagonally move 71 (or 10 and 7 might be ok)

Share this post


Link to post
Share on other sites
SimonForsman    7642
How about:

[code]
bool keys[256];
for (int i=0;i<256;i++) {
keys[i]=false;
}

//event stuff, should be in a loop with pollevent since you want to process more than one event per frame if there is more than one in the queue
if (event.type == SDL_KEYDOWN) {
keys[event.key.keysym.sym]=true;
} else if (event.type == SDL_KEYUP) {
keys[event.key.keysym.sym]=false;
}

//update stuff here:
player.vx=0.0f;
player.vy=0.0f;
if (keys[SDLK_UP] {
player.vy-=1.0f;
}
if (keys[SDLK_DOWN] {
player.vy+=1.0f;
}
if (keys[SDLK_LEFT] {
player.vx-=1.0f;
}
if (keys[SDLK_RIGHT] {
player.vx+=1.0f;
}
//normalize direction:
float length = sqrt(player.vx*player.vx + player.vy*player.vy);
if (length>0.0f) {
player.vx/=length;
player.vy/=length;
}
[/code]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this