camera can move now
authorMatthias Braun <matze@braunis.de>
Sun, 22 Jan 2006 15:18:42 +0000 (15:18 +0000)
committerMatthias Braun <matze@braunis.de>
Sun, 22 Jan 2006 15:18:42 +0000 (15:18 +0000)
SVN-Revision: 3018

data/levels/test/default.nut
data/levels/test/intro2.stl
src/game_session.cpp
src/object/camera.cpp
src/object/camera.hpp
src/scripting/camera.cpp
src/scripting/camera.hpp
src/scripting/script_interpreter.cpp
src/scripting/script_interpreter.hpp
src/scripting/sound.cpp
src/scripting/wrapper.cpp

index dbafc8e..6d917b5 100644 (file)
@@ -2,11 +2,16 @@
 
 function intro()
 {
-  DisplayEffect.sixteen_to_nine();
-  PENNY.set_action("stand");
-  Text.set_centered(true);
-  Text.set_text(translate("SuperTux\nMilestone 2"));
-  Text.fade_in(2);
-  wait(4);
-  Text.fade_out(1);
+  Tux.deactivate();
+  Tux.set_visible(false);
+  DisplayEffect.sixteen_to_nine(0);
+  DisplayEffect.fade_in(2);
+  Camera.scroll_to(0, 945, 15);
+  // Sound.play_music("music/tux_intro.ogg");
+  wait(2);
+
+  wait(20);
+  
+  Level.finish();
 }
+
index 4c25ffb..2ec27e8 100644 (file)
@@ -5,7 +5,8 @@
   (author "No Author")
   (sector
     (name  "main")
-    (init-script "")
+    (init-script "intro()")
+    (music "tux_intro.ogg")
     (gravity 10.000000)
     (tilemap
       (layer  "background")
index 14a69d6..b0e61b2 100644 (file)
@@ -393,6 +393,11 @@ GameSession::try_cheats()
     exit_status = ES_LEVEL_FINISHED;
     // don't add points to stats though...
   }
+  if(main_controller->check_cheatcode("camera")) {
+    std::cout << "Camera is at " 
+              << Sector::current()->camera->get_translation().x << "," 
+              << Sector::current()->camera->get_translation().y << "\n";
+  }
 }
 
 void
index 216a3b2..f33215a 100644 (file)
@@ -132,7 +132,7 @@ Camera::reset(const Vector& tuxpos)
   translation.y = tuxpos.y - SCREEN_HEIGHT/2;
   shakespeed = 0;
   shaketimer.stop();
-  keep_in_bounds();
+  keep_in_bounds(translation);
 }
 
 void
@@ -144,20 +144,41 @@ Camera::shake(float time, float x, float y)
   shakespeed = M_PI/2 / time;
 }
 
+void
+Camera::scroll_to(const Vector& goal, float scrolltime)
+{
+  scroll_from = translation;
+  scroll_goal = goal;
+  keep_in_bounds(scroll_goal);
+
+  scroll_to_pos = 0;
+  scrollspeed = 1.0 / scrolltime;
+  mode = SCROLLTO;
+}
+
 static const float EPSILON = .00001;
 static const float max_speed_y = 140;
 
 void
 Camera::update(float elapsed_time)
 {
-  if(mode == NORMAL)
-    scroll_normal(elapsed_time);
-  else if(mode == AUTOSCROLL)
-    scroll_autoscroll(elapsed_time);
+  switch(mode) {
+    case NORMAL:
+      update_scroll_normal(elapsed_time);
+      break;
+    case AUTOSCROLL:
+      update_scroll_autoscroll(elapsed_time);
+      break;
+    case SCROLLTO:
+      update_scroll_to(elapsed_time);
+      break;
+    default:
+      break;
+  }
 }
 
 void
-Camera::keep_in_bounds()
+Camera::keep_in_bounds(Vector& translation)
 {
   float width = sector->solids->get_width() * 32;
   float height = sector->solids->get_height() * 32;
@@ -183,7 +204,7 @@ Camera::shake()
 }
 
 void
-Camera::scroll_normal(float elapsed_time)
+Camera::update_scroll_normal(float elapsed_time)
 {
   assert(sector != 0);
   Player* player = sector->player;
@@ -269,12 +290,12 @@ Camera::scroll_normal(float elapsed_time)
   // apply scrolling
   translation.x -= speed_x * elapsed_time;
 
-  keep_in_bounds();
+  keep_in_bounds(translation);
   shake();
 }
 
 void
-Camera::scroll_autoscroll(float elapsed_time)
+Camera::update_scroll_autoscroll(float elapsed_time)
 {
   Player* player = sector->player;
   
@@ -292,7 +313,7 @@ Camera::scroll_autoscroll(float elapsed_time)
 
     // construct path for next point
     if(auto_idx+1 >= scrollpoints.size()) {
-      keep_in_bounds();
+      keep_in_bounds(translation);
       return;
     }
     Vector distance = scrollpoints[auto_idx+1].position 
@@ -306,7 +327,20 @@ Camera::scroll_autoscroll(float elapsed_time)
     auto_idx++;
   }
 
-  keep_in_bounds();
+  keep_in_bounds(translation);
   shake();
 }
 
+void
+Camera::update_scroll_to(float elapsed_time)
+{
+  scroll_to_pos += elapsed_time * scrollspeed;
+  if(scroll_to_pos >= 1.0) {
+    mode = MANUAL;
+    translation = scroll_goal;
+    return;
+  }
+
+  translation = (scroll_goal - scroll_from) * scroll_to_pos;
+}
+
index 5ce5db4..fa4728a 100644 (file)
@@ -66,23 +66,30 @@ 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);
+
   enum CameraMode
   {
-    NORMAL, AUTOSCROLL, MANUAL
+    NORMAL, AUTOSCROLL, SCROLLTO, MANUAL
   };
   CameraMode mode;
 
 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
   };
-    
+
   Vector translation;
 
   Sector* sector;
@@ -107,6 +114,12 @@ private:
   float shakespeed;
   float shakedepth_x;
   float shakedepth_y;
+
+  // scrollto mode
+  Vector scroll_from;
+  Vector scroll_goal;
+  float scroll_to_pos;
+  float scrollspeed;
 };
 
 #endif /*SUPERTUX_CAMERA_H*/
index 6f6173b..d96b5a4 100644 (file)
@@ -2,13 +2,16 @@
 
 #include <string>
 #include <stdio.h>
-#include "camera.hpp"
+#include "object/camera.hpp"
+#include "scripting/camera.hpp"
+#include "math/vector.hpp"
 
 #define NOIMPL      printf("%s not implemented.\n", __PRETTY_FUNCTION__);
 
 namespace Scripting
 {
-  Camera::Camera()
+  Camera::Camera(::Camera* camera)
+    : camera(camera)
   { }
 
   Camera::~Camera()
@@ -30,5 +33,11 @@ namespace Scripting
   Camera::set_mode(const std::string& )
   {
     NOIMPL;
-  }  
+  }
+
+  void
+  Camera::scroll_to(float x, float y, float scrolltime)
+  {
+    camera->scroll_to(Vector(x, y), scrolltime);
+  }
 }
index add5e5f..c94777a 100644 (file)
@@ -1,6 +1,11 @@
 #ifndef __CAMERA_H__
 #define __CAMERA_H__
 
+#ifndef SCRIPTING_API
+class Camera;
+typedef Camera _Camera;
+#endif
+
 namespace Scripting
 {
 
@@ -8,16 +13,22 @@ class Camera
 {
 public:
 #ifndef SCRIPTING_API
-    Camera();
-    ~Camera();
+  Camera(_Camera* camera);
+  ~Camera();
 #endif
 
-    /** Shake the camera */
-    void shake(float speed, float x, float y);
-    /** Set camera to a specific coordinate */
-    void set_pos(float x, float y);
-    /** Set camera to a specific mode, can be "normal", "manual" */
-    void set_mode(const std::string& mode);
+  /** Shake the camera */
+  void shake(float speed, float x, float y);
+  /** Set camera to a specific coordinate */
+  void set_pos(float x, float y);
+  /** Set camera to a specific mode, can be "normal", "manual" */
+  void set_mode(const std::string& mode);
+  /** Scroll camera to position x,y in scrolltime seconds */
+  void scroll_to(float x, float y, float scrolltime);
+
+#ifndef SCRIPTING_API
+  _Camera* camera;
+#endif
 };
 
 }
index 1047ed7..6c3fce5 100644 (file)
@@ -40,7 +40,7 @@ static void printfunc(HSQUIRRELVM, const char* str, ...)
 ScriptInterpreter* ScriptInterpreter::_current = 0;
 
 ScriptInterpreter::ScriptInterpreter(const std::string& new_working_directory)
-  : working_directory(new_working_directory), sound(0), level(0)
+  : working_directory(new_working_directory), sound(0), level(0), camera(0)
 {
   v = sq_open(1024);
   if(v == 0)
@@ -101,6 +101,9 @@ ScriptInterpreter::register_sector(Sector* sector)
   Scripting::DisplayEffect* display_effect_api
     = static_cast<Scripting::DisplayEffect*> (display_effect);
   expose_object(display_effect_api, "DisplayEffect");
+
+  Scripting::Camera* camera = new Scripting::Camera(sector->camera);
+  expose_object(camera, "Camera");
 }
 
 ScriptInterpreter::~ScriptInterpreter()
@@ -108,6 +111,7 @@ ScriptInterpreter::~ScriptInterpreter()
   sq_close(v);
   delete sound;
   delete level;
+  delete camera;
 }
 
 static SQInteger squirrel_read_char(SQUserPointer file)
index 6e233e9..de86f87 100644 (file)
@@ -12,6 +12,7 @@
 #include "scripting/sound.hpp"
 #include "scripting/level.hpp"
 #include "scripting/squirrel_error.hpp"
+#include "scripting/camera.hpp"
 
 class Sector;
 
@@ -76,6 +77,7 @@ private:
   std::string working_directory;
   Scripting::Sound* sound;
   Scripting::Level* level;
+  Scripting::Camera* camera;
 };
 
 #endif
index 6b2ac53..37ee32e 100644 (file)
@@ -16,11 +16,8 @@ namespace Scripting
   {}
 
   void
-  Sound::play_music(const std::string& name)
+  Sound::play_music(const std::string& filename)
   {
-    std::string filename = "music/";
-    filename += name;
-    filename += ".ogg";
     sound_manager->play_music(filename);
   }
 
index ab1a764..2dd0c8f 100644 (file)
@@ -145,6 +145,22 @@ static int Camera_set_mode_wrapper(HSQUIRRELVM v)
   return 0;
 }
 
+static int Camera_scroll_to_wrapper(HSQUIRRELVM v)
+{
+  Scripting::Camera* _this;
+  sq_getinstanceup(v, 1, (SQUserPointer*) &_this, 0);
+  float arg0;
+  sq_getfloat(v, 2, &arg0);
+  float arg1;
+  sq_getfloat(v, 3, &arg1);
+  float arg2;
+  sq_getfloat(v, 4, &arg2);
+  
+  _this->scroll_to(arg0, arg1, arg2);
+  
+  return 0;
+}
+
 static int Level_release_hook(SQUserPointer ptr, int )
 {
   Scripting::Level* _this = reinterpret_cast<Scripting::Level*> (ptr);
@@ -931,6 +947,14 @@ void register_supertux_wrapper(HSQUIRRELVM v)
     throw SquirrelError(v, msg.str());
   }
 
+  sq_pushstring(v, "scroll_to", -1);
+  sq_newclosure(v, &Camera_scroll_to_wrapper, 0);
+  if(SQ_FAILED(sq_createslot(v, -3))) {
+    std::ostringstream msg;
+    msg << "Couldn't register function'scroll_to'";
+    throw SquirrelError(v, msg.str());
+  }
+
   if(SQ_FAILED(sq_createslot(v, -3))) {
     std::ostringstream msg;
     msg << "Couldn't register class'Camera'";