From 9e5732a3c816561abfa93882860eb4a3e8e104c1 Mon Sep 17 00:00:00 2001 From: Christoph Sommer Date: Thu, 6 Apr 2006 01:46:31 +0000 Subject: [PATCH] Simple Console SVN-Revision: 3248 --- data/images/engine/console.jpg | Bin 0 -> 41475 bytes src/console.cpp | 83 +++++++++++++++++++++++++++++++++++++++++ src/console.hpp | 66 ++++++++++++++++++++++++++++++++ src/game_session.cpp | 5 +++ src/game_session.hpp | 2 + src/msg.hpp | 22 ++++++----- src/title.cpp | 9 +++++ src/worldmap.cpp | 4 ++ src/worldmap.hpp | 3 ++ 9 files changed, 185 insertions(+), 9 deletions(-) create mode 100644 data/images/engine/console.jpg create mode 100644 src/console.cpp create mode 100644 src/console.hpp diff --git a/data/images/engine/console.jpg b/data/images/engine/console.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe400bb6b07c27f754fa1bfb843ef29058784c10 GIT binary patch literal 41475 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 +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include +#include +#include "console.hpp" +#include "video/drawing_context.hpp" +#include "video/surface.hpp" +#include "player_status.hpp" +#include "main.hpp" +#include "resources.hpp" + +namespace { + int ticks; // TODO: use a clock? +} + +Console::Console(DrawingContext* context) : context(context) +{ + background = new Surface("images/engine/console.jpg"); +} + +Console::~Console() +{ + delete background; +} + +void +Console::flush() +{ + lines.push_front(outputBuffer.str()); + if (lines.size() >= 256) lines.pop_back(); + if (height < 64) { + if (height < 4) height=4; + height+=9; + } + ticks=120; + std::cerr << outputBuffer.str() << std::flush; + outputBuffer.str(std::string()); +} + +void +Console::draw() +{ + if (height == 0) return; + if (ticks-- < 0) { + height-=1; + ticks=0; + if (height < 0) height=0; + } + if (height == 0) return; + + context->draw_surface(background, Vector(SCREEN_WIDTH/2 - background->get_width()/2, height - background->get_height()), LAYER_FOREGROUND1+1); + + int lineNo = 0; + for (std::list::iterator i = lines.begin(); i != lines.end(); i++) { + lineNo++; + float py = height-4-lineNo*9; + if (py < -9) break; + context->draw_text(white_small_text, *i, Vector(BORDER_X, py), LEFT_ALLIGN, LAYER_FOREGROUND1+1); + } +} + +int Console::height = 0; +std::list Console::lines; +ConsoleStreamBuffer Console::outputBuffer; +std::ostream Console::output(&Console::outputBuffer); + diff --git a/src/console.hpp b/src/console.hpp new file mode 100644 index 000000000..880ccb7fd --- /dev/null +++ b/src/console.hpp @@ -0,0 +1,66 @@ +// $Id: worldmap.hpp 3209 2006-04-02 22:19:22Z sommer $ +// +// SuperTux - Console +// Copyright (C) 2006 Christoph Sommer +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef SUPERTUX_CONSOLE_H +#define SUPERTUX_CONSOLE_H + +#include +#include +#include +#include + +class Console; +class ConsoleStreamBuffer; +class DrawingContext; +class Surface; + +class Console +{ + public: + Console(DrawingContext* context); + ~Console(); + + static std::ostream output; + + static void flush(); + + void draw(); + + protected: + static std::list lines; + DrawingContext* context; + Surface* background; + static int height; + + static ConsoleStreamBuffer outputBuffer; +}; + +class ConsoleStreamBuffer : public std::stringbuf +{ + public: + int sync() + { + Console::flush(); + return std::stringbuf::sync(); + } +}; + +#endif + + diff --git a/src/game_session.cpp b/src/game_session.cpp index b38c8400d..cbad8be7d 100644 --- a/src/game_session.cpp +++ b/src/game_session.cpp @@ -89,6 +89,7 @@ GameSession::GameSession(const std::string& levelfile_, GameSessionMode mode, fps_fps = 0; context = new DrawingContext(); + console = new Console(context); restart_level(); } @@ -163,6 +164,7 @@ GameSession::~GameSession() delete end_sequence_controller; delete level; delete context; + delete console; current_ = NULL; } @@ -238,6 +240,7 @@ GameSession::levelintro() if(best_level_statistics != NULL) best_level_statistics->draw_message_info(context, _("Best Level Statistics")); + console->draw(); context.do_drawing(); wait_for_event(1.0, 3.0); @@ -490,6 +493,7 @@ GameSession::draw() Menu::current()->draw(*context); } + console->draw(); context->do_drawing(); } @@ -802,6 +806,7 @@ GameSession::drawresultscreen() sprintf(str, _("COINS: %d"), player_status->coins); context.draw_text(gold_text, str, Vector(SCREEN_WIDTH/2, 224), CENTER_ALLIGN, LAYER_FOREGROUND1); + console->draw(); context.do_drawing(); wait_for_event(2.0, 5.0); diff --git a/src/game_session.hpp b/src/game_session.hpp index c5ed8259f..fced5d2d1 100644 --- a/src/game_session.hpp +++ b/src/game_session.hpp @@ -26,6 +26,7 @@ #include "timer.hpp" #include "statistics.hpp" #include "math/vector.hpp" +#include "console.hpp" /* GameLoop modes */ enum GameSessionMode { @@ -156,6 +157,7 @@ private: std::string capture_file; std::istream* playback_demo_stream; CodeController* demo_controller; + Console* console; }; std::string slotinfo(int slot); diff --git a/src/msg.hpp b/src/msg.hpp index 7f7113dd2..fa6cb0d9e 100644 --- a/src/msg.hpp +++ b/src/msg.hpp @@ -18,25 +18,29 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. -#ifndef __SUPERTUX_DEBUG_H__ -#define __SUPERTUX_DEBUG_H__ +#ifndef __SUPERTUX_MSG_H__ +#define __SUPERTUX_MSG_H__ #include #include +#include "console.hpp" + +// TODO: make macros more C++ish? + #ifdef DEBUG -#define msg_debug(message) std::cerr << "[DEBUG] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl -#define msg_info(message) std::cout << "[INFO] " << message << std::endl -#define msg_warning(message) std::cerr << "[WARNING] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl -#define msg_fatal(message) std::cerr << "[FATAL] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl +#define msg_debug(message) Console::output << "[DEBUG] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl +#define msg_info(message) Console::output << "[INFO] " << message << std::endl +#define msg_warning(message) Console::output << "[WARNING] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl +#define msg_fatal(message) Console::output << "[FATAL] " << __FILE__ << " l." << __LINE__ << ": " << message << std::endl #else #define msg_debug(message) -#define msg_info(message) std::cout << message << std::endl -#define msg_warning(message) std::cerr << "Warning: " << message << std::endl -#define msg_fatal(message) std::cerr << "Fatal: " << message << std::endl +#define msg_info(message) Console::output << message << std::endl +#define msg_warning(message) Console::output << "Warning: " << message << std::endl +#define msg_fatal(message) Console::output << "Fatal: " << message << std::endl #endif diff --git a/src/title.cpp b/src/title.cpp index f4d6ea084..e5e5aa58d 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -61,6 +61,7 @@ #include "main.hpp" #include "exceptions.hpp" #include "msg.hpp" +#include "console.hpp" static Surface* bkg_title; static Surface* logo; @@ -75,6 +76,8 @@ static std::vector contrib_subsets; static LevelSubset* current_contrib_subset = 0; static int current_subset = -1; +static Console* console; + /* If the demo was stopped - because game started, level editor was excuted, etc - call this when you get back to the title code. @@ -317,6 +320,9 @@ void title() Menu::set_current(main_menu); DrawingContext& context = *titlesession->context; + + console = new Console(&context); + bool running = true; while (running) { @@ -439,6 +445,8 @@ void title() Menu::set_current(main_menu); } + console->draw(); + context.do_drawing(); sound_manager->update(); @@ -453,5 +461,6 @@ void title() delete titlesession; delete bkg_title; delete logo; + delete console; //delete img_choose_subset; } diff --git a/src/worldmap.cpp b/src/worldmap.cpp index b667aec26..a2f3ac04a 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -1027,6 +1027,7 @@ WorldMap::display() Uint32 lastticks = SDL_GetTicks(); DrawingContext context; + Console* console = new Console(&context); while(!quit) { Uint32 ticks = SDL_GetTicks(); float elapsed_time = float(ticks - lastticks) / 1000; @@ -1063,8 +1064,11 @@ WorldMap::display() Menu::current()->draw(context); } + console->draw(); context.do_drawing(); } + + delete console; } void diff --git a/src/worldmap.hpp b/src/worldmap.hpp index 782c212f4..24db45750 100644 --- a/src/worldmap.hpp +++ b/src/worldmap.hpp @@ -31,6 +31,7 @@ #include "timer.hpp" #include "tile_manager.hpp" #include "game_object.hpp" +#include "console.hpp" class Sprite; class Menu; @@ -123,6 +124,8 @@ private: TileMap* solids; TileManager* tile_manager; + + Console* console; public: struct SpecialTile -- 2.11.0