Jump to content
  • Advertisement
Sign in to follow this  
munchor

Moving diagonally

This topic is 2336 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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:



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


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
Advertisement
You have to add the events together.

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

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

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

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
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
How about:


bool keys[256];
for (int i=0;i<256;i++) {
keys=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;
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!