]> git.itanic.dy.fi Git - sdl-planets/commitdiff
Add support for zooming the camera
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Sat, 20 Mar 2010 10:15:13 +0000 (12:15 +0200)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Sat, 20 Mar 2010 10:15:13 +0000 (12:15 +0200)
Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
camera.c
camera.h
main.c
planet.c

index 3a848c553780f15029b1d41ec0612ea3b388c7d2..6a7a5546ab6f177faaa1c6b757827778bab0fb98 100644 (file)
--- a/camera.c
+++ b/camera.c
@@ -5,6 +5,7 @@ void init_camera(struct camera *cam)
        cam->pos.x   = cam->pos.y   = 0;
        cam->speed.x = cam->speed.y = 0;
        cam->zoom = 1;
+       cam->zoom_rate = 1;
 }
 
 void move_camera(struct camera *cam, const double time)
@@ -13,4 +14,13 @@ void move_camera(struct camera *cam, const double time)
 
        vector_scale(&cam->speed, time, &tmp);
        vector_add(&cam->pos, &tmp, &cam->pos);
+
+       cam->zoom *= pow(cam->zoom_rate, time);
+}
+
+void print_camera(const struct camera *cam)
+{
+       printf("cam pos (%.2f, %.2f), speed (%.2f, %.2f), zoom (%.2f, %.2f)\n",
+              cam->pos.x, cam->pos.y, cam->speed.x, cam->speed.y,
+              cam->zoom, cam->zoom_rate);
 }
index 3b5451f9cdc3a7d46611688818bcac62bd00304e..c12d89d48ee9e4c48282baa18e921a0025afe942 100644 (file)
--- a/camera.h
+++ b/camera.h
@@ -7,13 +7,16 @@ struct camera {
        struct vector pos;
        struct vector speed;
        double zoom;
+       double zoom_rate;
 };
 
 
 /* Camera speed, when key pressed down, pixels per second */
 #define CAM_SPEED 200
+#define CAM_ZOOM_RATE 1.5
 
 void init_camera(struct camera *cam);
 void move_camera(struct camera *cam, const double time);
+void print_camera(const struct camera *cam);
 
 #endif
diff --git a/main.c b/main.c
index de6bfb5559827bea97b2750de30d62cd0f71d222..6d983d5f439e187381a40153a25c682c3e10c9df 100644 (file)
--- a/main.c
+++ b/main.c
@@ -98,6 +98,12 @@ static void loop(SDL_Surface *screen, int num_of_planets)
                                case SDLK_DOWN:
                                        camera.speed.y = CAM_SPEED;
                                        break;
+                               case SDLK_PLUS:
+                                       camera.zoom_rate = CAM_ZOOM_RATE;
+                                       break;
+                               case SDLK_MINUS:
+                                       camera.zoom_rate = 1 / CAM_ZOOM_RATE;
+                                       break;
                                default:
                                        break;
                                }
@@ -119,6 +125,12 @@ static void loop(SDL_Surface *screen, int num_of_planets)
                                case SDLK_DOWN:
                                        camera.speed.y = 0;
                                        break;
+                               case SDLK_PLUS:
+                                       camera.zoom_rate = 1;
+                                       break;
+                               case SDLK_MINUS:
+                                       camera.zoom_rate = 1;
+                                       break;
                                default:
                                        break;
                                }
index cabb2bdcda85b9e2b81d87d5e09e959a69db2540..3a158dc4125cf2ca3fb622786b211e1180e34d9a 100644 (file)
--- a/planet.c
+++ b/planet.c
@@ -37,13 +37,16 @@ void init_planet(const SDL_Surface *screen, struct planet *p)
 }
 
 void draw_planet(SDL_Surface *screen, struct planet *p,
-                const struct camera *camera)
+                const struct camera *cam)
 {
        struct vector pos;
-       int size = p->size ;
+       int size = p->size * cam->zoom;
        int x, x_start, y, x_end, y_end;
 
-       vector_sub(&p->pos, &camera->pos, &pos);
+       vector_sub(&p->pos, &cam->pos, &pos);
+       vector_scale(&pos, cam->zoom, &pos);
+       pos.x += screen->w / 2;
+       pos.y += screen->h / 2;
 
        x_start = MAX(pos.x - size, 0);
        y = MAX(pos.y - size, 0);