diff options
-rw-r--r-- | src/main.rs | 87 |
1 files changed, 45 insertions, 42 deletions
diff --git a/src/main.rs b/src/main.rs index 888c494..42595ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ -use ggez; -use ggez::event; +use ggez::event::{self, EventHandler}; use ggez::graphics::{ self, spritebatch::SpriteBatch, Color, DrawMode, DrawParam, FilterMode, Image, Mesh, Rect, StrokeOptions, WrapMode, }; use ggez::input::mouse; use ggez::mint::{Point2, Vector2}; +use ggez::{Context, ContextBuilder, GameResult}; use rand::{ distributions::{Distribution, Standard}, Rng, @@ -49,21 +49,19 @@ impl Cell { pub fn new(position: Point2<f32>) -> Cell { Cell { occupant: rand::random(), - position: position, + position, hover: false, clicked: false, } } pub fn contains(&self, position: Point2<f32>) -> bool { - if position.x > self.position.x { - if position.y > self.position.y { - if position.x < self.position.x + TILE_WIDTH * TILE_SCALE { - if position.y < self.position.y + TILE_WIDTH * TILE_SCALE { - return true; - } - } - } + if position.x > self.position.x + && position.y > self.position.y + && position.x < self.position.x + TILE_WIDTH * TILE_SCALE + && position.y < self.position.y + TILE_WIDTH * TILE_SCALE + { + return true; } false @@ -85,7 +83,7 @@ impl Cell { self.hover = false; } - pub fn draw(&self, context: &mut ggez::Context, spritebatch: &mut SpriteBatch) { + pub fn draw(&self, context: &mut Context, spritebatch: &mut SpriteBatch) -> GameResult { let source = match self.occupant { Occupant::None => None, Occupant::Green => Some(Rect::new(0.0, 0.0, 0.25, 1.0)), @@ -117,8 +115,8 @@ impl Cell { TILE_HEIGHT * TILE_SCALE, ), Color::from_rgb(255, 100, 100), - ); - graphics::draw(context, &mesh.unwrap(), DrawParam::default()).unwrap(); + )?; + graphics::draw(context, &mesh, DrawParam::default())?; } if self.clicked { let mesh = Mesh::new_rectangle( @@ -131,9 +129,10 @@ impl Cell { TILE_HEIGHT * TILE_SCALE, ), Color::from_rgb(100, 255, 100), - ); - graphics::draw(context, &mesh.unwrap(), DrawParam::default()).unwrap(); + )?; + graphics::draw(context, &mesh, DrawParam::default())?; } + Ok(()) } } @@ -144,7 +143,7 @@ struct Game { } impl Game { - fn new(context: &mut ggez::Context) -> ggez::GameResult<Game> { + fn new(context: &mut Context) -> GameResult<Game> { let mut image = Image::new(context, "/gem.png")?; image.set_filter(FilterMode::Nearest); image.set_wrap(WrapMode::Mirror, WrapMode::Mirror); @@ -153,34 +152,34 @@ impl Game { let mut y = 0.0; for _ in 0..8 { let mut column = Vec::new(); - column.push(Cell::new(Point2 { x: 0.0, y: y })); + column.push(Cell::new(Point2 { x: 0.0, y })); column.push(Cell::new(Point2 { x: 1.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 2.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 3.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 4.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 5.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 6.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); column.push(Cell::new(Point2 { x: 7.0 * (TILE_WIDTH * TILE_SCALE + BORDER_SIZE), - y: y, + y, })); y += TILE_HEIGHT * TILE_SCALE + BORDER_SIZE; @@ -188,15 +187,15 @@ impl Game { } Ok(Game { - grid: grid, + grid, selected: None, spritebatch: SpriteBatch::new(image), }) } } -impl event::EventHandler for Game { - fn update(&mut self, context: &mut ggez::Context) -> ggez::GameResult { +impl EventHandler for Game { + fn update(&mut self, context: &mut Context) -> GameResult { for row in self.grid.iter_mut() { for cell in row.iter_mut() { cell.hover_off(); @@ -218,13 +217,13 @@ impl event::EventHandler for Game { fn mouse_button_down_event( &mut self, - _context: &mut ggez::Context, + _context: &mut Context, button: mouse::MouseButton, x: f32, y: f32, ) { if button == mouse::MouseButton::Left { - let position = Point2 { x: x, y: y }; + let position = Point2 { x, y }; for (i, row) in self.grid.iter_mut().enumerate() { for (j, cell) in row.iter_mut().enumerate() { if cell.contains(position) { @@ -238,7 +237,7 @@ impl event::EventHandler for Game { fn mouse_button_up_event( &mut self, - _context: &mut ggez::Context, + _context: &mut Context, button: mouse::MouseButton, x: f32, y: f32, @@ -251,19 +250,22 @@ impl event::EventHandler for Game { } if let Some(selected) = self.selected { - let position = Point2 { x: x, y: y }; + let position = Point2 { x, y }; let mut swap = None; for (i, row) in self.grid.iter_mut().enumerate() { for (j, cell) in row.iter_mut().enumerate() { - if cell.contains(position) { - if (i + 1 == selected.0) && (j == selected.1) { - swap = Some((i, j)); - } + if cell.contains(position) + && (((i + 1 == selected.0) && (j == selected.1)) + || ((i - 1 == selected.0) && (j == selected.1)) + || ((i == selected.0) && (j + 1 == selected.1)) + || ((i == selected.0) && (j - 1 == selected.1))) + { + swap = Some((i, j)); } } } if let Some((i, j)) = swap { - let clone = self.grid[i][j].occupant.clone(); + let clone = self.grid[i][j].occupant; self.grid[i][j].occupant = self.grid[selected.0][selected.1].occupant; self.grid[selected.0][selected.1].occupant = clone; self.selected = None; @@ -272,12 +274,12 @@ impl event::EventHandler for Game { } } - fn draw(&mut self, context: &mut ggez::Context) -> ggez::GameResult { + fn draw(&mut self, context: &mut Context) -> GameResult { graphics::clear(context, [0.1, 0.2, 0.3, 1.0].into()); for row in self.grid.iter() { for cell in row.iter() { - cell.draw(context, &mut self.spritebatch) + cell.draw(context, &mut self.spritebatch)?; } } @@ -290,9 +292,10 @@ impl event::EventHandler for Game { } } -pub fn main() -> ggez::GameResult { - let cb = ggez::ContextBuilder::new("super_simple", "ggez"); - let (context, event_loop) = &mut cb.add_resource_path("./resources").build()?; +pub fn main() -> GameResult { + let (ref mut context, ref mut event_loop) = ContextBuilder::new("gems", "jw&tb") + .add_resource_path("./resources") + .build()?; let game = &mut Game::new(context)?; event::run(context, event_loop, game) } |