You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.8 KiB
58 lines
1.8 KiB
//! Gameboard controller
|
|
|
|
use piston::GenericEvent;
|
|
|
|
use crate::Gameboard;
|
|
|
|
pub struct GameboardController {
|
|
pub gameboard: Gameboard,
|
|
pub selected_cell: Option<[usize; 2]>,
|
|
cursor_pos: [f64; 2],
|
|
}
|
|
|
|
impl GameboardController {
|
|
pub fn new(gameboard: Gameboard) -> GameboardController {
|
|
GameboardController {
|
|
gameboard: gameboard,
|
|
selected_cell: None,
|
|
cursor_pos: [0.0; 2],
|
|
}
|
|
}
|
|
|
|
pub fn event<E: GenericEvent>(&mut self, pos: [f64; 2], size: f64, e: &E) {
|
|
use piston::input::{Button, Key, MouseButton};
|
|
|
|
if let Some(pos) = e.mouse_cursor_args() {
|
|
self.cursor_pos = pos;
|
|
}
|
|
|
|
if let Some(Button::Mouse(MouseButton::Left)) = e.press_args() {
|
|
let x = self.cursor_pos[0] - pos[0];
|
|
let y = self.cursor_pos[1] - pos[1];
|
|
|
|
if x >= 0.0 && x < size && y >= 0.0 && y < size {
|
|
let cell_x = (x / size * 9.0) as usize;
|
|
let cell_y = (y / size * 9.0) as usize;
|
|
self.selected_cell = Some([cell_x, cell_y]);
|
|
}
|
|
}
|
|
|
|
if let Some(Button::Keyboard(key)) = e.press_args() {
|
|
if let Some(ind) = self.selected_cell {
|
|
match key {
|
|
Key::D1 => self.gameboard.set(ind, 1),
|
|
Key::D2 => self.gameboard.set(ind, 2),
|
|
Key::D3 => self.gameboard.set(ind, 3),
|
|
Key::D4 => self.gameboard.set(ind, 4),
|
|
Key::D5 => self.gameboard.set(ind, 5),
|
|
Key::D6 => self.gameboard.set(ind, 6),
|
|
Key::D7 => self.gameboard.set(ind, 7),
|
|
Key::D8 => self.gameboard.set(ind, 8),
|
|
Key::D9 => self.gameboard.set(ind, 9),
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|