add digit tool
This commit is contained in:
parent
465b5c40d1
commit
fc6c66ff31
5 changed files with 130 additions and 65 deletions
158
src/main.rs
158
src/main.rs
|
@ -1,7 +1,7 @@
|
|||
use std::{fs::read_to_string, ops::Rem};
|
||||
|
||||
use marble_engine::{
|
||||
board::Board,
|
||||
board::{Board, Pos},
|
||||
tile::{Direction, GateType, MathOp, MirrorType, PTile, Tile, WireType},
|
||||
Machine,
|
||||
};
|
||||
|
@ -31,16 +31,16 @@ struct Game {
|
|||
time_since_step: f32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
#[derive(Debug, Clone)]
|
||||
enum Tool {
|
||||
None,
|
||||
SetTile(Tile),
|
||||
Digits(Option<Pos>),
|
||||
Math,
|
||||
Gate,
|
||||
Wire,
|
||||
Arrow,
|
||||
Mirror,
|
||||
Number,
|
||||
// SelectArea,
|
||||
}
|
||||
|
||||
|
@ -149,7 +149,7 @@ impl Game {
|
|||
}
|
||||
Tool::None => (),
|
||||
Tool::SetTile(_) => (),
|
||||
Tool::Number => (),
|
||||
Tool::Digits(_) => (),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -271,7 +271,7 @@ impl Game {
|
|||
texture_button(
|
||||
d,
|
||||
Vector2 {
|
||||
x: 300. + col as f32 * bound_offset - if col < 0 { 15. } else { 0. },
|
||||
x: 320. + col as f32 * bound_offset - if col < 0 { 15. } else { 0. },
|
||||
y: footer_top + 5. + row as f32 * bound_offset,
|
||||
},
|
||||
textures.get(texture),
|
||||
|
@ -281,7 +281,8 @@ impl Game {
|
|||
border,
|
||||
);
|
||||
};
|
||||
tool_button((0, -1), "eraser", Tool::SetTile(Tile::from_char(' ')));
|
||||
tool_button((0, -2), "eraser", Tool::SetTile(Tile::from_char(' ')));
|
||||
tool_button((0, -1), "digit_tool", Tool::Digits(None));
|
||||
tool_button((1, -1), "transparent", Tool::None);
|
||||
|
||||
tool_button((0, 0), "block", Tool::SetTile(Tile::from_char('#')));
|
||||
|
@ -325,63 +326,110 @@ impl Game {
|
|||
}
|
||||
|
||||
let mouse_pos = d.get_mouse_position();
|
||||
if self.sim_state == SimState::Editing && mouse_pos.y < footer_top {
|
||||
let tile_pos = (mouse_pos - self.view_offset) / (16 << self.zoom) as f32;
|
||||
let tile_pos = Vector2::new(tile_pos.x.floor(), tile_pos.y.floor());
|
||||
|
||||
let tile_screen_pos = tile_pos * (16 << self.zoom) as f32 + self.view_offset;
|
||||
|
||||
if self.active_tool != Tool::None {
|
||||
let tex = match self.active_tool {
|
||||
Tool::None => unreachable!(),
|
||||
Tool::SetTile(t) => {
|
||||
if t == Tile::Blank {
|
||||
"selection".into()
|
||||
} else {
|
||||
t.texture()
|
||||
}
|
||||
}
|
||||
Tool::Math => format!("{}_off", self.tool_menu_math.texture_name()),
|
||||
Tool::Gate => format!("{}_off", self.tool_menu_gate.texture_name()),
|
||||
Tool::Wire => format!("{}_off", self.tool_menu_wire.texture_name()),
|
||||
Tool::Arrow => self.tool_menu_arrow.arrow_texture_name().into(),
|
||||
Tool::Mirror => self.tool_menu_mirror.texture_name().into(),
|
||||
Tool::Number => todo!(),
|
||||
};
|
||||
|
||||
if self.sim_state == SimState::Editing {
|
||||
if let Tool::Digits(Some(pos)) = &mut self.active_tool {
|
||||
let tile_screen_pos = pos.to_vec() * (16 << self.zoom) as f32 + self.view_offset;
|
||||
d.draw_texture_ex(
|
||||
textures.get(&tex),
|
||||
textures.get("selection"),
|
||||
tile_screen_pos,
|
||||
0.,
|
||||
(1 << self.zoom) as f32,
|
||||
Color::new(255, 255, 255, 100),
|
||||
Color::new(255, 180, 20, 255),
|
||||
);
|
||||
for n in 0..10 {
|
||||
if d.is_key_pressed(unsafe { std::mem::transmute(KeyboardKey::KEY_ZERO as u32 + n) }) {
|
||||
self.source_board.set(*pos, Tile::Digit(n as u8));
|
||||
}
|
||||
}
|
||||
if d.is_key_pressed(KeyboardKey::KEY_LEFT) {
|
||||
pos.x -= 1;
|
||||
}
|
||||
if d.is_key_pressed(KeyboardKey::KEY_RIGHT) {
|
||||
pos.x += 1;
|
||||
}
|
||||
if d.is_key_pressed(KeyboardKey::KEY_UP) {
|
||||
pos.y -= 1;
|
||||
}
|
||||
if d.is_key_pressed(KeyboardKey::KEY_DOWN) {
|
||||
pos.y += 1;
|
||||
}
|
||||
}
|
||||
if d.is_mouse_button_down(MouseButton::MOUSE_BUTTON_LEFT) {
|
||||
match self.active_tool {
|
||||
Tool::None => (),
|
||||
Tool::SetTile(tile) => self.source_board.set(tile_pos.into(), tile),
|
||||
Tool::Math => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Math(self.tool_menu_math), false),
|
||||
),
|
||||
Tool::Gate => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Gate(self.tool_menu_gate), false),
|
||||
),
|
||||
Tool::Wire => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Wire(self.tool_menu_wire), false),
|
||||
),
|
||||
Tool::Arrow => self
|
||||
.source_board
|
||||
.set(tile_pos.into(), Tile::Arrow(self.tool_menu_arrow)),
|
||||
Tool::Mirror => self
|
||||
.source_board
|
||||
.set(tile_pos.into(), Tile::Mirror(self.tool_menu_mirror)),
|
||||
Tool::Number => todo!(),
|
||||
if mouse_pos.y < footer_top {
|
||||
let tile_pos = (mouse_pos - self.view_offset) / (16 << self.zoom) as f32;
|
||||
let tile_pos = Vector2::new(tile_pos.x.floor(), tile_pos.y.floor());
|
||||
|
||||
let tile_screen_pos = tile_pos * (16 << self.zoom) as f32 + self.view_offset;
|
||||
|
||||
if self.active_tool != Tool::None {
|
||||
let tex = match self.active_tool {
|
||||
Tool::None => unreachable!(),
|
||||
Tool::SetTile(t) => {
|
||||
if t == Tile::Blank {
|
||||
"selection".into()
|
||||
} else {
|
||||
t.texture()
|
||||
}
|
||||
}
|
||||
Tool::Math => format!("{}_off", self.tool_menu_math.texture_name()),
|
||||
Tool::Gate => format!("{}_off", self.tool_menu_gate.texture_name()),
|
||||
Tool::Wire => format!("{}_off", self.tool_menu_wire.texture_name()),
|
||||
Tool::Arrow => self.tool_menu_arrow.arrow_texture_name().into(),
|
||||
Tool::Mirror => self.tool_menu_mirror.texture_name().into(),
|
||||
Tool::Digits(_) => "selection".into(),
|
||||
};
|
||||
|
||||
d.draw_texture_ex(
|
||||
textures.get(&tex),
|
||||
tile_screen_pos,
|
||||
0.,
|
||||
(1 << self.zoom) as f32,
|
||||
Color::new(255, 255, 255, 100),
|
||||
);
|
||||
}
|
||||
if d.is_mouse_button_down(MouseButton::MOUSE_BUTTON_LEFT) {
|
||||
match self.active_tool {
|
||||
Tool::None => (),
|
||||
Tool::SetTile(tile) => self.source_board.set(tile_pos.into(), tile),
|
||||
Tool::Math => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Math(self.tool_menu_math), false),
|
||||
),
|
||||
Tool::Gate => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Gate(self.tool_menu_gate), false),
|
||||
),
|
||||
Tool::Wire => self.source_board.set(
|
||||
tile_pos.into(),
|
||||
Tile::Powerable(PTile::Wire(self.tool_menu_wire), false),
|
||||
),
|
||||
Tool::Arrow => self
|
||||
.source_board
|
||||
.set(tile_pos.into(), Tile::Arrow(self.tool_menu_arrow)),
|
||||
Tool::Mirror => self
|
||||
.source_board
|
||||
.set(tile_pos.into(), Tile::Mirror(self.tool_menu_mirror)),
|
||||
Tool::Digits(_pos) => {
|
||||
self.active_tool = Tool::Digits(Some(tile_pos.into()));
|
||||
if let Some(tile) = self.source_board.get_mut(tile_pos.into()) {
|
||||
if let Tile::Digit(_) = tile {
|
||||
} else {
|
||||
*tile = Tile::Digit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Tool{
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
match (self, other) {
|
||||
(Self::SetTile(l0), Self::SetTile(r0)) => l0 == r0,
|
||||
(Self::Digits(_), Self::Digits(_)) => true,
|
||||
_ => ::core::mem::discriminant(self) == ::core::mem::discriminant(other),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue