Friday 15 March 2013

c++ - Handling multiple keypressess at the same time in SDL -



c++ - Handling multiple keypressess at the same time in SDL -

i'm making simple top downwards 2d shooter, move wasd , shoot in direction you're looking @ space. can move , shoot fine, can't them both @ same time. illustration if i'm shooting , start moving, character stop shooting until release , press space again, , if start moving in direction have release , press space again.

here's main method:

int main(int argc, char* args[]) { if (!init()) { log("failed initialize!\n"); } else { log("initialized sdl , sdl subsystems. \nloading assets:\n"); if (!loadassets()) { printf("failed load assets!\n"); } else { log("all assets loaded successfully.\n"); bool running = true; sdl_event e; std::vector<shot> shots; ltimer shottimer; float cooldown = 250.0f; float previouscooldown = 0.0f; player player; log("game running.\n"); shottimer.start(); while (running) { while (sdl_pollevent(&e) != 0) { if (e.type == sdl_quit) { log("sdl_quit event triggered.\n"); running = false; } else if (e.type == sdl_keydown) { switch (e.key.keysym.sym) { case sdlk_escape: { running = false; break; } } } player.handleevent(e); if (sdl_getticks() - previouscooldown > cooldown) { previouscooldown = sdl_getticks(); shots = shoot(e, player, shots); } } player.move(); (int = 0; < shots.size(); i++) { shots[i].move(); } /*if (shottimer.getticks() >= cooldown) shottimer.restart();*/ sdl_setrenderdrawcolor(renderer, 0xff, 0xff, 0xff, 0xff); sdl_renderclear(renderer); background.render(0, 0); (int = 0; < shots.size(); i++) { shots[i].render(); } player.render(); sdl_renderpresent(renderer); } } } close(); homecoming 0; }

here's shoot() function, what's causing this:

std::vector<shot> shoot(sdl_event& e, player player, std::vector<shot> shots) { bool shoot = false; if (e.type = sdl_keydown && e.key.repeat == 1) { switch (e.key.keysym.sym) { case sdlk_space: { shoot = true; break; } } } else if (e.type = sdl_keyup && e.key.repeat == 1) { switch (e.key.keysym.sym) { case sdlk_space: { shoot = false; break; } } } if (shoot) { shot newshot(player.getdir(), player); shots.push_back(newshot); } homecoming shots; }

and how move player

void player::handleevent(sdl_event& e) { if (e.type == sdl_keydown && e.key.repeat == 0) { switch (e.key.keysym.sym) { case sdlk_w: mvely -= player_vel; mdir = 0; break; case sdlk_s: mvely += player_vel; mdir = 1; break; case sdlk_d: mvelx += player_vel; mdir = 2; break; case sdlk_a: mvelx -= player_vel; mdir = 3; break; } } else if (e.type == sdl_keyup && e.key.repeat == 0) { switch (e.key.keysym.sym) { case sdlk_w: mvely += player_vel; break; case sdlk_s: mvely -= player_vel; break; case sdlk_d: mvelx -= player_vel; break; case sdlk_a: mvelx += player_vel; break; } } }

separate event polling rest of game logic.

poll events once per frame in separate function , store state of keystates array. then, when need state, check array.

c++ sdl sdl-2

No comments:

Post a Comment