Jump to content

  • Log In with Google      Sign In   
  • Create Account


Moving diagonally


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 munchor   Members   -  Reputation: 101

Like
0Likes
Like

Posted 21 February 2012 - 12:06 PM

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!

Sponsor:

#2 Servant of the Lord   Crossbones+   -  Reputation: 17269

Like
1Likes
Like

Posted 21 February 2012 - 12:19 PM

You have to add the events together.

//On SDLK_LEFT key press
player.vx += -1;

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

//On SDLK_LEFT key release
player.vx -= -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.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                       [Need free cloud storage? I personally like DropBox]

Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal


#3 Waterlimon   Crossbones+   -  Reputation: 2380

Like
1Likes
Like

Posted 21 February 2012 - 02:03 PM

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)

Waterlimon (imagine this is handwritten please)


#4 SimonForsman   Crossbones+   -  Reputation: 5805

Like
1Likes
Like

Posted 21 February 2012 - 04:02 PM

How about:

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

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!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS