#ifndef __VIEWPORT_H__
#define __VIEWPORT_H__
+#include <vector>
#include "vector.h"
#include "game_object.h"
#include "serializable.h"
#include <cassert>
class LispReader;
-class Player;
-class Level;
+class Sector;
class Camera : public GameObject, public Serializable
{
public:
- Camera(Player* player = 0, Level* level = 0);
+ Camera(Sector* sector);
virtual ~Camera();
- /** transforms a coordinate in world space to screen space.
- * Basically you have to apply this function to each coordinate that you want
- * to display on screen.
- */
- Vector world2screen(const Vector& worldpos) const
- {
- return worldpos - translation;
- }
-
/// parse camera mode from lisp file
- void parse_camera(LispReader& reader);
+ void read(LispReader& reader);
/// write camera mode to a lisp file
virtual void write(LispWriter& writer);
- /** returns the current translation (=scroll) vector of the viewport */
- const Vector& get_translation() const
- { return translation; }
- /** set the curren translation vector of the viewport */
- void set_translation(const Vector& translation);
+ /// reset camera postion
+ virtual void reset(const Vector& tuxpos);
+
+ /** @deprecated@ */
+ const Vector& get_translation() const;
virtual void action(float elapsed_time);
+ virtual void draw(DrawingContext& context)
+ {
+ (void) context;
+ }
+
+ void set_scrolling(int scroll_x, int scroll_y)
+ {
+ translation.x = scroll_x;
+ translation.y = scroll_y;
+ }
+
enum CameraMode
{
NORMAL, AUTOSCROLL, MANUAL
};
+ CameraMode mode;
private:
void scroll_normal(float elapsed_time);
void scroll_autoscroll(float elapsed_time);
+ void keep_in_bounds();
enum LeftRightScrollChange
{
Vector translation;
- Player* player;
- Level* level;
- CameraMode mode;
+ Sector* sector;
// normal mode
+ bool do_backscrolling;
LeftRightScrollChange scrollchange;
// autoscroll mode
+ class ScrollPoint {
+ public:
+ Vector position;
+ float speed;
+ };
+ std::vector<ScrollPoint> scrollpoints;
+ size_t auto_idx;
+ float auto_t;
+ Vector current_dir;
};
#endif