X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fcamera.cpp;h=7cea284bc25538a76a9e93feb644e962ed954c10;hb=353cf7029337c97b03d0623af51ea8ea7e63f7d2;hp=d757cabadf5fa30c5e0fa1a5bd2fa6db1d157018;hpb=8e036657d5bd0d5f38a88bb70da96c288c013f3f;p=supertux.git diff --git a/src/object/camera.cpp b/src/object/camera.cpp index d757cabad..7cea284bc 100644 --- a/src/object/camera.cpp +++ b/src/object/camera.cpp @@ -77,21 +77,21 @@ public: float dynamic_speed_sm; CameraConfig() { - xmode = 1; - ymode = 1; + xmode = 4; + ymode = 3; target_x = .5f; - target_y = 2.f/3.f; - max_speed_y = 140; - max_speed_x = 130; - clamp_x = 1.f/6.f; - clamp_y = 1.f/6.f; + 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 = 1.f/3.f; - sensitive_x = 1.f/4.f; + edge_x = 0.4f; + sensitive_x = -1; dynamic_max_speed_x = 1.0; dirchange_time = 0.2f; - dynamic_speed_sm = 1.0f; + dynamic_speed_sm = 0.8f; } void load(const std::string& filename) @@ -213,7 +213,7 @@ Camera::reset(const Vector& tuxpos) shaketimer.stop(); keep_in_bounds(translation); - yoshi_translation = translation; + cached_translation = translation; } void @@ -262,7 +262,12 @@ Camera::update(float elapsed_time) void Camera::reload_config() { - config->load("camera.cfg"); + try { + config->load("camera.cfg"); + } catch(std::exception &e) { + log_debug << "Couldn't load camera.cfg, using defaults (" + << e.what() << ")" << std::endl; + } } float clamp(float val, float min, float max) @@ -305,7 +310,8 @@ Camera::update_scroll_normal(float elapsed_time) { const CameraConfig& config = *(this->config); Player* player = sector->player; - const Vector& player_pos = player->get_bbox().get_middle(); + const Vector& player_pos = Vector(player->get_bbox().get_middle().x, + player->get_bbox().get_bottom()); static Vector last_player_pos = player_pos; Vector player_delta = player_pos - last_player_pos; last_player_pos = player_pos; @@ -325,7 +331,7 @@ Camera::update_scroll_normal(float elapsed_time) xmode = 0; if(ymode == 1) { - translation.y = player_pos.y - SCREEN_HEIGHT * config.target_y; + cached_translation.y = player_pos.y - SCREEN_HEIGHT * config.target_y; } if(ymode == 2) { // target_y is the high we target our scrolling at. This is not always the @@ -340,7 +346,7 @@ Camera::update_scroll_normal(float elapsed_time) target_y -= SCREEN_HEIGHT * config.target_y; // delta_y is the distance we'd have to travel to directly reach target_y - float delta_y = yoshi_translation.y - target_y; + float delta_y = cached_translation.y - target_y; // speed is the speed the camera would need to reach target_y in this frame float speed_y = delta_y / elapsed_time; @@ -351,12 +357,11 @@ Camera::update_scroll_normal(float elapsed_time) } // scroll with calculated speed - yoshi_translation.y -= speed_y * elapsed_time; - translation.y = yoshi_translation.y; + cached_translation.y -= speed_y * elapsed_time; } if(ymode == 3) { float halfsize = config.kirby_rectsize_y * 0.5f; - translation.y = clamp(translation.y, + cached_translation.y = clamp(cached_translation.y, player_pos.y - SCREEN_HEIGHT * (0.5f + halfsize), player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize)); } @@ -387,9 +392,11 @@ Camera::update_scroll_normal(float elapsed_time) lookahead_pos.y = lowerend; } - translation.y = player_pos.y - lookahead_pos.y; + cached_translation.y = player_pos.y - lookahead_pos.y; } + translation.y = cached_translation.y; + if(ymode != 0) { float top_edge, bottom_edge; if(config.clamp_y <= 0) { @@ -403,9 +410,9 @@ Camera::update_scroll_normal(float elapsed_time) float peek_to = 0; float translation_compensation = player_pos.y - translation.y; - if(player->peeking_direction() == ::UP) { + if(player->peeking_direction_y() == ::UP) { peek_to = bottom_edge - translation_compensation; - } else if(player->peeking_direction() == ::DOWN) { + } else if(player->peeking_direction_y() == ::DOWN) { peek_to = top_edge - translation_compensation; } @@ -422,18 +429,16 @@ Camera::update_scroll_normal(float elapsed_time) translation.y = clamp(translation.y, player_pos.y - SCREEN_HEIGHT * (1-config.clamp_y), player_pos.y - SCREEN_HEIGHT * config.clamp_y); - if(ymode == 2) { - yoshi_translation.y = clamp(yoshi_translation.y, - player_pos.y - SCREEN_HEIGHT * (1-config.clamp_y), - player_pos.y - SCREEN_HEIGHT * config.clamp_y); - } + cached_translation.y = clamp(cached_translation.y, + player_pos.y - SCREEN_HEIGHT * (1-config.clamp_y), + player_pos.y - SCREEN_HEIGHT * config.clamp_y); } } /****** Horizontal scrolling part *******/ if(xmode == 1) { - translation.x = player_pos.x - SCREEN_WIDTH * config.target_x; + cached_translation.x = player_pos.x - SCREEN_WIDTH * config.target_x; } if(xmode == 2) { // our camera is either in leftscrolling, rightscrolling or @@ -462,9 +467,9 @@ Camera::update_scroll_normal(float elapsed_time) if(lookahead_mode == LOOKAHEAD_NONE) { /* if we're undecided then look if we crossed the left or right * "sensitive" area */ - if(player_pos.x < yoshi_translation.x + LEFTEND) { + if(player_pos.x < cached_translation.x + LEFTEND) { lookahead_mode = LOOKAHEAD_LEFT; - } else if(player_pos.x > yoshi_translation.x + RIGHTEND) { + } else if(player_pos.x > cached_translation.x + RIGHTEND) { lookahead_mode = LOOKAHEAD_RIGHT; } /* at the ends of a level it's obvious which way we will go */ @@ -483,10 +488,10 @@ Camera::update_scroll_normal(float elapsed_time) changetime = game_time; } else if(game_time - changetime > config.dirchange_time) { if(lookahead_mode == LOOKAHEAD_LEFT && - player_pos.x > yoshi_translation.x + RIGHTEND) { + player_pos.x > cached_translation.x + RIGHTEND) { lookahead_mode = LOOKAHEAD_RIGHT; } else if(lookahead_mode == LOOKAHEAD_RIGHT && - player_pos.x < yoshi_translation.x + LEFTEND) { + player_pos.x < cached_translation.x + LEFTEND) { lookahead_mode = LOOKAHEAD_LEFT; } else { lookahead_mode = LOOKAHEAD_NONE; @@ -506,10 +511,10 @@ Camera::update_scroll_normal(float elapsed_time) else if(lookahead_mode == LOOKAHEAD_RIGHT) target_x = player_pos.x - LEFTEND; else - target_x = yoshi_translation.x; + target_x = cached_translation.x; // that's the distance we would have to travel to reach target_x - float delta_x = yoshi_translation.x - target_x; + float delta_x = cached_translation.x - target_x; // the speed we'd need to travel to reach target_x in this frame float speed_x = delta_x / elapsed_time; @@ -519,12 +524,11 @@ Camera::update_scroll_normal(float elapsed_time) speed_x = clamp(speed_x, -maxv, maxv); // apply scrolling - yoshi_translation.x -= speed_x * elapsed_time; - translation.x = yoshi_translation.x; + cached_translation.x -= speed_x * elapsed_time; } if(xmode == 3) { float halfsize = config.kirby_rectsize_x * 0.5f; - translation.x = clamp(translation.x, + cached_translation.x = clamp(cached_translation.x, player_pos.x - SCREEN_WIDTH * (0.5f + halfsize), player_pos.x - SCREEN_WIDTH * (0.5f - halfsize)); } @@ -555,9 +559,11 @@ Camera::update_scroll_normal(float elapsed_time) lookahead_pos.x = RIGHTEND; } - translation.x = player_pos.x - lookahead_pos.x; + cached_translation.x = player_pos.x - lookahead_pos.x; } + translation.x = cached_translation.x; + if(xmode != 0) { float left_edge, right_edge; if(config.clamp_x <= 0) { @@ -571,9 +577,9 @@ Camera::update_scroll_normal(float elapsed_time) float peek_to = 0; float translation_compensation = player_pos.x - translation.x; - if(player->peeking_direction() == ::LEFT) { + if(player->peeking_direction_x() == ::LEFT) { peek_to = right_edge - translation_compensation; - } else if(player->peeking_direction() == ::RIGHT) { + } else if(player->peeking_direction_x() == ::RIGHT) { peek_to = left_edge - translation_compensation; } @@ -590,18 +596,15 @@ Camera::update_scroll_normal(float elapsed_time) translation.x = clamp(translation.x, player_pos.x - SCREEN_WIDTH * (1-config.clamp_x), player_pos.x - SCREEN_WIDTH * config.clamp_x); - if(xmode == 2) { - yoshi_translation.x = clamp(yoshi_translation.x, - player_pos.x - SCREEN_WIDTH * (1-config.clamp_x), - player_pos.x - SCREEN_WIDTH * config.clamp_x); - } + + cached_translation.x = clamp(cached_translation.x, + player_pos.x - SCREEN_WIDTH * (1-config.clamp_x), + player_pos.x - SCREEN_WIDTH * config.clamp_x); } } keep_in_bounds(translation); - if(xmode == 2 || ymode == 2) { - keep_in_bounds(yoshi_translation); - } + keep_in_bounds(cached_translation); } void