terom@25: terom@25: #include "Graphics.hh" saiam@86: #include "GameState.hh" saiam@108: #include terom@25: terom@25: Graphics::Graphics (Engine &engine, GameState &state) : terom@25: engine(engine), terom@25: state(state), terom@25: update_timer(GRAPHICS_UPDATE_INTERVAL_MS), terom@60: win(GRAPHICS_WINDOW_TITLE, GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT), terom@25: keyboard(win.get_ic()->get_keyboard()) { saiam@86: terom@25: // connect timer signal terom@25: slots.connect(update_timer.sig_timer(), this, &Graphics::on_update); terom@25: terom@25: // enable terom@25: update_timer.enable(); terom@25: } terom@25: terom@25: void Graphics::check_input (void) { terom@25: LocalPlayer *player; terom@58: PlayerInput_Move input_move = 0; terom@25: terom@25: // stop on escape terom@25: if (keyboard.get_keycode(CL_KEY_ESCAPE)) { saiam@108: engine.stop(); terom@25: saiam@108: return; terom@25: } terom@25: terom@25: // ignore if we don't have a local player terom@25: if ((player = state.getLocalPlayer()) == NULL) terom@25: return; terom@25: terom@96: // handle movement terom@25: if (keyboard.get_keycode(CL_KEY_LEFT)) saiam@108: input_move |= INPUT_MOVE_LEFT; terom@25: terom@25: if (keyboard.get_keycode(CL_KEY_RIGHT)) saiam@108: input_move |= INPUT_MOVE_RIGHT; saiam@108: saiam@108: if (keyboard.get_keycode(CL_KEY_UP)) saiam@108: input_move |= INPUT_MOVE_UP; saiam@108: saiam@108: if (keyboard.get_keycode(CL_KEY_DOWN)) saiam@108: input_move |= INPUT_MOVE_DOWN; ekku@94: terom@96: if (keyboard.get_keycode(CL_KEY_RSHIFT)) saiam@108: input_move |= INPUT_MOVE_JUMP; terom@96: saiam@108: if (keyboard.get_keycode(CL_KEY_I)) saiam@108: player->debugInfo(); ekku@180: ekku@180: if (keyboard.get_keycode(CL_KEY_F)) { ekku@180: Engine::log(DEBUG, "Graphics.check_input") << "Fire!"; nireco@182: input_move |= INPUT_SHOOT; ekku@180: } nireco@116: nireco@116: if (keyboard.get_keycode(CL_KEY_M)) nireco@116: input_move |= INPUT_MOVE_DIG; nireco@116: terom@25: // apply movement if applicable terom@50: if (input_move) terom@50: player->handleMove(input_move); terom@25: } terom@25: terom@25: void Graphics::do_redraw (void) { terom@25: CL_GraphicContext *gc = win.get_gc(); terom@25: saiam@162: // White background terom@25: gc->clear(CL_Color::white); terom@25: saiam@162: // Draw terrain nireco@182: state.draw(gc); ekku@180: terom@184: // Flip window buffer, sync terom@184: win.flip(1); terom@25: } terom@25: terom@25: void Graphics::on_update (void) { terom@25: // check keyboard input terom@25: check_input(); terom@25: terom@25: // redraw display terom@25: do_redraw(); terom@25: }