diff --git a/examples/basic/gfx.gif b/examples/basic/gfx.gif index 6c29528..50e4131 100644 Binary files a/examples/basic/gfx.gif and b/examples/basic/gfx.gif differ diff --git a/src/mapedit.rs b/src/mapedit.rs index 65efefe..7c96be0 100644 --- a/src/mapedit.rs +++ b/src/mapedit.rs @@ -16,6 +16,8 @@ use winit::{ window::WindowBuilder, }; +const SPR_CURSOR: usize = 0x01; + pub(crate) fn run_mapedit() { println!("running map edit"); @@ -34,6 +36,7 @@ pub(crate) fn run_mapedit() { gsa.reset_bgs(); gsa.reset_sprites(); + gsa.sprites[SPR_CURSOR].tile = 0x7308; let event_loop = EventLoop::new(); let size = LogicalSize::new(1280, 720); @@ -50,12 +53,16 @@ pub(crate) fn run_mapedit() { let mut surface = unsafe { softbuffer::Surface::new(&context, &window) }.unwrap(); window.request_redraw(); let mut mouse_pos = IVec2::ZERO; + let mut tile_pos = IVec2::ZERO; let mut left_down = false; let mut middle_down = false; + let mut right_down = false; event_loop.run(move |event, _, control_flow| { let mouse_pos = &mut mouse_pos; + let tile_pos = &mut tile_pos; let left_down = &mut left_down; let middle_down = &mut middle_down; + let right_down = &mut right_down; match event { Event::WindowEvent { event, .. } => match event { WindowEvent::KeyboardInput { @@ -81,6 +88,12 @@ pub(crate) fn run_mapedit() { (winit::event::ElementState::Released, winit::event::MouseButton::Middle) => { *middle_down = false; } + (winit::event::ElementState::Pressed, winit::event::MouseButton::Right) => { + *right_down = true; + } + (winit::event::ElementState::Released, winit::event::MouseButton::Right) => { + *right_down = false; + } _ => {} }, WindowEvent::CursorMoved { position, .. } => { @@ -95,16 +108,29 @@ pub(crate) fn run_mapedit() { gsa.bgs[2].scroll -= delta; } *mouse_pos = new_pos; + *tile_pos = (new_pos + gsa.bgs[0].scroll) / TILE_SIZE as i32; + let cursor_pos = *tile_pos * TILE_SIZE as i32 - gsa.bgs[0].scroll; + gsa.sprites[SPR_CURSOR].pos = cursor_pos; } _ => {} }, Event::MainEventsCleared => { if *left_down { - let tile_x = (mouse_pos.x + gsa.bgs[0].scroll.x) as usize / TILE_SIZE; - let tile_y = (mouse_pos.y + gsa.bgs[0].scroll.y) as usize / TILE_SIZE; - if tile_x < BACKGROUND_MAX_SIZE && tile_y < BACKGROUND_MAX_SIZE { - gsa.bgs[0].tiles[tile_x][tile_y] = 0; + if tile_pos.x >= 0 + && tile_pos.y >= 0 + && tile_pos.x < BACKGROUND_MAX_SIZE as i32 + && tile_pos.y < BACKGROUND_MAX_SIZE as i32 + { + gsa.bgs[0].tiles[tile_pos.x as usize][tile_pos.y as usize] = 0; + } + } else if *right_down { + if tile_pos.x >= 0 + && tile_pos.y >= 0 + && tile_pos.x < BACKGROUND_MAX_SIZE as i32 + && tile_pos.y < BACKGROUND_MAX_SIZE as i32 + { + gsa.bgs[0].tiles[tile_pos.x as usize][tile_pos.y as usize] = EMPTY_TILE; } }