X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fcamera.cpp;h=b9d0097bb8e63a2b43af03d9c13d0e091dfd5d77;hb=ab9eab4c870195c2b60ce76b77044c35b31e8806;hp=6289b9e9f8ba0e39571124ff288a1cd6fd5a1b6f;hpb=8d7b9c4a30cf4769a5904a421a8930efae6a9cc0;p=supertux.git diff --git a/src/object/camera.cpp b/src/object/camera.cpp index 6289b9e9f..b9d0097bb 100644 --- a/src/object/camera.cpp +++ b/src/object/camera.cpp @@ -39,10 +39,11 @@ #include "path.hpp" #include "path_walker.hpp" -Camera::Camera(Sector* newsector) - : sector(newsector), do_backscrolling(true), scrollchange(NONE) +Camera::Camera(Sector* newsector, std::string name) + : mode(NORMAL), sector(newsector), do_backscrolling(true), + scrollchange(NONE) { - mode = NORMAL; + this->name = name; } Camera::~Camera() @@ -52,14 +53,16 @@ Camera::~Camera() void Camera::expose(HSQUIRRELVM vm, SQInteger table_idx) { + if(name.empty()) return; Scripting::Camera* interface = new Scripting::Camera(this); - expose_object(vm, table_idx, interface, "Camera", true); + expose_object(vm, table_idx, interface, name, true); } void Camera::unexpose(HSQUIRRELVM vm, SQInteger table_idx) { - Scripting::unexpose_object(vm, table_idx, "Camera"); + if(name.empty()) return; + Scripting::unexpose_object(vm, table_idx, name); } const Vector& @@ -72,7 +75,7 @@ void Camera::parse(const lisp::Lisp& reader) { std::string modename; - + reader.get("mode", modename); if(modename == "normal") { mode = NORMAL; @@ -102,7 +105,7 @@ void Camera::write(lisp::Writer& writer) { writer.start_list("camera"); - + if(mode == NORMAL) { writer.write_string("mode", "normal"); writer.write_bool("backscrolling", do_backscrolling); @@ -112,7 +115,7 @@ Camera::write(lisp::Writer& writer) } else if(mode == MANUAL) { writer.write_string("mode", "manual"); } - + writer.end_list("camera"); } @@ -171,18 +174,18 @@ Camera::update(float elapsed_time) void Camera::keep_in_bounds(Vector& translation) { - float width = sector->solids->get_width() * 32; - float height = sector->solids->get_height() * 32; + float width = sector->get_width(); + float height = sector->get_height(); // don't scroll before the start or after the level's end if(translation.y > height - SCREEN_HEIGHT) translation.y = height - SCREEN_HEIGHT; - if(translation.y < 0) - translation.y = 0; + if(translation.y < 0) + translation.y = 0; if(translation.x > width - SCREEN_WIDTH) translation.x = width - SCREEN_WIDTH; if(translation.x < 0) - translation.x = 0; + translation.x = 0; } void @@ -199,7 +202,7 @@ Camera::update_scroll_normal(float elapsed_time) { assert(sector != 0); Player* player = sector->player; - + // check that we don't have division by zero later if(elapsed_time < EPSILON) return; @@ -207,7 +210,7 @@ Camera::update_scroll_normal(float elapsed_time) /****** Vertical Scrolling part ******/ bool do_y_scrolling = true; - if(player->is_dying() || sector->solids->get_height() == 19) + if(player->is_dying() || sector->get_height() == 19*32) do_y_scrolling = false; if(do_y_scrolling) { @@ -227,7 +230,7 @@ Camera::update_scroll_normal(float elapsed_time) float speed_y = delta_y / elapsed_time; // limit the camera speed when jumping upwards - if(player->fall_mode != Player::FALLING + if(player->fall_mode != Player::FALLING && player->fall_mode != Player::TRAMPOLINE_JUMP) { if(speed_y > max_speed_y) speed_y = max_speed_y; @@ -246,7 +249,7 @@ Camera::update_scroll_normal(float elapsed_time) /****** Horizontal scrolling part *******/ // our camera is either in leftscrolling, rightscrolling or nonscrollingmode. - + // when suddenly changing directions while scrolling into the other direction. // abort scrolling, since tux might be going left/right at a relatively small // part of the map (like when jumping upwards) @@ -281,7 +284,15 @@ Camera::update_scroll_normal(float elapsed_time) speed_x = maxv; else if(speed_x < -maxv) speed_x = -maxv; - + + // If player is peeking scroll in that direction. Fast. + if( player->peeking_direction() == ::LEFT ){ + speed_x = maxv; + } + if( player->peeking_direction() == ::RIGHT ){ + speed_x = -maxv; + } + // apply scrolling translation.x -= speed_x * elapsed_time; @@ -296,11 +307,11 @@ Camera::update_scroll_normal(float elapsed_time) void Camera::update_scroll_autoscroll(float elapsed_time) { - Player* player = sector->player; + Player* player = sector->player; if(player->is_dying()) return; - translation += autoscroll_walker->advance(elapsed_time); + translation = autoscroll_walker->advance(elapsed_time); keep_in_bounds(translation); shake(); @@ -318,4 +329,3 @@ Camera::update_scroll_to(float elapsed_time) translation = scroll_from + (scroll_goal - scroll_from) * scroll_to_pos; } -