aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuomas Siipola2016-09-15 11:55:12 +0300
committerTuomas Siipola2016-09-15 11:55:12 +0300
commitefcb77da8edf7a71c7f3bc37cd0ca9966445311e (patch)
treec4b01c69f14cef13eab6962f3c31bfc64cc7648f
parent427948c56fbe8a678f21edd948d6ea0a939d6500 (diff)
Add basic map support
-rw-r--r--data/images/NeoSans.bmp (renamed from data/NeoSans.bmp)bin15026 -> 15026 bytes
-rw-r--r--data/images/tiles.bmpbin0 -> 4922 bytes
-rw-r--r--data/maps/basic.map25
-rw-r--r--data/maps/comp.map24
-rw-r--r--data/maps/comp2.map24
-rw-r--r--data/maps/ff.map24
-rw-r--r--data/maps/free.map24
-rw-r--r--data/maps/rooms.map24
-rw-r--r--data/maps/walls.map24
-rw-r--r--data/maps/walls2.map24
-rw-r--r--data/maps/walls3.map24
-rw-r--r--data/tiles.bmpbin4642 -> 0 bytes
-rw-r--r--src/main.rs89
13 files changed, 291 insertions, 15 deletions
diff --git a/data/NeoSans.bmp b/data/images/NeoSans.bmp
index ce3e296..ce3e296 100644
--- a/data/NeoSans.bmp
+++ b/data/images/NeoSans.bmp
Binary files differ
diff --git a/data/images/tiles.bmp b/data/images/tiles.bmp
new file mode 100644
index 0000000..b9324ca
--- /dev/null
+++ b/data/images/tiles.bmp
Binary files differ
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
deleted file mode 100644
index 4667205..0000000
--- a/data/tiles.bmp
+++ /dev/null
Binary files differ
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);