auto resize board when drawing out of bounds
This commit is contained in:
parent
f9b8dba019
commit
db7a2b2418
5 changed files with 96 additions and 36 deletions
|
@ -41,6 +41,8 @@ pub struct Board {
|
|||
rows: Vec<Vec<Tile>>,
|
||||
width: usize,
|
||||
height: usize,
|
||||
offset_x: isize,
|
||||
offset_y: isize,
|
||||
}
|
||||
|
||||
impl Board {
|
||||
|
@ -80,6 +82,8 @@ impl Board {
|
|||
rows,
|
||||
width,
|
||||
height,
|
||||
offset_x: 0,
|
||||
offset_y: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,6 +92,8 @@ impl Board {
|
|||
width: rows[0].len(),
|
||||
height: rows.len(),
|
||||
rows,
|
||||
offset_x: 0,
|
||||
offset_y: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -104,11 +110,24 @@ impl Board {
|
|||
sum
|
||||
}
|
||||
|
||||
pub fn in_bounds(&self, p: Pos) -> bool {
|
||||
fn transform(&self, p: Pos) -> Pos {
|
||||
Pos {
|
||||
x: p.x + self.offset_x,
|
||||
y: p.y + self.offset_y,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn pos_in_bounds(&self, p: Pos) -> bool {
|
||||
let p = self.transform(p);
|
||||
self.in_bounds(p)
|
||||
}
|
||||
|
||||
fn in_bounds(&self, p: Pos) -> bool {
|
||||
p.x >= 0 && p.y >= 0 && p.x < self.width as isize && p.y < self.height as isize
|
||||
}
|
||||
|
||||
pub fn get(&self, p: Pos) -> Option<Tile> {
|
||||
let p = self.transform(p);
|
||||
if self.in_bounds(p) {
|
||||
Some(self.rows[p.y as usize][p.x as usize])
|
||||
} else {
|
||||
|
@ -117,6 +136,7 @@ impl Board {
|
|||
}
|
||||
|
||||
pub fn get_or_blank(&self, p: Pos) -> Tile {
|
||||
let p = self.transform(p);
|
||||
if self.in_bounds(p) {
|
||||
self.rows[p.y as usize][p.x as usize]
|
||||
} else {
|
||||
|
@ -125,6 +145,7 @@ impl Board {
|
|||
}
|
||||
|
||||
pub fn get_mut(&mut self, p: Pos) -> Option<&mut Tile> {
|
||||
let p = self.transform(p);
|
||||
if self.in_bounds(p) {
|
||||
Some(&mut self.rows[p.y as usize][p.x as usize])
|
||||
} else {
|
||||
|
@ -133,6 +154,7 @@ impl Board {
|
|||
}
|
||||
|
||||
pub fn get_blank_mut(&mut self, p: Pos) -> Option<&mut Tile> {
|
||||
let p = self.transform(p);
|
||||
if self.in_bounds(p) {
|
||||
let tile = &mut self.rows[p.y as usize][p.x as usize];
|
||||
if tile == &Tile::Blank {
|
||||
|
@ -143,11 +165,45 @@ impl Board {
|
|||
}
|
||||
|
||||
pub fn set(&mut self, p: Pos, tile: Tile) {
|
||||
let p = self.transform(p);
|
||||
if self.in_bounds(p) {
|
||||
self.rows[p.y as usize][p.x as usize] = tile;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn grow_to_include(&mut self, p: Pos) {
|
||||
let p = self.transform(p);
|
||||
if p.x < 0 {
|
||||
let len = p.x.abs() as usize;
|
||||
for row in &mut self.rows {
|
||||
let mut new_row = vec![Tile::Blank; len];
|
||||
new_row.append(row);
|
||||
*row = new_row;
|
||||
}
|
||||
self.offset_x += len as isize;
|
||||
self.width += len;
|
||||
} else if p.x as usize >= self.width {
|
||||
let new_width = p.x as usize + 1;
|
||||
for row in &mut self.rows {
|
||||
row.resize(new_width, Tile::Blank);
|
||||
}
|
||||
self.width = new_width;
|
||||
}
|
||||
|
||||
if p.y < 0 {
|
||||
let len = p.y.abs() as usize;
|
||||
let mut new_rows = vec![vec![Tile::Blank; self.width]; len];
|
||||
new_rows.append(&mut self.rows);
|
||||
self.rows = new_rows;
|
||||
self.offset_y += len as isize;
|
||||
self.height += len;
|
||||
} else if p.y as usize > self.height {
|
||||
let new_height = p.y as usize + 1;
|
||||
self.rows.resize(new_height, vec![Tile::Blank; self.width]);
|
||||
self.height = new_height;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn width(&self) -> usize {
|
||||
self.width
|
||||
}
|
||||
|
@ -160,18 +216,19 @@ impl Board {
|
|||
let tile_size = 16 << zoom;
|
||||
for x in 0..self.width {
|
||||
for y in 0..self.height {
|
||||
if let Some(tile) = self.get((x, y).into()) {
|
||||
let px = x as i32 * tile_size + offset.x as i32 + tile_size / 2;
|
||||
let py = y as i32 * tile_size + offset.y as i32 + tile_size / 2;
|
||||
let texture = textures.get(&tile.texture());
|
||||
d.draw_texture_ex(
|
||||
texture,
|
||||
Vector2::new((px - tile_size / 2) as f32, (py - tile_size / 2) as f32),
|
||||
0.0,
|
||||
(1 << zoom) as f32,
|
||||
Color::WHITE,
|
||||
);
|
||||
}
|
||||
let tile = self.rows[y][x];
|
||||
let px =
|
||||
(x as i32 - self.offset_x as i32) * tile_size + offset.x as i32 + tile_size / 2;
|
||||
let py =
|
||||
(y as i32 - self.offset_y as i32) * tile_size + offset.y as i32 + tile_size / 2;
|
||||
let texture = textures.get(&tile.texture());
|
||||
d.draw_texture_ex(
|
||||
texture,
|
||||
Vector2::new((px - tile_size / 2) as f32, (py - tile_size / 2) as f32),
|
||||
0.0,
|
||||
(1 << zoom) as f32,
|
||||
Color::WHITE,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue