Moving diagonally

Started by
2 comments, last by SimonForsman 12 years, 1 month ago
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!
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.
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)

o3o

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;
}
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

This topic is closed to new replies.

Advertisement