Refactor grid drawing for greater clarity

master
Levi Pearson 2016-07-30 16:18:34 -06:00
parent 8e3521fe56
commit a9a397ba97
2 changed files with 24 additions and 25 deletions

View File

@ -2,6 +2,7 @@ use piston_window::*;
use piston_window::math::*; use piston_window::math::*;
const GREEN: [f32; 4] = [0.0, 1.0, 0.0, 0.05]; const GREEN: [f32; 4] = [0.0, 1.0, 0.0, 0.05];
const GRID_SIZE: Scalar = 100.0;
pub struct Map { pub struct Map {
pub width: Scalar, pub width: Scalar,
@ -19,43 +20,41 @@ impl Map {
pub fn draw_grid<G>(&self, pub fn draw_grid<G>(&self,
cam_pos: Vec2d, cam_pos: Vec2d,
cam_width: Scalar, cam_size: Vec2d,
cam_height: Scalar,
draw_state: &DrawState, draw_state: &DrawState,
transform: Matrix2d, transform: Matrix2d,
g: &mut G) g: &mut G)
where G: Graphics where G: Graphics
{ {
/* Camera coordinates will be centered in the screen, so find the
upper left and lower right coordinates */
let min = sub(cam_pos, mul_scalar(cam_size, 0.5));
let max = add(cam_pos, mul_scalar(cam_size, 0.5));
let xcount = (cam_width / 100.0).ceil() as u32 + 2; /* Determine the number of grid lines to draw in each direction */
let ycount = (cam_height / 100.0).ceil() as u32 + 2; let xcount = (cam_size[0] / GRID_SIZE).ceil() as u32 + 1;
let ycount = (cam_size[1] / GRID_SIZE).ceil() as u32 + 1;
let min_x = cam_pos[0] - cam_width / 2.0; /* Clamp the line coordinates to multiples of the grid size */
let min_y = cam_pos[1] - cam_height / 2.0; let first_x = (min[0] / GRID_SIZE).trunc() * GRID_SIZE;
let first_y = (min[1] / GRID_SIZE).trunc() * GRID_SIZE;
let first_x = (min_x / 100.0).trunc() * 100.0; /* Draw vertical grid lines */
let first_y = (min_y / 100.0).trunc() * 100.0;
let start_y = cam_pos[1] - cam_height;
let end_y = cam_pos[1] + cam_height;
for x in 0..xcount { for x in 0..xcount {
let line_x = first_x + (100.0 * x as Scalar); let line_x = first_x + (GRID_SIZE * x as Scalar);
let p1 = sub([line_x, start_y], cam_pos); let p1 = [line_x, min[1]];
let p2 = sub([line_x, end_y], cam_pos); let p2 = [line_x, max[1]];
Line::new(GREEN, 1.0) Line::new(GREEN, 1.0)
.draw([p1[0], p1[1], p2[0], p2[1]], .draw([p1[0], p1[1], p2[0], p2[1]], draw_state, transform, g);
draw_state, transform, g);
} }
let start_x = cam_pos[0] - cam_width; /* Draw horizontal grid lines */
let end_x = cam_pos[0] + cam_width;
for y in 0..ycount { for y in 0..ycount {
let line_y = first_y + (100.0 * y as Scalar); let line_y = first_y + (GRID_SIZE * y as Scalar);
let p1 = sub([start_x, line_y], cam_pos); let p1 = [min[0], line_y];
let p2 = sub([end_x, line_y], cam_pos); let p2 = [max[0], line_y];
Line::new(GREEN, 1.0) Line::new(GREEN, 1.0)
.draw([p1[0], p1[1], p2[0], p2[1]], .draw([p1[0], p1[1], p2[0], p2[1]], draw_state, transform, g);
draw_state, transform, g);
} }
} }
} }

View File

@ -74,10 +74,10 @@ impl Game {
let cam_width = self.camera.width; let cam_width = self.camera.width;
let cam_height = self.camera.height; let cam_height = self.camera.height;
self.map.draw_grid(cam_pos, cam_width, cam_height, &ds, ct, gl);
let cam_trans = ct.append_transform(translate(mul_scalar(cam_pos, -1.0))); let cam_trans = ct.append_transform(translate(mul_scalar(cam_pos, -1.0)));
self.map.draw_grid(cam_pos, [cam_width, cam_height], &ds, cam_trans, gl);
for bullet in self.bullets.iter() { for bullet in self.bullets.iter() {
draw_bullet(&bullet, &ds, cam_trans, gl); draw_bullet(&bullet, &ds, cam_trans, gl);
} }