1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use actor_manager::{ActorFromToken, ActorManager};
use context::Window;
use sdl2::render::Renderer;
use std::fs::File;
use std::io;
use std::io::{BufRead, BufReader};
use viewport::Viewport;
pub const GRID_SIZE: i32 = 40;
pub fn load_level<Type, Message>(path: &str,
actor_for_token: ActorFromToken<Type, Message>,
renderer: &mut Renderer,
window: &Window)
-> io::Result<(ActorManager<Type, Message>, Viewport)> {
let mut center_point = (0, 0);
let mut manager = ActorManager::new(actor_for_token);
let open_result = File::open(path);
if let Ok(f) = open_result {
let reader = BufReader::new(f);
let mut x = 0;
let mut y = 0;
let mut width = 0;
let mut has_player = false;
for line in reader.lines() {
for token in try!(line).chars() {
if token != ' ' {
manager.add(token, (x, y), renderer);
if token == 'P' {
has_player = true;
center_point = (x, y);
}
}
x += GRID_SIZE;
}
width = x;
x = 0;
y += GRID_SIZE;
}
let (width, height) = (width, y);
if !has_player {
return Err(io::Error::new(io::ErrorKind::Other,
format!("Level at {} needs to have a player", path)));
}
let mut viewport = Viewport::new(window, (width, height));
viewport.set_position(center_point);
Ok((manager, viewport))
} else {
Err(io::Error::new(io::ErrorKind::InvalidData, "File could not be opened"))
}
}