diff options
author | Tuomas Siipola | 2016-09-15 11:55:12 +0300 |
---|---|---|
committer | Tuomas Siipola | 2016-09-15 11:55:12 +0300 |
commit | efcb77da8edf7a71c7f3bc37cd0ca9966445311e (patch) | |
tree | c4b01c69f14cef13eab6962f3c31bfc64cc7648f | |
parent | 427948c56fbe8a678f21edd948d6ea0a939d6500 (diff) |
Add basic map support
-rw-r--r-- | data/images/NeoSans.bmp (renamed from data/NeoSans.bmp) | bin | 15026 -> 15026 bytes | |||
-rw-r--r-- | data/images/tiles.bmp | bin | 0 -> 4922 bytes | |||
-rw-r--r-- | data/maps/basic.map | 25 | ||||
-rw-r--r-- | data/maps/comp.map | 24 | ||||
-rw-r--r-- | data/maps/comp2.map | 24 | ||||
-rw-r--r-- | data/maps/ff.map | 24 | ||||
-rw-r--r-- | data/maps/free.map | 24 | ||||
-rw-r--r-- | data/maps/rooms.map | 24 | ||||
-rw-r--r-- | data/maps/walls.map | 24 | ||||
-rw-r--r-- | data/maps/walls2.map | 24 | ||||
-rw-r--r-- | data/maps/walls3.map | 24 | ||||
-rw-r--r-- | data/tiles.bmp | bin | 4642 -> 0 bytes | |||
-rw-r--r-- | src/main.rs | 89 |
13 files changed, 291 insertions, 15 deletions
diff --git a/data/NeoSans.bmp b/data/images/NeoSans.bmp Binary files differindex ce3e296..ce3e296 100644 --- a/data/NeoSans.bmp +++ b/data/images/NeoSans.bmp diff --git a/data/images/tiles.bmp b/data/images/tiles.bmp Binary files differnew file mode 100644 index 0000000..b9324ca --- /dev/null +++ b/data/images/tiles.bmp diff --git a/data/maps/basic.map b/data/maps/basic.map new file mode 100644 index 0000000..97087b8 --- /dev/null +++ b/data/maps/basic.map @@ -0,0 +1,25 @@ +BASIC + + + + + + + + + + @ + + + + + + + + + + + + + + diff --git a/data/maps/comp.map b/data/maps/comp.map new file mode 100644 index 0000000..2a9f8b0 --- /dev/null +++ b/data/maps/comp.map @@ -0,0 +1,24 @@ +Composition VI +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXX @ XX +XXXXXXXXXXXXXXXX XX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + X + X + X + X + X + X +XXXXXXXXXXXXXX XXXXXXXXXXX XXXXX +XXX XXXXXXXXXXX +XXX XXXXXXXXXXX +XXX XXXXXXXXXXX +XXX XXXXXXXXXXX +XXX XXXXXXXXXXX +XXX X X +XXX X X diff --git a/data/maps/comp2.map b/data/maps/comp2.map new file mode 100644 index 0000000..2decfee --- /dev/null +++ b/data/maps/comp2.map @@ -0,0 +1,24 @@ +Composition VII +XXXXX X X@ X X X +XXXXX X X X X X +XXXXX X X X X X +XXXXX X X X X +XXXXX X X X X +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + X X X XXXX + X X X XXXX + X X XXXX +XXXXXXXX XXXXXXXX XXXXXX XXXXXXX + X XXXX X X X + X XXXX X +XXXXXXXXXXXXXXX XXXXXXXXXXXXX XX + X X X X + X X X X + X X X X X X +XXXXXXXXX XXXXXXXXXXXXXXXXXXXXX + X X XXXXXXXX X + X X X XXXXXXXX X + X X X XXXXXXXX X + X X X X + X X X XXXXXXXX XX + X X X X X XX diff --git a/data/maps/ff.map b/data/maps/ff.map new file mode 100644 index 0000000..5290c70 --- /dev/null +++ b/data/maps/ff.map @@ -0,0 +1,24 @@ +FF +XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX +X XX XXXXX XXXXX X +X XXX XX XX XXXXX XXXXX XX XXX X +X XXX XX XXXXX XXXXX XX XXX X +X XXX XXXXX XXXXX XXXXX XX XXX X +X XXX@ X +X XXXXXX XX XXXXX XXXXXXXX XXX X +X XXXXXX XX XXXXX XXXXXXXX XXX X +X XXX XX XX XXX X +X XXX XX XX XX XXXXX XX XX XXX X +X XX XX X X XX X +X XXXXXX XXXXX X XXXXX XXXXX +X XXXXXX XXXXX X XXXXX XXXXX +X XX XX X X XX X +X XXX XX XX XX XXXXX XX XX XXX X +X XXX XX XX XXX X +X XXXXXX XX XXXXX XXXXXXXX XXX X +X XXX X +X XXX XXXXX XXXXX XXXXX XX XXX X +X XXX XX XXXXX XXXXX XX XXX X +X XXX XX XX XXXXX XXXXX XX XXX X +X XX XXXXX XXXXX X +XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX diff --git a/data/maps/free.map b/data/maps/free.map new file mode 100644 index 0000000..f2bee6b --- /dev/null +++ b/data/maps/free.map @@ -0,0 +1,24 @@ +I'M FREE +XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX +X X +X X +X X +X X +X X +X @ X +X X +X X +X X + + + +X X +X X +X X +X X +X X +X X +X X +X X +X X +XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX diff --git a/data/maps/rooms.map b/data/maps/rooms.map new file mode 100644 index 0000000..f30b4e1 --- /dev/null +++ b/data/maps/rooms.map @@ -0,0 +1,24 @@ +Four Rooms + XX + XX + XX + XX + XX + XX + @ XX + XX + XX + XX + XX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + XX + XX + XX + XX + XX + XX + XX + XX + XX + XX + XX diff --git a/data/maps/walls.map b/data/maps/walls.map new file mode 100644 index 0000000..30ceb26 --- /dev/null +++ b/data/maps/walls.map @@ -0,0 +1,24 @@ +Wall Of Death +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +X X +X X +X X +X X +X X +X @ X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +X X +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/data/maps/walls2.map b/data/maps/walls2.map new file mode 100644 index 0000000..ed6a5d4 --- /dev/null +++ b/data/maps/walls2.map @@ -0,0 +1,24 @@ +Tight +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XX@ XXXXXXXXXXXXXXXXXXXXXXX +XX XXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/data/maps/walls3.map b/data/maps/walls3.map new file mode 100644 index 0000000..09d157b --- /dev/null +++ b/data/maps/walls3.map @@ -0,0 +1,24 @@ +Watch out +XX +X + + + X XXX X +XX X +@ XXX +XX XX XXXX + X XXX +XX X X X + XXX X + X X + X XX + X + X X + X XXX XX + X X + X + X XXXX + X X X XXXX + XXXXXXXXX X X + XXXX X X + XXXX XXXX diff --git a/data/tiles.bmp b/data/tiles.bmp Binary files differdeleted file mode 100644 index 4667205..0000000 --- a/data/tiles.bmp +++ /dev/null diff --git a/src/main.rs b/src/main.rs index fc509f5..b229195 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,10 @@ extern crate rand; use std::thread; use std::time::Duration; use std::path::Path; +use std::io::BufReader; +use std::io::prelude::*; +use std::fs::File; +use std::env; use sdl2::pixels::Color; use sdl2::event::Event; @@ -89,6 +93,7 @@ impl Direction { #[derive(Copy, Clone, PartialEq)] enum Tile { Empty, + Wall, Food, SnakeVertical, SnakeHorizontal, @@ -97,7 +102,48 @@ enum Tile { SnakeTail(Direction), } -type Map = [[Tile; 23]; 32]; +struct Map { + name: String, + tiles: [[Tile; 23]; 32], + snake_x: usize, + snake_y: usize, +} + +impl Map { + fn new() -> Map { + Map { + name: "Default".to_string(), + tiles: [[Tile::Empty; 23]; 32], + snake_x: 5, + snake_y: 5, + } + } + + fn load<P: AsRef<Path>>(path: P) -> Map { + let f = BufReader::new(File::open(path).unwrap()); + let mut lines = f.lines(); + let name = lines.next().unwrap().unwrap(); + let mut tiles = [[Tile::Empty; 23]; 32]; + let mut snake_x = 0; + let mut snake_y = 0; + for (y, line) in lines.enumerate() { + for (x, c) in line.unwrap().chars().enumerate() { + match c { + 'X' => tiles[x][y] = Tile::Wall, + ' ' => tiles[x][y] = Tile::Empty, + '@' => { snake_x = x; snake_y = y; }, + _ => unreachable!(), + } + } + } + Map { + name: name, + tiles: tiles, + snake_x: snake_x, + snake_y: snake_y, + } + } +} struct SnakeEnd { x: i32, @@ -166,7 +212,7 @@ impl Snake { fn update_tile(renderer: &mut Renderer, tiles: &Texture, map: &Map, x: i32, y: i32) { let target_rect = Rect::new(x * 10, 10 + y * 10, 10, 10); - match map[x as usize][y as usize] { + match map.tiles[x as usize][y as usize] { Tile::Empty => { renderer.set_draw_color(Color::RGB(255, 255, 255)); renderer.fill_rect(target_rect).unwrap(); @@ -174,6 +220,7 @@ fn update_tile(renderer: &mut Renderer, tiles: &Texture, map: &Map, x: i32, y: i tile => { renderer.copy(&tiles, Some(Rect::new(match tile { + Tile::Wall => 150, Tile::Food => 140, Tile::SnakeVertical => 120, Tile::SnakeHorizontal => 130, @@ -207,10 +254,10 @@ fn place_food(map: &mut Map, renderer: &mut Renderer, tiles: &Texture) { let mut rng = thread_rng(); loop { let (x, y) = (rng.gen_range(0, 32), rng.gen_range(0, 23)); - if map[x as usize][y as usize] != Tile::Empty { + if map.tiles[x as usize][y as usize] != Tile::Empty { continue; } - map[x as usize][y as usize] = Tile::Food; + map.tiles[x as usize][y as usize] = Tile::Food; update_tile(renderer, &tiles, &map, x, y); break; } @@ -227,16 +274,20 @@ fn main() { let mut renderer = window.renderer().present_vsync().build().unwrap(); - let tiles = renderer.create_texture_from_surface(Surface::load_bmp("data/tiles.bmp").unwrap()) + let tiles = renderer.create_texture_from_surface(Surface::load_bmp("data/images/tiles.bmp").unwrap()) .unwrap(); - let font = Font::load_bmp(&mut renderer, "data/NeoSans.bmp"); + let font = Font::load_bmp(&mut renderer, "data/images/NeoSans.bmp"); let mut event_pump = sdl_context.event_pump().unwrap(); - let mut snake = Snake::new(5, 5, Direction::Right); + let mut map = if let Some(path) = env::args().nth(1) { + Map::load(path) + } else { + Map::new() + }; - let mut map: Map = [[Tile::Empty; 23]; 32]; + let mut snake = Snake::new(map.snake_x as i32, map.snake_y as i32, Direction::Right); let mut score = 0; @@ -246,6 +297,13 @@ fn main() { renderer.set_draw_color(Color::RGB(0, 0, 0)); renderer.fill_rect(Rect::new(0, 0, 320, 10)).unwrap(); font.draw(&mut renderer, 1, 0, &format!("Score: {}", score)); + font.draw(&mut renderer, 100, 0, &map.name); + + for x in 0..32 { + for y in 0..23 { + update_tile(&mut renderer, &tiles, &map, x, y); + } + } place_food(&mut map, &mut renderer, &tiles); @@ -272,19 +330,19 @@ fn main() { if snake.grow > 0 { snake.grow -= 1; } else { - map[snake.tail.x as usize][snake.tail.y as usize] = Tile::Empty; + map.tiles[snake.tail.x as usize][snake.tail.y as usize] = Tile::Empty; update_tile(&mut renderer, &tiles, &map, snake.tail.x, snake.tail.y); snake.tail.update(); - match map[snake.tail.x as usize][snake.tail.y as usize] { + match map.tiles[snake.tail.x as usize][snake.tail.y as usize] { Tile::SnakeTurn(direction, _) => snake.tail.direction = direction, Tile::SnakeVertical | Tile::SnakeHorizontal => {} _ => unreachable!(), }; - map[snake.tail.x as usize][snake.tail.y as usize] = Tile::SnakeTail(snake.tail + map.tiles[snake.tail.x as usize][snake.tail.y as usize] = Tile::SnakeTail(snake.tail .direction); update_tile(&mut renderer, &tiles, &map, snake.tail.x, snake.tail.y); @@ -292,7 +350,7 @@ fn main() { if snake.head.direction != next_direction && next_direction.opposite() != snake.head.direction { - map[snake.head.x as usize][snake.head.y as usize] = + map.tiles[snake.head.x as usize][snake.head.y as usize] = Tile::SnakeTurn(next_direction, match (snake.head.direction, next_direction) { (Direction::Right, Direction::Down) | @@ -303,7 +361,7 @@ fn main() { }); snake.head.direction = next_direction; } else { - map[snake.head.x as usize][snake.head.y as usize] = match snake.head.direction { + map.tiles[snake.head.x as usize][snake.head.y as usize] = match snake.head.direction { Direction::Up | Direction::Down => Tile::SnakeVertical, Direction::Right | Direction::Left => Tile::SnakeHorizontal, }; @@ -313,13 +371,14 @@ fn main() { snake.head.update(); - match map[snake.head.x as usize][snake.head.y as usize] { + match map.tiles[snake.head.x as usize][snake.head.y as usize] { Tile::Food => { place_food(&mut map, &mut renderer, &tiles); snake.grow += 5; score += 1; font.draw(&mut renderer, 1, 0, &format!("Score: {}", score)); } + Tile::Wall | Tile::SnakeVertical | Tile::SnakeHorizontal | Tile::SnakeTurn(_, _) | @@ -327,7 +386,7 @@ fn main() { _ => {} } - map[snake.head.x as usize][snake.head.y as usize] = Tile::SnakeHead(snake.head.direction); + map.tiles[snake.head.x as usize][snake.head.y as usize] = Tile::SnakeHead(snake.head.direction); update_tile(&mut renderer, &tiles, &map, snake.head.x, snake.head.y); |