X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fcamera.hpp;h=061fe4d1b26a87313b1cdc8788f9042b75d229dc;hb=7e15c4f871809033278711a6e9327616da00c4c9;hp=5ce5db4709fa317df789bb2c879d9273cb4924a2;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/object/camera.hpp b/src/object/camera.hpp index 5ce5db470..061fe4d1b 100644 --- a/src/object/camera.hpp +++ b/src/object/camera.hpp @@ -1,7 +1,7 @@ // $Id$ // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -21,23 +21,28 @@ #include #include +#include #include "math/vector.hpp" #include "game_object.hpp" #include "video/drawing_context.hpp" #include "serializable.hpp" #include "timer.hpp" +#include "script_interface.hpp" namespace lisp { class Lisp; } class Sector; +class Path; +class PathWalker; +class CameraConfig; -class Camera : public GameObject, public Serializable +class Camera : public GameObject, public Serializable, public ScriptInterface { public: - Camera(Sector* sector); + Camera(Sector* sector, std::string name = ""); virtual ~Camera(); /// parse camera mode from lisp file @@ -45,17 +50,18 @@ public: /// write camera mode to a lisp file virtual void write(lisp::Writer& writer); - /// reset camera postion - virtual void reset(const Vector& tuxpos); + /// reset camera position + void reset(const Vector& tuxpos); /** return camera position */ const Vector& get_translation() const; virtual void update(float elapsed_time); - virtual void draw(DrawingContext& ) - { - } + virtual void draw(DrawingContext& ); + + virtual void expose(HSQUIRRELVM vm, SQInteger table_idx); + virtual void unexpose(HSQUIRRELVM vm, SQInteger table_idx); // shake camera in a direction 1 time void shake(float speed, float x, float y); @@ -66,48 +72,68 @@ public: translation.y = scroll_y; } + /** + * scroll the upper left edge of the camera in scrolltime seconds + * to the position goal + */ + void scroll_to(const Vector& goal, float scrolltime); + + void reload_config(); + enum CameraMode { - NORMAL, AUTOSCROLL, MANUAL + NORMAL, AUTOSCROLL, SCROLLTO, MANUAL }; CameraMode mode; + /** + * get the coordinates of the point directly in the center of this camera + */ + Vector get_center() const; + private: - void scroll_normal(float elapsed_time); - void scroll_autoscroll(float elapsed_time); - void keep_in_bounds(); + void update_scroll_normal(float elapsed_time); + void update_scroll_autoscroll(float elapsed_time); + void update_scroll_to(float elapsed_time); + void keep_in_bounds(Vector& vector); void shake(); - enum LeftRightScrollChange - { - NONE, LEFT, RIGHT + /** + * The camera basically provides lookahead on the left or right side + * or is undecided. + */ + enum LookaheadMode { + LOOKAHEAD_NONE, LOOKAHEAD_LEFT, LOOKAHEAD_RIGHT }; - + Vector translation; Sector* sector; // normal mode - bool do_backscrolling; - LeftRightScrollChange scrollchange; + LookaheadMode lookahead_mode; + float changetime; + Vector lookahead_pos; + Vector peek_pos; + Vector cached_translation; // autoscroll mode - class ScrollPoint { - public: - Vector position; - float speed; - }; - std::vector scrollpoints; - size_t auto_idx; - float auto_t; - Vector current_dir; + std::auto_ptr autoscroll_path; + std::auto_ptr autoscroll_walker; // shaking Timer shaketimer; float shakespeed; float shakedepth_x; float shakedepth_y; + + // scrollto mode + Vector scroll_from; + Vector scroll_goal; + float scroll_to_pos; + float scrollspeed; + + CameraConfig *config; }; #endif /*SUPERTUX_CAMERA_H*/ -