terom@25: terom@25: #include "Graphics.hh" saiam@86: #include "Physics.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(); 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: terom@25: // white background terom@25: gc->clear(CL_Color::white); terom@25: terom@60: const float factorX = GRAPHICS_RESOLUTION_WIDTH / MAP_WIDTH; terom@60: const float factorY = GRAPHICS_RESOLUTION_HEIGHT / MAP_HEIGHT; terom@60: saiam@86: // draw terrain saiam@161: state.draw(gc); saiam@138: //terrain.draw(gc); saiam@138: /* nireco@125: // Demonstrates digging, but is very slow saiam@138: Vector tmp(0, 0); nireco@125: CL_Color color; nireco@125: CL_PixelBuffer pix(1, 1, 4, CL_PixelFormat::rgba8888); nireco@125: CL_Surface surf(pix); saiam@138: for (tmp.x = 0; tmp.x < MAP_WIDTH; tmp.x++) { saiam@138: for (tmp.y = 0; tmp.y < MAP_HEIGHT; tmp.y++) { nireco@125: if (state.getType(tmp) == EMPTY) { nireco@125: color = CL_Color(86, 41, 0); nireco@125: } else if (state.getType(tmp) == DIRT) { nireco@125: color = CL_Color(144, 82, 23); nireco@125: } else if (state.getType(tmp) == ROCK) { nireco@125: color = CL_Color(132, 136, 135); nireco@125: } else { nireco@125: // Fale nireco@125: } nireco@125: surf.set_color(color); nireco@125: surf.draw(tmp.x, tmp.y, gc); nireco@125: } saiam@138: }*/ nireco@125: terom@25: // draw players terom@25: for (std::list::iterator it = state.player_list.begin(); it != state.player_list.end(); it++) { terom@25: Player *p = *it; saiam@153: p->draw(gc); saiam@153: } terom@25: terom@25: // flip window buffer, LIEK NAO terom@25: win.flip(0); 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: }