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)
--- /dev/null
+#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);
+}
--- /dev/null
+#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
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);
clear_buf(screen);
list_for_each_entry(pl1, &planet->list, list) {
- draw_planet(screen, pl1);
+ draw_planet(screen, pl1, &camera);
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:
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++)
#include "vector.h"
#include "list.h"
#include "utils.h"
+#include "camera.h"
struct planet {
struct vector speed;
#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);