From d543ab456521cee63bf53e1dbef8abd359af7a7d Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Wed, 13 Jan 2021 10:41:01 -0600 Subject: [PATCH] rudimentary circle-placing --- skin/hitcircleselect.png | Bin 0 -> 15375 bytes skin/hitcircleselect@2x.png | Bin 0 -> 36781 bytes src/game/mod.rs | 87 +++++++++++++++++++++++++++++++----- src/game/seeker.rs | 10 ++++- src/hitobject.rs | 1 + src/utils.rs | 5 +++ 6 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 skin/hitcircleselect.png create mode 100644 skin/hitcircleselect@2x.png diff --git a/skin/hitcircleselect.png b/skin/hitcircleselect.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d18df6f767c539abb09803e8d17a476ede2f87 GIT binary patch literal 15375 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, Spline>; +#[derive(Clone, Debug)] pub enum Tool { Select, Circle, @@ -338,7 +341,7 @@ impl Game { ]; self.skin.sliderb.draw_frame( ctx, - (cs_real * 2.0, cs_real * 2.0), + (cs_real * 1.8, cs_real * 1.8), DrawParam::default().dest(ball_pos).color(color), (travel_percent / 0.25) as usize, )?; @@ -361,9 +364,27 @@ impl Game { // draw whatever tool user is using let (mx, my) = self.mouse_pos; match self.tool { + Tool::Select => { + let (mx, my) = self.mouse_pos; + if let Some((dx, dy)) = self.left_drag_start { + if rect_contains(&PLAYFIELD_BOUNDS, dx, dy) { + let ax = dx.min(mx); + let ay = dy.min(my); + let bx = dx.max(mx); + let by = dy.max(my); + let drag_rect = Rect::new(ax, ay, bx - ax, by - ay); + let drag_rect = Mesh::new_rectangle( + ctx, + DrawMode::Stroke(StrokeOptions::default()), + drag_rect, + WHITE, + )?; + graphics::draw(ctx, &drag_rect, DrawParam::default())?; + } + } + } Tool::Circle => { - let b = PLAYFIELD_BOUNDS; - if mx > b.x && mx < b.x + b.h && my > b.y && my < b.y + b.h { + if rect_contains(&PLAYFIELD_BOUNDS, mx, my) { let pos = [mx, my]; let color = Color::new(1.0, 1.0, 1.0, 0.4); self.skin.hitcircle.draw( @@ -460,6 +481,56 @@ impl Game { } fn handle_click(&mut self, btn: MouseButton, x: f32, y: f32) -> Result<()> { + println!("handled click {}", self.song.is_some()); + if let Some(song) = &self.song { + println!("song exists! {:?} {:?}", btn, self.tool); + if let (MouseButton::Left, Tool::Select) = (btn, &self.tool) { + } else if let (MouseButton::Left, Tool::Circle) = (btn, &self.tool) { + println!("left, circle, {:?} {} {}", PLAYFIELD_BOUNDS, x, y); + if rect_contains(&PLAYFIELD_BOUNDS, x, y) { + let time = (song.position()? * 1000.0) as i32; + match self + .beatmap + .hit_objects + .binary_search_by_key(&time, |ho| ho.inner.start_time.0) + { + Ok(v) => { + println!("unfortunately already found at idx {}", v); + } + Err(idx) => { + use libosu::{ + hitobject::HitObject, + hitsounds::{Additions, SampleInfo}, + timing::TimestampMillis, + }; + + let pos_x = (x - PLAYFIELD_BOUNDS.x) / PLAYFIELD_BOUNDS.w * 512.0; + let pos_y = (y - PLAYFIELD_BOUNDS.y) / PLAYFIELD_BOUNDS.h * 384.0; + let inner = HitObject { + start_time: TimestampMillis(time), + pos: Point::new(pos_x as i32, pos_y as i32), + kind: HitObjectKind::Circle, + new_combo: false, + skip_color: 0, + additions: Additions::empty(), + sample_info: SampleInfo::default(), + timing_point: None, + }; + let new_obj = HitObjectExt { + inner, + stacking: 0, + color_idx: 0, + number: 0, + }; + println!("creating new hitobject: {:?}", new_obj); + self.beatmap.hit_objects.insert(idx, new_obj); + self.beatmap.compute_stacking(); + self.beatmap.compute_colors(&self.combo_colors); + } + } + } + } + } Ok(()) } } @@ -477,11 +548,7 @@ impl EventHandler for Game { match btn { MouseButton::Left => { use self::seeker::BOUNDS; - if x > BOUNDS.x - && x < BOUNDS.x + BOUNDS.w - && y > BOUNDS.y - && y < BOUNDS.y + BOUNDS.h - { + if rect_contains(&BOUNDS, x, y) { let jump_percent = (x - BOUNDS.x) / BOUNDS.w; if let Some(song) = &self.song { let pos = jump_percent as f64 * song.length().unwrap(); diff --git a/src/game/seeker.rs b/src/game/seeker.rs index 2a629d1..859e824 100644 --- a/src/game/seeker.rs +++ b/src/game/seeker.rs @@ -1,6 +1,6 @@ use anyhow::Result; use ggez::{ - graphics::{self, Color, DrawParam, Mesh, Rect}, + graphics::{self, Color, DrawMode, DrawParam, FillOptions, Mesh, Rect}, mint::Point2, Context, }; @@ -12,6 +12,14 @@ pub const BOUNDS: Rect = Rect::new(46.0, 732.0, 932.0, 36.0); impl Game { pub(super) fn draw_seeker(&self, ctx: &mut Context) -> Result<()> { + let rect = Mesh::new_rectangle( + ctx, + DrawMode::Fill(FillOptions::default()), + Rect::new(0.0, 732.0, 1024.0, 36.0), + Color::new(0.0, 0.0, 0.0, 0.7), + )?; + graphics::draw(ctx, &rect, DrawParam::default())?; + let line_y = BOUNDS.y + BOUNDS.h / 2.0; let line = Mesh::new_line( ctx, diff --git a/src/hitobject.rs b/src/hitobject.rs index 068ced8..b52bc9c 100644 --- a/src/hitobject.rs +++ b/src/hitobject.rs @@ -1,5 +1,6 @@ use libosu::hitobject::HitObject; +#[derive(Debug)] pub struct HitObjectExt { pub inner: HitObject, pub stacking: usize, diff --git a/src/utils.rs b/src/utils.rs index c2add81..e0df1f4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,7 @@ use std::path::{Path, PathBuf}; use anyhow::Result; +use ggez::graphics::Rect; pub fn fuck_you_windows( parent: impl AsRef, @@ -20,3 +21,7 @@ pub fn fuck_you_windows( Ok(None) } + +pub fn rect_contains(rect: &Rect, x: f32, y: f32) -> bool { + x >= rect.x && x <= rect.x + rect.w && y >= rect.y && y <= rect.y + rect.h +}