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)
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);
}
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
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;
}
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;
}
}
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);