-// $Id$
-//
// SuperTux
// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
-// 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 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 3 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
// 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 <config.h>
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#include "object/camera.hpp"
-#include <stdexcept>
-#include <sstream>
-#include <cmath>
+#include <math.h>
+#include <physfs.h>
-#include "lisp/lisp.hpp"
-#include "lisp/writer.hpp"
-#include "lisp/list_iterator.hpp"
+#include "util/reader.hpp"
+#include "util/writer.hpp"
#include "lisp/parser.hpp"
+#include "object/path_walker.hpp"
+#include "object/player.hpp"
#include "scripting/camera.hpp"
#include "scripting/squirrel_util.hpp"
-#include "camera.hpp"
-#include "player.hpp"
-#include "tilemap.hpp"
-#include "game_session.hpp"
-#include "sector.hpp"
-#include "main.hpp"
-#include "object_factory.hpp"
-#include "log.hpp"
-#include "path.hpp"
-#include "path_walker.hpp"
+#include "supertux/globals.hpp"
+#include "supertux/sector.hpp"
/* this is the fractional distance toward the peek
position to move each frame; lower is slower,
class CameraConfig
{
public:
- // 0 = No, 1 = Fix, 2 = Mario/Yoshi, 3 = Kirby
- int ymode;
- // as above, 4 = super metroid like
+ // 0 = No, 1 = Fix, 2 = Mario/Yoshi, 3 = Kirby, 4 = Super Metroid-like
int xmode;
+ // as above
+ int ymode;
float kirby_rectsize_x;
float kirby_rectsize_y;
// where to fix the player (used for Yoshi and Fix camera)
- float target_y;
float target_x;
+ float target_y;
// maximum scrolling speed in Y direction
- float max_speed_y;
float max_speed_x;
+ float max_speed_y;
// factor to dynamically increase max_speed_x based on player speed
float dynamic_max_speed_x;
// set to <= 0 to disable noscroll mode
float sensitive_x;
- float clamp_y;
float clamp_x;
+ float clamp_y;
float dynamic_speed_sm;
- CameraConfig() {
- xmode = 4;
- ymode = 3;
- target_x = .5f;
- target_y = .5f;
- max_speed_y = 100;
- max_speed_x = 100;
- clamp_x = 0.1666f;
- clamp_y = 0.3f;
- kirby_rectsize_x = 0.2f;
- kirby_rectsize_y = 0.34f;
- edge_x = 0.4f;
- sensitive_x = -1;
- dynamic_max_speed_x = 1.0;
- dirchange_time = 0.2f;
- dynamic_speed_sm = 0.8f;
+ CameraConfig() :
+ xmode(4),
+ ymode(3),
+ kirby_rectsize_x(0.2f),
+ kirby_rectsize_y(0.34f),
+ target_x(.5f),
+ target_y(.5f),
+ max_speed_x(100),
+ max_speed_y(100),
+ dynamic_max_speed_x(1.0),
+ dirchange_time(0.2f),
+ edge_x(0.4f),
+ sensitive_x(-1),
+ clamp_x(0.1666f),
+ clamp_y(0.3f),
+ dynamic_speed_sm(0.8f)
+ {
}
void load(const std::string& filename)
}
};
-Camera::Camera(Sector* newsector, std::string name)
- : mode(NORMAL), sector(newsector), lookahead_mode(LOOKAHEAD_NONE)
+Camera::Camera(Sector* newsector, std::string name) :
+ mode(NORMAL),
+ translation(),
+ sector(newsector),
+ lookahead_mode(LOOKAHEAD_NONE),
+ changetime(),
+ lookahead_pos(),
+ peek_pos(),
+ cached_translation(),
+ autoscroll_path(),
+ autoscroll_walker(),
+ shaketimer(),
+ shakespeed(),
+ shakedepth_x(),
+ shakedepth_y(),
+ scroll_from(),
+ scroll_goal(),
+ scroll_to_pos(),
+ scrollspeed(),
+ config()
{
this->name = name;
config = new CameraConfig();
}
void
-Camera::parse(const lisp::Lisp& reader)
+Camera::parse(const Reader& reader)
{
std::string modename;
}
void
-Camera::write(lisp::Writer& writer)
-{
- writer.start_list("camera");
-
- if(mode == NORMAL) {
- writer.write_string("mode", "normal");
- } else if(mode == AUTOSCROLL) {
- writer.write_string("mode", "autoscroll");
- autoscroll_path->write(writer);
- } else if(mode == MANUAL) {
- writer.write_string("mode", "manual");
- }
-
- writer.end_list("camera");
-}
-
-void
Camera::reset(const Vector& tuxpos)
{
translation.x = tuxpos.x - SCREEN_WIDTH/2;
void
Camera::reload_config()
{
- try {
- config->load("camera.cfg");
- } catch(std::exception &e) {
- log_debug << "Couldn't load camera.cfg, using defaults ("
- << e.what() << ")";
+ if(PHYSFS_exists("camera.cfg")) {
+ try {
+ config->load("camera.cfg");
+ log_info << "Loaded camera.cfg." << std::endl;
+ } catch(std::exception &e) {
+ log_debug << "Couldn't load camera.cfg, using defaults ("
+ << e.what() << ")" << std::endl;
+ }
}
}
return;
/****** Vertical Scrolling part ******/
- int xmode = config.xmode;
int ymode = config.ymode;
if(player->is_dying() || sector->get_height() == 19*32) {
ymode = 0;
}
- if(player->is_dying())
- xmode = 0;
-
if(ymode == 1) {
cached_translation.y = player_pos.y - SCREEN_HEIGHT * config.target_y;
}
// limit the camera speed when jumping upwards
if(player->fall_mode != Player::FALLING
- && player->fall_mode != Player::TRAMPOLINE_JUMP) {
+ && player->fall_mode != Player::TRAMPOLINE_JUMP) {
speed_y = clamp(speed_y, -config.max_speed_y, config.max_speed_y);
}
if(ymode == 3) {
float halfsize = config.kirby_rectsize_y * 0.5f;
cached_translation.y = clamp(cached_translation.y,
- player_pos.y - SCREEN_HEIGHT * (0.5f + halfsize),
- player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize));
+ player_pos.y - SCREEN_HEIGHT * (0.5f + halfsize),
+ player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize));
}
if(ymode == 4) {
float upperend = SCREEN_HEIGHT * config.edge_x;
}
/****** Horizontal scrolling part *******/
+ int xmode = config.xmode;
+
+ if(player->is_dying())
+ xmode = 0;
if(xmode == 1) {
cached_translation.x = player_pos.x - SCREEN_WIDTH * config.target_x;
if(xmode == 3) {
float halfsize = config.kirby_rectsize_x * 0.5f;
cached_translation.x = clamp(cached_translation.x,
- player_pos.x - SCREEN_WIDTH * (0.5f + halfsize),
- player_pos.x - SCREEN_WIDTH * (0.5f - halfsize));
+ player_pos.x - SCREEN_WIDTH * (0.5f + halfsize),
+ player_pos.x - SCREEN_WIDTH * (0.5f - halfsize));
}
if(xmode == 4) {
float LEFTEND = SCREEN_WIDTH * config.edge_x;
// walking right
lookahead_pos.x -= player_delta.x * config.dynamic_speed_sm;
if(lookahead_pos.x < LEFTEND) {
- lookahead_pos.x = LEFTEND;
+ lookahead_pos.x = LEFTEND;
}
}
return translation + Vector(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
}
+/* EOF */