terom@410: terom@410: #include "GameView.hh" terom@411: #include "Graphics.hh" terom@411: terom@411: #include terom@410: terom@410: namespace graphics terom@410: { terom@410: terom@411: GameView::GameView (GameState &state, LocalPlayer *player) : terom@412: View(PixelArea(0, 0, graphics->display.get_width(), graphics->display.get_height())), terom@412: state(state), player(NULL), info_view(NULL), message_view(getMessageViewArea()), terom@412: flags(0) terom@411: { terom@411: // have player? terom@411: if (player) terom@411: setPlayer(player); terom@411: terom@411: // insert message terom@412: message_view.add_message(CL_Color::white, "Hello World!"); terom@414: terom@414: // enable GUI input terom@416: slots.connect(graphics->input.gui.sig_input(), this, &GameView::handleInput); terom@414: graphics->input.gui.enable(); terom@411: } terom@411: terom@411: void GameView::setPlayer (LocalPlayer *player) { terom@411: assert(!this->player && player); terom@411: terom@411: // remember it terom@411: this->player = player; terom@411: terom@411: // build the info_view as well terom@411: info_view = new PlayerInfoView(getInfoViewArea(), player); terom@414: terom@414: // enable player input terom@416: slots.connect(graphics->input.player.sig_input(), player, &LocalPlayer::handleInput); terom@414: graphics->input.player.enable(); terom@411: } terom@411: terom@414: void GameView::handleInput (GuiInput flags, TimeMS dt) { terom@414: // ignore timing info terom@414: (void) dt; terom@414: terom@414: // update our flags terom@414: this->flags = flags; terom@414: terom@414: // quit? terom@414: if (flags & GUI_INPUT_QUIT) { terom@414: graphics->engine.stop(); terom@414: return; terom@414: } terom@414: terom@414: // dump player debug info on stderr terom@414: if ((flags & GUI_INPUT_DEBUG_PLAYER) && player) { terom@414: player->printDebugInfo(); terom@414: terom@414: message_view.add_message(CL_Color::green, "..."); terom@414: } terom@414: terom@414: // toggle fullscreen? terom@414: if (flags & GUI_INPUT_TOGGLE_FULLSCREEN) terom@414: graphics->display.toggleFullscreen(); terom@414: } terom@414: terom@414: terom@412: /* terom@412: * Helper function for Camera terom@412: */ terom@412: static PixelDimension value_between (PixelDimension low, PixelDimension value, PixelDimension high) { terom@412: if (high < low) terom@412: return (high + low) / 2; terom@410: terom@412: else if (value < low) terom@412: return low; terom@412: terom@412: else if (value > high) terom@412: return high; terom@412: terom@412: else terom@412: return value; terom@412: } terom@412: terom@412: void GameView::draw (Display &display) { terom@412: CL_GraphicContext *gc = display.get_gc(); terom@414: terom@410: // calculate camera terom@410: PixelCoordinate camera(0, 0); terom@410: terom@410: // ...to track our local player terom@410: if (player != NULL) { terom@410: // display resolution terom@412: PixelCoordinate resolution = display.getResolution(); terom@410: terom@410: // try and center the screen on the player terom@410: PixelCoordinate target = player->getCoordinate() - PixelCoordinate(resolution.x / 2, (resolution.y - 100) / 2); terom@410: terom@410: // ...but keep the world in view terom@410: PixelCoordinate max = state.terrain.getDimensions() - resolution + PixelCoordinate(0, 100); terom@410: terom@410: // ...by limiting the value to 0...max terom@410: camera = PixelCoordinate( terom@410: value_between(0, target.x, max.x), terom@410: value_between(0, target.y, max.y) terom@410: ); terom@410: } terom@410: terom@410: // Black background terom@410: gc->clear(CL_Color::black); terom@410: terom@410: // Draw the game terom@412: state.draw(display, camera, flags & GUI_INPUT_DISPLAY_WEAPON); terom@410: terom@411: // draw info view? terom@411: if (info_view) terom@411: info_view->draw(display); terom@411: terom@410: // draw messages terom@412: message_view.draw(display); terom@410: } terom@410: terom@411: void GameView::resize (const PixelArea &new_area) { terom@411: View::resize(new_area); terom@411: terom@411: // resize subcomponents terom@411: if (info_view) terom@411: info_view->resize(getInfoViewArea()); terom@411: terom@411: message_view.resize(getMessageViewArea()); terom@410: terom@411: // log message terom@412: message_view.add_message(CL_Color::yellow, CL_String::format("[ Resized window to %1 x %2 ]", (int) getWidth(), (int) getHeight())); terom@411: } terom@411: terom@411: terom@411: }