]> git.itanic.dy.fi Git - sdl-planets/commitdiff
Implement a moving camera
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 7 Mar 2010 16:22:25 +0000 (18:22 +0200)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 7 Mar 2010 16:26:53 +0000 (18:26 +0200)
Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
Makefile
camera.c [new file with mode: 0644]
camera.h [new file with mode: 0644]
main.c
planet.c
planet.h

index 62e8a1da3cbebb36fa2ffd54ae76bb0075d2e1e1..4f3207e4b49221df9d4ca6b60c85103fd8bd387c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ CC=gcc
 SPARSE=sparse
 CHECKPATCH=/usr/src/linux/scripts/checkpatch.pl
 
-TESTOBJS=main.o random.o vector.o planet.o
+TESTOBJS=main.o random.o vector.o planet.o camera.o
 
 sdl-planet: $(TESTOBJS)
        gcc $(LIBS) -o $@ $(TESTOBJS)
diff --git a/camera.c b/camera.c
new file mode 100644 (file)
index 0000000..6d91d43
--- /dev/null
+++ b/camera.c
@@ -0,0 +1,9 @@
+#include "camera.h"
+
+void move_camera(struct camera *cam, const double time)
+{
+       struct vector tmp;
+
+       vector_scale(&cam->speed, time, &tmp);
+       vector_add(&cam->pos, &tmp, &cam->pos);
+}
diff --git a/camera.h b/camera.h
new file mode 100644 (file)
index 0000000..641d214
--- /dev/null
+++ b/camera.h
@@ -0,0 +1,18 @@
+#ifndef _CAMERA_H_
+#define _CAMERA_H_
+
+#include "vector.h"
+
+struct camera {
+       struct vector pos;
+       struct vector speed;
+       double zoom;
+};
+
+
+/* Camera speed, when key pressed down, pixels per second */
+#define CAM_SPEED 200
+
+void move_camera(struct camera *cam, const double time);
+
+#endif
diff --git a/main.c b/main.c
index b2612cc313a0dfce3cdcf8ae5f99cb97ff1e1bce..dccdb1439c220d64cf52d64ee9df880f93eee719 100644 (file)
--- a/main.c
+++ b/main.c
@@ -26,12 +26,17 @@ static void clear_buf(SDL_Surface *screen)
 static void loop(SDL_Surface *screen, int num_of_planets)
 {
        struct planet *planet, *pl1, *pl2;
+       struct camera camera;
        SDL_Event event;
        int i, planets;
        int old_ticks, ticks, framecount = 0, last_fps_time = 0;
        int last_framecount = 0;
        double time = 0, last_fps = 0;
 
+       camera.pos.x = camera.pos.y = 0;
+       camera.speed.x = camera.speed.y = 0;
+       camera.zoom = 1;
+
        planet = malloc(sizeof(*planet));
        init_planet(screen, planet);
 
@@ -66,7 +71,7 @@ static void loop(SDL_Surface *screen, int num_of_planets)
                clear_buf(screen);
 
                list_for_each_entry(pl1, &planet->list, list) {
-                       draw_planet(screen, pl1);
+                       draw_planet(screen, pl1, &camera);
                        planets++;
                }
 
@@ -74,12 +79,50 @@ static void loop(SDL_Surface *screen, int num_of_planets)
 
                SDL_Flip(screen);
 
+               move_camera(&camera, time);
+
                while (SDL_PollEvent(&event)) {
-                       switch(event.type) {
+                       switch (event.type) {
                        case SDL_KEYDOWN:
-                               if (event.key.keysym.sym == SDLK_ESCAPE) {
+                               switch (event.key.keysym.sym) {
+                               case SDLK_ESCAPE:
+                                       printf("\nExiting. Good bye!\n");
+                                       return;
+                               case SDLK_LEFT:
+                                       camera.speed.x = -CAM_SPEED;
+                                       break;
+                               case SDLK_RIGHT:
+                                       camera.speed.x = CAM_SPEED;
+                                       break;
+                               case SDLK_UP:
+                                       camera.speed.y = -CAM_SPEED;
+                                       break;
+                               case SDLK_DOWN:
+                                       camera.speed.y = CAM_SPEED;
+                                       break;
+                               default:
+                                       break;
+                               }
+                               break;
+                       case SDL_KEYUP:
+                               switch (event.key.keysym.sym) {
+                               case SDLK_ESCAPE:
                                        printf("\nExiting. Good bye!\n");
                                        return;
+                               case SDLK_LEFT:
+                                       camera.speed.x = 0;
+                                       break;
+                               case SDLK_RIGHT:
+                                       camera.speed.x = 0;
+                                       break;
+                               case SDLK_UP:
+                                       camera.speed.y = 0;
+                                       break;
+                               case SDLK_DOWN:
+                                       camera.speed.y = 0;
+                                       break;
+                               default:
+                                       break;
                                }
                                break;
                        case SDL_VIDEORESIZE:
index 278da6777a2967eb86594f9abbf1d25ccac9f078..cabb2bdcda85b9e2b81d87d5e09e959a69db2540 100644 (file)
--- a/planet.c
+++ b/planet.c
@@ -36,16 +36,20 @@ void init_planet(const SDL_Surface *screen, struct planet *p)
        INIT_LIST_HEAD(&p->list);
 }
 
-void draw_planet(SDL_Surface *screen, struct planet *p)
+void draw_planet(SDL_Surface *screen, struct planet *p,
+                const struct camera *camera)
 {
+       struct vector pos;
        int size = p->size ;
        int x, x_start, y, x_end, y_end;
 
-       x_start = MAX(p->pos.x - size, 0);
-       y = MAX(p->pos.y - size, 0);
+       vector_sub(&p->pos, &camera->pos, &pos);
 
-       x_end = MIN(p->pos.x + size + 1, screen->w);
-       y_end = MIN(p->pos.y + size + 1, screen->h);
+       x_start = MAX(pos.x - size, 0);
+       y = MAX(pos.y - size, 0);
+
+       x_end = MIN(pos.x + size + 1, screen->w);
+       y_end = MIN(pos.y + size + 1, screen->h);
 
        for (; y < y_end; y++)
                for (x = x_start; x < x_end; x++)
index b57c108a069d43038792d1d5cffd4589b23fb42f..f8a464cd4626798f947264e92d28a4c5f713d361 100644 (file)
--- a/planet.h
+++ b/planet.h
@@ -6,6 +6,7 @@
 #include "vector.h"
 #include "list.h"
 #include "utils.h"
+#include "camera.h"
 
 struct planet {
        struct vector speed;
@@ -19,7 +20,7 @@ struct planet {
 #define list_to_planet(list_head) container_of((list_head), struct planet, list)
 
 void init_planet(const SDL_Surface *screen, struct planet *p);
-void draw_planet(SDL_Surface *screen, struct planet *p);
+void draw_planet(SDL_Surface *screen, struct planet *p, const struct camera *);
 int gravitize_planets(struct planet *a, struct planet *b, const double time);
 struct planet *merge_planets(struct planet *a, struct planet *b);
 void move_planet(struct planet *p, const double time);